diff --git a/.circleci/config.yml b/.circleci/config.yml index 07f29ff52..f826c8955 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -183,6 +183,26 @@ jobs: - jira/notify + app-beta-build: + docker: + - image: cimg/node:18.18.2 + resource_class: large + working_directory: ~/repo/client + + steps: + - checkout: + path: ~/repo + - run: + name: Install Dependencies + command: npm i + + - run: npm run build + + - aws-s3/sync: + from: build + to: "s3://imex-online-beta/" + - jira/notify + test-hasura-migrate: docker: - image: cimg/node:16.15.0 @@ -233,6 +253,27 @@ jobs: to: "s3://imex-online-test/" - jira/notify + test-app-beta-build: + docker: + - image: cimg/node:18.18.2 + resource_class: large + working_directory: ~/repo/client + + steps: + - checkout: + path: ~/repo + + - run: + name: Install Dependencies + command: npm i + + - run: npm run build:test + + - aws-s3/sync: + from: build + to: "s3://imex-online-test-beta/" + - jira/notify + admin-app-build: docker: - image: cimg/node:16.15.0 @@ -274,6 +315,10 @@ workflows: filters: branches: only: master + - app-beta-build: + filters: + branches: + only: master-beta - hasura-migrate: secret: ${HASURA_PROD_SECRET} filters: @@ -296,6 +341,10 @@ workflows: filters: branches: only: test + - test-app-beta-build: + filters: + branches: + only: test-beta - test-hasura-migrate: secret: ${HASURA_TEST_SECRET} filters: diff --git a/client/.npmrc b/client/.npmrc new file mode 100644 index 000000000..521a9f7c0 --- /dev/null +++ b/client/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/client/craco.config.js b/client/craco.config.js index b8967bc1e..ef305048d 100644 --- a/client/craco.config.js +++ b/client/craco.config.js @@ -2,72 +2,89 @@ const TerserPlugin = require("terser-webpack-plugin"); const CracoLessPlugin = require("craco-less"); const SentryWebpackPlugin = require("@sentry/webpack-plugin"); +const {convertLegacyToken} = require('@ant-design/compatible/lib'); +const {theme} = require('antd/lib'); + +const {defaultAlgorithm, defaultSeed} = theme; + +const mapToken = defaultAlgorithm(defaultSeed); +const v4Token = convertLegacyToken(mapToken); + module.exports = { - plugins: [ - { - plugin: SentryWebpackPlugin, - options: { - // sentry-cli configuration - authToken: - "6b45b028a02342db97a9a2f92c0959058665443d379d4a3a876430009e744260", - org: "snapt-software", - project: "rome-online", - release: process.env.REACT_APP_GIT_SHA, + plugins: [ + { + plugin: SentryWebpackPlugin, + options: { + // sentry-cli configuration + authToken: + "6b45b028a02342db97a9a2f92c0959058665443d379d4a3a876430009e744260", + org: "snapt-software", + project: "rome-online", + release: process.env.REACT_APP_GIT_SHA, - // webpack-specific configuration - include: ".", - ignore: ["node_modules", "webpack.config.js"], - }, - }, - { - plugin: CracoLessPlugin, - options: { - lessLoaderOptions: { - lessOptions: { - modifyVars: { - ...(process.env.NODE_ENV === "development" - ? { "@primary-color": "#B22234" } - : { - //"@primary-color": "#1DA57A" - }), - // "@primary-color": " #1890ff", // primary color for all components - // "@link-color": "#1890ff", // link color - // "@success-color": "#52c41a", // success state color - // "@warning-color": "#faad14", // warning state color - // "@error-color": "#f5222d", // error state color - // "@font-size-base": "14px", // major text font size - // " @heading-color": "rgba(0, 0, 0, 0.85)", // heading text color - // "@text-color": "rgba(0, 0, 0, 0.65)", // major text color - // "@text-color-secondary": "rgba(0, 0, 0, 0.45)", // secondary text color - // "@disabled-color": "rgba(0, 0, 0, 0.25)", // disable state color - // "@border-radius-base": "2px", // major border radius - // "@border-color-base": "#d9d9d9", // major border color - // "@box-shadow-base": - // "0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),0 9px 28px 8px rgba(0, 0, 0, 0.05); // major shadow for layers }", + // webpack-specific configuration + include: ".", + ignore: ["node_modules", "webpack.config.js"], }, - javascriptEnabled: true, - }, }, - }, - }, - ], - webpack: { - configure: (webpackConfig) => ({ - ...webpackConfig, - optimization: { - ...webpackConfig.optimization, - // Workaround for CircleCI bug caused by the number of CPUs shown - // https://github.com/facebook/create-react-app/issues/8320 - minimizer: webpackConfig.optimization.minimizer.map((item) => { - if (item instanceof TerserPlugin) { - item.options.parallel = 2; - } + { + plugin: CracoLessPlugin, + options: { + lessLoaderOptions: { + lessOptions: { + modifyVars: { + ...v4Token, + // TODO: This will no longer work in AntD 5.0 + ...(process.env.NODE_ENV === "development" + ? {"colorPrimary": "#B22234"} + : { + //"@primary-color": "#1DA57A" + }), + // "@primary-color": " #1890ff", // primary color for all components + // "@link-color": "#1890ff", // link color + // "@success-color": "#52c41a", // success state color + // "@warning-color": "#faad14", // warning state color + // "@error-color": "#f5222d", // error state color + // "@font-size-base": "14px", // major text font size + // " @heading-color": "rgba(0, 0, 0, 0.85)", // heading text color + // "@text-color": "rgba(0, 0, 0, 0.65)", // major text color + // "@text-color-secondary": "rgba(0, 0, 0, 0.45)", // secondary text color + // "@disabled-color": "rgba(0, 0, 0, 0.25)", // disable state color + // "@border-radius-base": "2px", // major border radius + // "@border-color-base": "#d9d9d9", // major border color + // "@box-shadow-base": + // "0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),0 9px 28px 8px rgba(0, 0, 0, 0.05); // major shadow for layers }", + }, + javascriptEnabled: true, + }, + }, + }, + }, + ], + webpack: { + configure: (webpackConfig) => { + return { + ...webpackConfig, + // Required for Dev Server + devServer: { + ...webpackConfig.devServer, + allowedHosts: 'all', + }, + optimization: { + ...webpackConfig.optimization, + // Workaround for CircleCI bug caused by the number of CPUs shown + // https://github.com/facebook/create-react-app/issues/8320 + minimizer: webpackConfig.optimization.minimizer.map((item) => { + if (item instanceof TerserPlugin) { + item.options.parallel = 2; + } - return item; - }), - }, - }), - }, - devtool: "source-map", + return item; + }), + }, + }; + }, + }, + devtool: "source-map", }; diff --git a/client/cypress.config.js b/client/cypress.config.js new file mode 100644 index 000000000..2f81c734b --- /dev/null +++ b/client/cypress.config.js @@ -0,0 +1,17 @@ +const { defineConfig } = require('cypress') + +module.exports = defineConfig({ + experimentalStudio: true, + env: { + FIREBASE_USERNAME: 'cypress@imex.test', + FIREBASE_PASSWORD: 'cypress', + }, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./cypress/plugins/index.js')(on, config) + }, + baseUrl: 'http://localhost:3000', + }, +}) diff --git a/client/cypress.json b/client/cypress.json deleted file mode 100644 index 29663f948..000000000 --- a/client/cypress.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "baseUrl": "http://localhost:3000", - "experimentalStudio": true, - "env": { - "FIREBASE_USERNAME": "cypress@imex.test", - "FIREBASE_PASSWORD": "cypress" - } -} diff --git a/client/cypress/integration/01-General Render/01-home.spec.js b/client/cypress/e2e/01-General Render/01-home.cy.js similarity index 100% rename from client/cypress/integration/01-General Render/01-home.spec.js rename to client/cypress/e2e/01-General Render/01-home.cy.js diff --git a/client/cypress/integration/1-getting-started/todo.spec.js b/client/cypress/e2e/1-getting-started/todo.cy.js similarity index 100% rename from client/cypress/integration/1-getting-started/todo.spec.js rename to client/cypress/e2e/1-getting-started/todo.cy.js diff --git a/client/cypress/integration/2-advanced-examples/actions.spec.js b/client/cypress/e2e/2-advanced-examples/actions.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/actions.spec.js rename to client/cypress/e2e/2-advanced-examples/actions.cy.js diff --git a/client/cypress/integration/2-advanced-examples/aliasing.spec.js b/client/cypress/e2e/2-advanced-examples/aliasing.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/aliasing.spec.js rename to client/cypress/e2e/2-advanced-examples/aliasing.cy.js diff --git a/client/cypress/integration/2-advanced-examples/assertions.spec.js b/client/cypress/e2e/2-advanced-examples/assertions.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/assertions.spec.js rename to client/cypress/e2e/2-advanced-examples/assertions.cy.js diff --git a/client/cypress/integration/2-advanced-examples/connectors.spec.js b/client/cypress/e2e/2-advanced-examples/connectors.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/connectors.spec.js rename to client/cypress/e2e/2-advanced-examples/connectors.cy.js diff --git a/client/cypress/integration/2-advanced-examples/cookies.spec.js b/client/cypress/e2e/2-advanced-examples/cookies.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/cookies.spec.js rename to client/cypress/e2e/2-advanced-examples/cookies.cy.js diff --git a/client/cypress/integration/2-advanced-examples/cypress_api.spec.js b/client/cypress/e2e/2-advanced-examples/cypress_api.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/cypress_api.spec.js rename to client/cypress/e2e/2-advanced-examples/cypress_api.cy.js diff --git a/client/cypress/integration/2-advanced-examples/files.spec.js b/client/cypress/e2e/2-advanced-examples/files.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/files.spec.js rename to client/cypress/e2e/2-advanced-examples/files.cy.js diff --git a/client/cypress/integration/2-advanced-examples/local_storage.spec.js b/client/cypress/e2e/2-advanced-examples/local_storage.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/local_storage.spec.js rename to client/cypress/e2e/2-advanced-examples/local_storage.cy.js diff --git a/client/cypress/integration/2-advanced-examples/location.spec.js b/client/cypress/e2e/2-advanced-examples/location.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/location.spec.js rename to client/cypress/e2e/2-advanced-examples/location.cy.js diff --git a/client/cypress/integration/2-advanced-examples/misc.spec.js b/client/cypress/e2e/2-advanced-examples/misc.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/misc.spec.js rename to client/cypress/e2e/2-advanced-examples/misc.cy.js diff --git a/client/cypress/integration/2-advanced-examples/navigation.spec.js b/client/cypress/e2e/2-advanced-examples/navigation.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/navigation.spec.js rename to client/cypress/e2e/2-advanced-examples/navigation.cy.js diff --git a/client/cypress/integration/2-advanced-examples/network_requests.spec.js b/client/cypress/e2e/2-advanced-examples/network_requests.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/network_requests.spec.js rename to client/cypress/e2e/2-advanced-examples/network_requests.cy.js diff --git a/client/cypress/integration/2-advanced-examples/querying.spec.js b/client/cypress/e2e/2-advanced-examples/querying.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/querying.spec.js rename to client/cypress/e2e/2-advanced-examples/querying.cy.js diff --git a/client/cypress/integration/2-advanced-examples/spies_stubs_clocks.spec.js b/client/cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/spies_stubs_clocks.spec.js rename to client/cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js diff --git a/client/cypress/integration/2-advanced-examples/traversal.spec.js b/client/cypress/e2e/2-advanced-examples/traversal.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/traversal.spec.js rename to client/cypress/e2e/2-advanced-examples/traversal.cy.js diff --git a/client/cypress/integration/2-advanced-examples/utilities.spec.js b/client/cypress/e2e/2-advanced-examples/utilities.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/utilities.spec.js rename to client/cypress/e2e/2-advanced-examples/utilities.cy.js diff --git a/client/cypress/integration/2-advanced-examples/viewport.spec.js b/client/cypress/e2e/2-advanced-examples/viewport.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/viewport.spec.js rename to client/cypress/e2e/2-advanced-examples/viewport.cy.js diff --git a/client/cypress/integration/2-advanced-examples/waiting.spec.js b/client/cypress/e2e/2-advanced-examples/waiting.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/waiting.spec.js rename to client/cypress/e2e/2-advanced-examples/waiting.cy.js diff --git a/client/cypress/integration/2-advanced-examples/window.spec.js b/client/cypress/e2e/2-advanced-examples/window.cy.js similarity index 100% rename from client/cypress/integration/2-advanced-examples/window.spec.js rename to client/cypress/e2e/2-advanced-examples/window.cy.js diff --git a/client/cypress/support/index.js b/client/cypress/support/e2e.js similarity index 100% rename from client/cypress/support/index.js rename to client/cypress/support/e2e.js diff --git a/client/licenses.txt b/client/licenses.txt index dd30e85e7..30a972ca6 100644 --- a/client/licenses.txt +++ b/client/licenses.txt @@ -8872,13 +8872,13 @@ │ ├─ email: luis@luisrudge.net │ ├─ path: /Users/pfic/Documents/Development/bodyshop/client/node_modules/postcss-flexbugs-fixes │ └─ licenseFile: /Users/pfic/Documents/Development/bodyshop/client/node_modules/postcss-flexbugs-fixes/LICENSE -├─ postcss-focus-visible@4.0.0 +├─ postcss-focus-open@4.0.0 │ ├─ licenses: CC0-1.0 -│ ├─ repository: https://github.com/jonathantneal/postcss-focus-visible +│ ├─ repository: https://github.com/jonathantneal/postcss-focus-open │ ├─ publisher: Jonathan Neal │ ├─ email: jonathantneal@hotmail.com -│ ├─ path: /Users/pfic/Documents/Development/bodyshop/client/node_modules/postcss-focus-visible -│ └─ licenseFile: /Users/pfic/Documents/Development/bodyshop/client/node_modules/postcss-focus-visible/LICENSE.md +│ ├─ path: /Users/pfic/Documents/Development/bodyshop/client/node_modules/postcss-focus-open +│ └─ licenseFile: /Users/pfic/Documents/Development/bodyshop/client/node_modules/postcss-focus-open/LICENSE.md ├─ postcss-focus-within@3.0.0 │ ├─ licenses: CC0-1.0 │ ├─ repository: https://github.com/jonathantneal/postcss-focus-within diff --git a/client/package-lock.json b/client/package-lock.json index 0409aecde..f3de2acfc 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,143 +8,192 @@ "name": "bodyshop", "version": "0.2.1", "dependencies": { - "@apollo/client": "^3.7.9", + "@ant-design/compatible": "^5.1.2", + "@ant-design/pro-layout": "^7.17.16", + "@apollo/client": "^3.8.10", "@asseinfo/react-kanban": "^2.2.0", - "@craco/craco": "^7.0.0", - "@fingerprintjs/fingerprintjs": "^3.4.2", + "@craco/craco": "^7.1.0", + "@fingerprintjs/fingerprintjs": "^4.2.1", "@jsreport/browser-client": "^3.1.0", - "@sentry/react": "^7.40.0", - "@sentry/tracing": "^7.40.0", - "@splitsoftware/splitio-react": "^1.8.1", - "@tanem/react-nprogress": "^5.0.8", - "antd": "^4.24.8", + "@reduxjs/toolkit": "^2.0.1", + "@sentry/react": "^7.93.0", + "@sentry/tracing": "^7.93.0", + "@splitsoftware/splitio-react": "^1.11.0", + "@tanem/react-nprogress": "^5.0.51", + "antd": "^5.12.8", "apollo-link-logger": "^2.0.1", - "axios": "^1.3.4", - "craco-less": "^2.0.0", + "axios": "^1.6.5", + "craco-less": "^3.0.1", + "dayjs": "^1.11.10", + "dayjs-business-days2": "^1.2.2", "dinero.js": "^1.9.1", - "dotenv": "^16.0.1", + "dotenv": "^16.3.1", "enquire-js": "^0.2.1", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "firebase": "^9.17.1", + "firebase": "^10.7.2", "graphql": "^16.6.0", - "i18next": "^22.4.10", - "i18next-browser-languagedetector": "^7.0.1", - "jsoneditor": "^9.9.0", + "i18next": "^23.7.16", + "i18next-browser-languagedetector": "^7.0.2", + "jsoneditor": "^10.0.0", "jsreport-browser-client-dist": "^1.3.0", - "libphonenumber-js": "^1.10.21", - "logrocket": "^3.0.1", - "markerjs2": "^2.28.1", - "moment-business-days": "^1.2.0", - "moment-timezone": "^0.5.41", + "libphonenumber-js": "^1.10.53", + "logrocket": "^7.0.0", + "markerjs2": "^2.31.4", "normalize-url": "^8.0.0", - "phone": "^3.1.35", + "phone": "^3.1.42", "preval.macro": "^5.0.0", "prop-types": "^15.8.1", - "query-string": "^7.1.3", + "query-string": "^8.1.0", "rc-queue-anim": "^2.0.0", "rc-scroll-anim": "^2.7.6", - "react": "^17.0.2", - "react-big-calendar": "^1.6.8", + "react": "^18.2.0", + "react-big-calendar": "^1.8.6", "react-color": "^2.19.3", - "react-cookie": "^4.1.1", - "react-dom": "^17.0.2", - "react-drag-listview": "^0.2.1", + "react-cookie": "^7.0.1", + "react-dom": "^18.2.0", + "react-drag-listview": "^2.0.0", "react-grid-gallery": "^1.0.0", - "react-grid-layout": "^1.3.4", - "react-i18next": "^12.2.0", - "react-icons": "^4.7.1", + "react-grid-layout": "1.3.4", + "react-i18next": "^14.0.0", + "react-icons": "^5.0.1", "react-image-lightbox": "^5.1.4", - "react-intersection-observer": "^9.4.3", - "react-number-format": "^5.1.3", - "react-redux": "^8.0.5", - "react-resizable": "^3.0.4", - "react-router-dom": "^5.3.0", + "react-intersection-observer": "^9.5.3", + "react-number-format": "^5.1.4", + "react-redux": "^9.1.0", + "react-resizable": "^3.0.5", + "react-router-dom": "^6.21.3", "react-scripts": "^5.0.1", "react-sticky": "^6.0.3", "react-sublime-video": "^0.2.5", - "react-virtualized": "^9.22.3", - "recharts": "^2.4.3", - "redux": "^4.2.1", + "react-virtualized": "^9.22.5", + "recharts": "^2.10.4", + "redux": "^5.0.1", "redux-persist": "^6.0.0", - "redux-saga": "^1.2.2", + "redux-saga": "^1.3.0", "redux-state-sync": "^3.1.4", - "reselect": "^4.1.7", - "sass": "^1.58.3", - "socket.io-client": "^4.6.1", - "styled-components": "^5.3.6", + "reselect": "^5.1.0", + "sass": "^1.70.0", + "socket.io-client": "^4.7.4", + "styled-components": "^6.1.8", "subscriptions-transport-ws": "^0.11.0", - "web-vitals": "^2.1.4", - "workbox-background-sync": "^6.5.3", - "workbox-broadcast-update": "^6.5.3", - "workbox-cacheable-response": "^6.5.3", - "workbox-core": "^6.5.3", - "workbox-expiration": "^6.5.3", - "workbox-google-analytics": "^6.5.3", - "workbox-navigation-preload": "^6.5.3", - "workbox-precaching": "^6.5.3", - "workbox-range-requests": "^6.5.3", - "workbox-routing": "^6.5.3", - "workbox-strategies": "^6.5.3", - "workbox-streams": "^6.5.3", + "terser-webpack-plugin": "^5.3.10", + "web-vitals": "^3.5.1", + "workbox-core": "^7.0.0", + "workbox-expiration": "^7.0.0", + "workbox-navigation-preload": "^7.0.0", + "workbox-precaching": "^7.0.0", + "workbox-routing": "^7.0.0", + "workbox-strategies": "^7.0.0", "yauzl": "^2.10.0" }, "devDependencies": { - "@sentry/webpack-plugin": "^1.20.0", - "@testing-library/cypress": "^8.0.3", - "cypress": "^10.3.1", - "eslint-plugin-cypress": "^2.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@sentry/webpack-plugin": "^2.10.2", + "@testing-library/cypress": "^10.0.1", + "cypress": "^13.6.3", + "eslint-plugin-cypress": "^2.15.1", "react-error-overlay": "6.0.11", "redux-logger": "^3.0.6", - "source-map-explorer": "^2.5.2" + "source-map-explorer": "^2.5.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "license": "Apache-2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "license": "MIT", + "node_modules/@ant-design/colors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", + "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "@ctrl/tinycolor": "^3.6.1" } }, - "node_modules/@ant-design/colors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", - "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "license": "MIT", + "node_modules/@ant-design/compatible": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/compatible/-/compatible-5.1.2.tgz", + "integrity": "sha512-PcNV6hCrlx1JnKBjC148BjJNM3XLVSEER422SOk/HRVD8rm8ZovItlZrQOoO3WH5L4jqwj5gxQap2cqSnmQaTg==", "dependencies": { - "@ctrl/tinycolor": "^3.4.0" + "classnames": "^2.2.6", + "dayjs": "^1.11.4", + "lodash.camelcase": "^4.3.0", + "lodash.upperfirst": "^4.3.1", + "rc-animate": "^3.1.1", + "rc-form": "^2.4.12", + "rc-util": "^5.24.5" + }, + "peerDependencies": { + "antd": "^5.0.1", + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, + "node_modules/@ant-design/css-animation": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@ant-design/css-animation/-/css-animation-1.7.3.tgz", + "integrity": "sha512-LrX0OGZtW+W6iLnTAqnTaoIsRelYeuLZWsrmBJFUXDALQphPsN8cE5DCsmoSlL0QYb94BQxINiuS70Ar/8BNgA==" + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.18.2.tgz", + "integrity": "sha512-514V9rjLaFYb3v4s55/8bg2E6fb81b99s3crDZf4nSwtiDLLXs8axnIph+q2TVkY2hbJPZOn/cVsVcnLkzFy7w==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs/node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/@ant-design/icons": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.7.0.tgz", - "integrity": "sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==", - "license": "MIT", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.2.6.tgz", + "integrity": "sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw==", "dependencies": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons-svg": "^4.2.1", + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.3.0", "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "rc-util": "^5.9.4" + "rc-util": "^5.31.1" }, "engines": { "node": ">=8" @@ -155,40 +204,116 @@ } }, "node_modules/@ant-design/icons-svg": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", - "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==", - "license": "MIT" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "node_modules/@ant-design/pro-layout": { + "version": "7.17.19", + "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.17.19.tgz", + "integrity": "sha512-X3L+/0Vro9AyN51oGBMz+bfjHjod43wyMJ+7gePiK8ECqYTMZLWGXhrEZnPMY/GCdk0OeGzWD5N9DFuUtwcSLQ==", + "dependencies": { + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-provider": "2.13.5", + "@ant-design/pro-utils": "2.15.4", + "@babel/runtime": "^7.18.0", + "@umijs/route-utils": "^4.0.0", + "@umijs/use-params": "^1.0.9", + "classnames": "^2.3.2", + "lodash.merge": "^4.6.2", + "omit.js": "^2.0.2", + "path-to-regexp": "2.4.0", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.0.6", + "swr": "^2.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "antd": "^4.24.15 || ^5.11.2", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@ant-design/pro-provider": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.13.5.tgz", + "integrity": "sha512-ZVmzY2cq4nUvgmAlfgyCAaSZYV2l3n/upIQPXPj8sYcT+N/Pt1CeSVkkgW6By3EqokF6apWdIFU7hZMK2rNhrg==", + "dependencies": { + "@ant-design/cssinjs": "^1.11.1", + "@babel/runtime": "^7.18.0", + "@ctrl/tinycolor": "^3.4.0", + "rc-util": "^5.0.1", + "swr": "^2.0.0" + }, + "peerDependencies": { + "antd": "^4.24.15 || ^5.11.2", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@ant-design/pro-utils": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.4.tgz", + "integrity": "sha512-nbacIMl5lbMlNHlaPl2tt/ezvHhnBtGL2KLVaqijLou5zAuZprkHAJnckXoqm9T6X9R2rE4jH96WZHLpJ27nFw==", + "dependencies": { + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-provider": "2.13.5", + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "dayjs": "^1.11.10", + "lodash.merge": "^4.6.2", + "rc-util": "^5.0.6", + "safe-stable-stringify": "^2.4.3", + "swr": "^2.0.0" + }, + "peerDependencies": { + "antd": "^4.24.15 || ^5.11.2", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } }, "node_modules/@ant-design/react-slick": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", - "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", "dependencies": { "@babel/runtime": "^7.10.4", "classnames": "^2.2.5", "json2mq": "^0.2.0", - "lodash": "^4.17.21", - "resize-observer-polyfill": "^1.5.1" + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" }, "peerDependencies": { "react": ">=16.9.0" } }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, "node_modules/@apollo/client": { - "version": "3.7.9", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.9.tgz", - "integrity": "sha512-YnJvrJOVWrp4y/zdNvUaM8q4GuSHCEIecsRDTJhK/veT33P/B7lfqGJ24NeLdKMj8tDEuXYF7V0t+th4+rgC+Q==", - "license": "MIT", + "version": "3.8.10", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.8.10.tgz", + "integrity": "sha512-p/22RZ8ehHyvySnC20EHPPe0gdu8Xp6ZCiXOfdEe1ZORw5cUteD/TLc66tfKv8qu8NLIfbiWoa+6s70XnKvxqg==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", - "@wry/context": "^0.7.0", - "@wry/equality": "^0.5.0", - "@wry/trie": "^0.3.0", + "@wry/equality": "^0.5.6", + "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.16.1", + "optimism": "^0.18.0", "prop-types": "^15.7.2", "response-iterator": "^0.2.6", "symbol-observable": "^4.0.0", @@ -218,20 +343,10 @@ } } }, - "node_modules/@apollo/client/node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/@asseinfo/react-kanban": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@asseinfo/react-kanban/-/react-kanban-2.2.0.tgz", "integrity": "sha512-/gCigrNXRHeP9VCo8RipTOrA0vAPRIOThJhR4ibVxe6BLkaWFUEuJ1RMT4fODpRRsE3XsdrfVGKkfpRBKgvxXg==", - "license": "MIT", "dependencies": { "react-beautiful-dnd": "^13.0.0" }, @@ -241,47 +356,101 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -291,21 +460,28 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, @@ -313,18 +489,24 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", "engines": { "node": ">=10" } }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -333,107 +515,73 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "license": "MIT", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", + "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -442,14 +590,22 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "license": "MIT", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -458,143 +614,127 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", - "license": "MIT", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "license": "MIT", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "license": "MIT", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "license": "MIT", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "license": "MIT", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -604,121 +744,111 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", - "license": "MIT", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "license": "MIT", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "license": "MIT", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "license": "MIT", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", - "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", - "license": "MIT", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dependencies": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "license": "MIT", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -729,7 +859,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -741,7 +870,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -755,7 +883,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -763,14 +890,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -779,7 +904,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -788,10 +912,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -800,12 +923,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -815,14 +937,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -831,29 +952,26 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "license": "MIT", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "license": "MIT", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -865,98 +983,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.9.tgz", - "integrity": "sha512-KD7zDNaD14CRpjQjVbV4EnH9lsKYlcpUrhZH37ei2IY+AlXrfAPy5pTmRUE4X6X1k8EsKXPraykxeaogqQvSGA==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.6.tgz", + "integrity": "sha512-D7Ccq9LfkBFnow3azZGJvZYgcfeqAw3I1e5LoTpj6UKIFQilh8yqXsIGcRIqbBdsPWIz+Ze7ZZfggSj62Qp+Fg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -969,7 +1006,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "license": "MIT", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -985,7 +1022,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "license": "MIT", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -997,49 +1034,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "license": "MIT", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1053,7 +1055,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "license": "MIT", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1066,14 +1068,15 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "license": "MIT", + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1083,27 +1086,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1115,7 +1101,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1127,7 +1112,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1139,7 +1123,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1151,12 +1134,11 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", - "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1169,7 +1151,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1181,7 +1162,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -1190,12 +1170,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1205,12 +1184,25 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1223,7 +1215,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1235,7 +1226,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1244,12 +1234,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1262,7 +1251,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1274,7 +1262,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1286,7 +1273,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1298,7 +1284,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1310,7 +1295,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1322,7 +1306,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1334,7 +1317,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1349,7 +1331,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1361,334 +1342,23 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz", - "integrity": "sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-flow": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1700,13 +1370,481 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "license": "MIT", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1716,13 +1854,43 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1732,12 +1900,43 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1747,12 +1946,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1762,12 +1960,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz", - "integrity": "sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1777,12 +1974,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1792,16 +1988,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", - "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", - "license": "MIT", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -1811,12 +2006,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1826,13 +2020,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1842,13 +2035,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1858,12 +2050,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1873,17 +2064,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz", - "integrity": "sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz", + "integrity": "sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1892,13 +2082,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1908,13 +2105,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1924,12 +2120,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1939,12 +2134,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1954,12 +2148,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1969,14 +2162,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz", - "integrity": "sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-typescript": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1986,12 +2179,26 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2001,13 +2208,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2016,39 +2222,42 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", - "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", - "license": "MIT", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", + "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2058,45 +2267,61 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2105,34 +2330,49 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "license": "MIT", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2142,14 +2382,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2161,63 +2402,67 @@ "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "license": "MIT" + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "license": "MIT", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", - "debug": "^4.1.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2227,25 +2472,22 @@ "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "license": "MIT" + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" } }, "node_modules/@craco/craco": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-7.0.0.tgz", - "integrity": "sha512-OyjL9zpURB6Ha1HO62Hlt27Xd7UYJ8DRiBNuE4DBB8Ue0iQ9q/xsv3ze7ROm6gCZqV6I2Gxjnq0EHCCye+4xDQ==", - "license": "Apache-2.0", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-7.1.0.tgz", + "integrity": "sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==", "dependencies": { "autoprefixer": "^10.4.12", "cosmiconfig": "^7.0.1", @@ -2265,26 +2507,10 @@ "react-scripts": "^5.0.0" } }, - "node_modules/@craco/craco/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2296,7 +2522,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2305,14 +2530,12 @@ "node_modules/@csstools/normalize.css": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", - "license": "CC0-1.0" + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" @@ -2332,7 +2555,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2352,7 +2574,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2371,7 +2592,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2390,7 +2610,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2410,7 +2629,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -2430,7 +2648,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2449,7 +2666,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2468,7 +2684,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2488,7 +2703,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2503,7 +2717,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2522,7 +2735,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2541,7 +2753,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2560,7 +2771,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -2573,10 +2783,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", - "license": "CC0-1.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2585,25 +2794,22 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4", "postcss-selector-parser": "^6.0.10" } }, "node_modules/@ctrl/tinycolor": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz", - "integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==", - "license": "MIT", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "engines": { "node": ">=10" } }, "node_modules/@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -2618,9 +2824,9 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "6.10.4", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", + "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -2633,7 +2839,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -2643,14 +2848,13 @@ "node": ">= 0.12" } }, - "node_modules/@cypress/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/@cypress/request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@cypress/xvfb": { @@ -2658,7 +2862,6 @@ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.1.0", "lodash.once": "^4.1.1" @@ -2669,47 +2872,63 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, "node_modules/@emotion/is-prop-valid": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.3.tgz", - "integrity": "sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dependencies": { - "@emotion/memoize": "^0.7.4" + "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==", - "license": "MIT" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "license": "MIT" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "license": "MIT" + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", - "license": "MIT", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2727,29 +2946,21 @@ "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "license": "MIT", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2757,33 +2968,50 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", - "license": "MIT", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@fingerprintjs/fingerprintjs": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-3.4.2.tgz", - "integrity": "sha512-3Ncze6JsJpB7BpYhqIgvBpfvEX1jsEKrad5hQBpyRQxtoAp6hx3+R46zqfsuQG4D9egQZ+xftQ0u4LPFMB7Wmg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-4.2.1.tgz", + "integrity": "sha512-uW+GVUNTgCXbVPEbgnbf5Aor22e1dyYR0JRwdUiZBaikfxr7KlhV9y0aahA1FB99fEeQVvhCEvTcPIFSYTy9Pw==", "dependencies": { "tslib": "^2.4.1" } }, "node_modules/@firebase/analytics": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.9.3.tgz", - "integrity": "sha512-XdYHBi6RvHYVAHGyLxXX0uRPwZmGeqw1JuWS1rMEeRF/jvbxnrL81kcFAHZVRkEvG9bXAJgL2fX9wmDo3e622w==", - "license": "Apache-2.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/installations": "0.6.3", + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2791,15 +3019,14 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.3.tgz", - "integrity": "sha512-HmvbB4GMgh8AUlIDIo/OuFENLCGRXxMvtOueK+m8+DcfqBvG+mkii0Mi9ovo0TnMM62cy3oBYG7PHdjIQNLSLA==", - "license": "Apache-2.0", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", "dependencies": { - "@firebase/analytics": "0.9.3", + "@firebase/analytics": "0.10.0", "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.3", - "@firebase/util": "1.9.2", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2809,31 +3036,28 @@ "node_modules/@firebase/analytics-types": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==", - "license": "Apache-2.0" + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" }, "node_modules/@firebase/app": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.3.tgz", - "integrity": "sha512-G79JUceVDaHRZ4WkA11GyVldVXhdyRJRwWVQFFvAAVfQJLvy2TA6lQjeUn28F6FmeUWxDGwPC30bxCRWq7Op8Q==", - "license": "Apache-2.0", + "version": "0.9.26", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.26.tgz", + "integrity": "sha512-zCjo6KhNhbuFB+V+Z4H9g4+BZ78E7n3ShxaBtuIcRkpwdm7+1BsafzChOsDYuI86m97HUWsyLPurLBhqcupFFA==", "dependencies": { - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", - "idb": "7.0.1", + "@firebase/util": "1.9.3", + "idb": "7.1.1", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-check": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.6.3.tgz", - "integrity": "sha512-T9f9ceFLs7x4D2T6whu5a6j7B3qPuYHiZHZxW6DkMh/FoMmRA4/q/HVyu01i9+LyJJx2Xdo6eCcj6ofs9YZjqA==", - "license": "Apache-2.0", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.1.tgz", + "integrity": "sha512-zi3vbM5tb/eGRWyiqf+1DXbxFu9Q07dnm46rweodgUpH9B8svxYkHfNwYWx7F5mjHU70SQDuaojH1We5ws9OKA==", "dependencies": { - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2841,16 +3065,15 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.3.tgz", - "integrity": "sha512-25AQ4W7WUL8OWas40GsABuNU622Dm1ojbfeZ03uKtLj5Af7FerJ25u7zkgm+11pc6rpr5v8E5oxEG9vmNRndEA==", - "license": "Apache-2.0", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.8.tgz", + "integrity": "sha512-EaETtChR4UgMokJFw+r6jfcIyCTUZSe0a6ivF37D9MxlG9G3wzK1COyXgxoX96GzXmDPc2aubX4PxCrdVHhrnA==", "dependencies": { - "@firebase/app-check": "0.6.3", + "@firebase/app-check": "0.8.1", "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2858,64 +3081,64 @@ } }, "node_modules/@firebase/app-check-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.2.0.tgz", - "integrity": "sha512-+3PQIeX6/eiVK+x/yg8r6xTNR97fN7MahFDm+jiQmDjcyvSefoGuTTNQuuMScGyx3vYUBeZn+Cp9kC0yY/9uxQ==", - "license": "Apache-2.0" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" }, "node_modules/@firebase/app-check-types": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==", - "license": "Apache-2.0" + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" }, "node_modules/@firebase/app-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.3.tgz", - "integrity": "sha512-sX6rD1KFX6K2CuCnQvc9jZLOgAFZ+sv2jKKahIl4SbTM561D682B8n4Jtx/SgDrvcTVTdb05g4NhZOws9hxYxA==", - "license": "Apache-2.0", + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.26.tgz", + "integrity": "sha512-tVNOYvB3lIFkN3RmcTieo5qYRIkYak9iC6E7dZMxax52uMIUJiIKKtPkarbwZh6EnUxru5hJRo8tfUZGuaQDQw==", "dependencies": { - "@firebase/app": "0.9.3", - "@firebase/component": "0.6.3", + "@firebase/app": "0.9.26", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-types": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", - "license": "Apache-2.0" + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" }, "node_modules/@firebase/auth": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.21.3.tgz", - "integrity": "sha512-HPbcwgArLBVTowFcn4qaQr6LCx7BidI9yrQ5MRbQNv4PsgK/3UGpzCYaNPPbvgr9fe+0jNdJO+uC0+dk4xIzCQ==", - "license": "Apache-2.0", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.5.1.tgz", + "integrity": "sha512-sVi7rq2YneLGJFqHa5S6nDfCHix9yuVV3RLhj/pWPlB4a36ofXal4E6PJwpeMc8uLjWEr1aovYN1jkXWNB6Avw==", "dependencies": { - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } } }, "node_modules/@firebase/auth-compat": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.3.3.tgz", - "integrity": "sha512-9asUuGtkzUVELH3LYXdiom1nVVV9bqEPqzHohanoofHL/oVTNcHZ4AQ5CXjNATfb6c1WH32U+nEuPiYg26UUIw==", - "license": "Apache-2.0", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.1.tgz", + "integrity": "sha512-rgDZnrDoekRvtzXVji8Z61wxxkof6pTkjYEkybILrjM8tGP9tx4xa9qGpF4ax3AzF+rKr7mIa9NnoXEK4UNqmQ==", "dependencies": { - "@firebase/auth": "0.21.3", + "@firebase/auth": "1.5.1", "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.3", - "@firebase/util": "1.9.2", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" }, "peerDependencies": { "@firebase/app-compat": "0.x" @@ -2924,81 +3147,75 @@ "node_modules/@firebase/auth-interop-types": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==", - "license": "Apache-2.0" + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" }, "node_modules/@firebase/auth-types": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/component": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.3.tgz", - "integrity": "sha512-rnhq5SOsB5nuJphZF50iwqnBiuuyg9kdnlUn1rBrKfu7/cUVJZF5IG1cWrL0rXXyiZW1WBI/J2pmTvVO8dStGQ==", - "license": "Apache-2.0", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", "dependencies": { - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "node_modules/@firebase/database": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.3.tgz", - "integrity": "sha512-J76W6N7JiVkLaAtPyjaGRkrsIu9pi6iZikuGGtGjqvV19vkn7oiL4Hbo5uTYCMd4waTUWoL9iI08eX184W+5GQ==", - "license": "Apache-2.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.2.tgz", + "integrity": "sha512-8X6NBJgUQzDz0xQVaCISoOLINKat594N2eBbMR3Mu/MH/ei4WM+aAMlsNzngF22eljXu1SILP5G3evkyvsG3Ng==", "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.3.tgz", - "integrity": "sha512-r+L9jTbvsnb7sD+xz6UKU39DgBWqB2pyjzPNdBeriGC9Ssa2MAZe0bIqjCQg51RRXYc/aa/zK1Q2/4uesZeVgQ==", - "license": "Apache-2.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.2.tgz", + "integrity": "sha512-09ryJnXDvuycsxn8aXBzLhBTuCos3HEnCOBWY6hosxfYlNCGnLvG8YMlbSAt5eNhf7/00B095AEfDsdrrLjxqA==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/database": "0.14.3", - "@firebase/database-types": "0.10.3", + "@firebase/component": "0.6.4", + "@firebase/database": "1.0.2", + "@firebase/database-types": "1.0.0", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-types": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.3.tgz", - "integrity": "sha512-Hu34CDhHYZsd2eielr0jeaWrTJk8Hz0nd7WsnYDnXtQX4i49ppgPesUzPdXVBdIBLJmT0ZZRvT7qWHknkOT+zg==", - "license": "Apache-2.0", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", + "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", "dependencies": { "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.2" + "@firebase/util": "1.9.3" } }, "node_modules/@firebase/firestore": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.8.3.tgz", - "integrity": "sha512-4xR3Mqj95bxHg3hZnz0O+LQrHkjq+siT2y+B9da6u68qJ8bzzT42JaFgd1vifhbBpVbBzpFaS2RuCq2E+kGv9g==", - "license": "Apache-2.0", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.1.tgz", + "integrity": "sha512-LCWZZ+rgNET1qw3vpugmGCJZVbz7c5NkgKect5pZn36gaBzGVb8+pRQ8WSZ1veYVMOK6SKrBkS1Rw6EqcmPnyw==", "dependencies": { - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", - "@firebase/webchannel-wrapper": "0.9.0", - "@grpc/grpc-js": "~1.7.0", - "@grpc/proto-loader": "^0.6.13", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/util": "1.9.3", + "@firebase/webchannel-wrapper": "0.10.5", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.26.5" }, "engines": { "node": ">=10.10.0" @@ -3008,15 +3225,14 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.3.tgz", - "integrity": "sha512-fMTsSC0s2cF5w2+JoB0dWD/o4kXtLrUCPGnZPuz4S0bqTN2t0vHr3gdAsQLtnadgwB78ACtinYmf4Udwx7TzDg==", - "license": "Apache-2.0", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.24.tgz", + "integrity": "sha512-Wj5cgqmQwTnqHS4KabOpXCNIaSTtVDP1NitnhjXff04Q4QK0aeIbeO1TPlSSTmUb6S7KzoKD4XR99hfKZDYbfA==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/firestore": "3.8.3", - "@firebase/firestore-types": "2.5.1", - "@firebase/util": "1.9.2", + "@firebase/component": "0.6.4", + "@firebase/firestore": "4.4.1", + "@firebase/firestore-types": "3.0.0", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3024,43 +3240,40 @@ } }, "node_modules/@firebase/firestore-types": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", - "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", - "license": "Apache-2.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/functions": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.9.3.tgz", - "integrity": "sha512-tPJgYY2ROQSYuzvgxZRoHeDj+Ic07/bWHwaftgTriawtupmFOkt5iikuhJSJUhaOpFh9TB335OvCXJw1N+BIlQ==", - "license": "Apache-2.0", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.0.tgz", + "integrity": "sha512-n1PZxKnJ++k73Q8khTPwihlbeKo6emnGzE0hX6QVQJsMq82y/XKmNpw2t/q30VJgwaia3ZXU1fd1C5wHncL+Zg==", "dependencies": { - "@firebase/app-check-interop-types": "0.2.0", + "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.2", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.3.tgz", - "integrity": "sha512-UIAJ2gzNq0p/61cXqkpi9DnlQt0hdlGqgmL5an7KuJth2Iv5uGpKg/+OapAZxPuiUNZgTEyZDB7kNBHvnxWq5w==", - "license": "Apache-2.0", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.6.tgz", + "integrity": "sha512-RQpO3yuHtnkqLqExuAT2d0u3zh8SDbeBYK5EwSCBKI9mjrFeJRXBnd3pEG+x5SxGJLy56/5pQf73mwt0OuH5yg==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/functions": "0.9.3", + "@firebase/component": "0.6.4", + "@firebase/functions": "0.11.0", "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3070,17 +3283,15 @@ "node_modules/@firebase/functions-types": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==", - "license": "Apache-2.0" + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" }, "node_modules/@firebase/installations": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.3.tgz", - "integrity": "sha512-20JFWm+tweNoRjRbz8/Y4I7O5pUJGZsFKCkLl1qNxfNYECSfrZUuozIDJDZC/MeVn5+kB9CwjThDlgQEPrfLdg==", - "license": "Apache-2.0", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/util": "1.9.2", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", "idb": "7.0.1", "tslib": "^2.1.0" }, @@ -3089,15 +3300,14 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.3.tgz", - "integrity": "sha512-K9rKM/ym06lkpaKz7bMLxzHK/HEk65XfLJBV+dJkIuWeO0EqqC9VFGrpWAo0QmgC4BqbU58T6VBbzoJjb0gaFw==", - "license": "Apache-2.0", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/installations": "0.6.3", + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3108,31 +3318,33 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x" } }, + "node_modules/@firebase/installations/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, "node_modules/@firebase/logger": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/messaging": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.3.tgz", - "integrity": "sha512-a3ZKcGDiV2sKmQDB56PpgL1yjFxXCtff2+v1grnAZZ4GnfNQ74t2EHCbmgY7xRX7ThzMqug54oxhuk4ur0MIoA==", - "license": "Apache-2.0", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.5.tgz", + "integrity": "sha512-i/rrEI2k9ueFhdIr8KQsptWGskrsnkC5TkohCTrJKz9P0C/PbNv14IAMkwhMJTqIur5VwuOnrUkc9Kdz7awekw==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/installations": "0.6.3", + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.2", - "idb": "7.0.1", + "@firebase/util": "1.9.3", + "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3140,14 +3352,13 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.3.tgz", - "integrity": "sha512-MmuuohXV2YRzIoJmDngI5qqO/cF2q7SdAaw7k4r61W3ReJy7x4/rtqrIvwNVhM6X/X8NFGBbsYKsCfRHWjFdkg==", - "license": "Apache-2.0", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.5.tgz", + "integrity": "sha512-qHQZxm4hEG8/HFU/ls5/bU+rpnlPDoZoqi3ATMeb6s4hovYV9+PfV5I7ZrKV5eFFv47Hx1PWLe5uPnS4e7gMwQ==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/messaging": "0.12.3", - "@firebase/util": "1.9.2", + "@firebase/component": "0.6.4", + "@firebase/messaging": "0.12.5", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3157,19 +3368,17 @@ "node_modules/@firebase/messaging-interop-types": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==", - "license": "Apache-2.0" + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" }, "node_modules/@firebase/performance": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.3.tgz", - "integrity": "sha512-NQmQN6Ete7i9jz1mzULJZEGvsOmwwdUy6vpqnhUxSFMYPnlBKjX+yypCUUJDDN5zff5+kfwSD1qCyUAaS0xWUA==", - "license": "Apache-2.0", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/installations": "0.6.3", + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3177,16 +3386,15 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.3.tgz", - "integrity": "sha512-I3rqZsIhauXn4iApfj1ttKQdlti/r8OZBG4YK10vxKSdhAzTIDWDKEsdoCXvvKLwplcMv36sM3WPAPGQLqY5MQ==", - "license": "Apache-2.0", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", "dependencies": { - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.3", + "@firebase/performance": "0.6.4", "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3196,19 +3404,17 @@ "node_modules/@firebase/performance-types": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==", - "license": "Apache-2.0" + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" }, "node_modules/@firebase/remote-config": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.3.tgz", - "integrity": "sha512-Q6d4jBWZoNt6SYq87bjtDGUHFkKwAmGnNjWyRjl14AZqE1ilgd9NZHmutharlYJ3LvxMsid80HdK5SgGEpIPfg==", - "license": "Apache-2.0", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/installations": "0.6.3", + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3216,16 +3422,15 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.3.tgz", - "integrity": "sha512-w/ZL03YgYaXq03xIRyJ5oPhXZi6iDsY/v0J9Y7I7SqxCYytEnHVrL9nvBqd9R94y5LRAVNPCLokJeeizaUz4VQ==", - "license": "Apache-2.0", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", "dependencies": { - "@firebase/component": "0.6.3", + "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.3", + "@firebase/remote-config": "0.4.4", "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3235,34 +3440,31 @@ "node_modules/@firebase/remote-config-types": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==", - "license": "Apache-2.0" + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" }, "node_modules/@firebase/storage": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.1.tgz", - "integrity": "sha512-Xv8EG2j52ugF2xayBz26U9J0VBXHXPMVxSN+ph3R3BSoHxvMLaPu+qUYKHavSt+zbcgPH2GyBhrCdJK6SaDFPA==", - "license": "Apache-2.0", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.0.tgz", + "integrity": "sha512-SGs02Y/mmWBRsqZiYLpv4Sf7uZYZzMWVNN+aKiDqPsFBCzD6hLvGkXz+u98KAl8FqcjgB8BtSu01wm4pm76KHA==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/util": "1.9.2", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.1.tgz", - "integrity": "sha512-6HaTvWsT5Yy3j4UpCZpMcFUYEkJ2XYWukdyTl02u6VjSBRLvkhOXPzEfMvgVWqhnF/rYVfPdjrZ904wk5OxtmQ==", - "license": "Apache-2.0", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.3.tgz", + "integrity": "sha512-WNtjYPhpOA1nKcRu5lIodX0wZtP8pI0VxDJnk6lr+av7QZNS1s6zvr+ERDTve+Qu4Hq/ZnNaf3kBEQR2ccXn6A==", "dependencies": { - "@firebase/component": "0.6.3", - "@firebase/storage": "0.11.1", + "@firebase/component": "0.6.4", + "@firebase/storage": "0.12.0", "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.2", + "@firebase/util": "1.9.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3273,110 +3475,53 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/util": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.2.tgz", - "integrity": "sha512-9l0uMGPGw3GsoD5khjMmYCCcMq/OR/OOSViiWMN+s2Q0pxM+fYzrii1H+r8qC/uoMjSVXomjLZt0vZIyryCqtQ==", - "license": "Apache-2.0", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/webchannel-wrapper": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.9.0.tgz", - "integrity": "sha512-BpiZLBWdLFw+qFel9p3Zs1jD6QmH7Ii4aTDu6+vx8ShdidChZUXqDhYJly4ZjSgQh54miXbBgBrk0S+jTIh/Qg==", - "license": "Apache-2.0" + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", + "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" }, "node_modules/@graphql-typed-document-node/core": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz", - "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@grpc/grpc-js": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", - "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", - "license": "Apache-2.0", + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", "dependencies": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" }, "engines": { "node": "^8.13.0 || >=10.10.0" } }, - "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz", - "integrity": "sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A==", - "license": "Apache-2.0", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/grpc-js/node_modules/protobufjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz", - "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/protobufjs/node_modules/long": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", - "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==", - "license": "Apache-2.0" - }, "node_modules/@grpc/proto-loader": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", - "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", - "license": "Apache-2.0", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "dependencies": { - "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.11.3", - "yargs": "^16.2.0" + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" @@ -3386,12 +3531,11 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "license": "Apache-2.0", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -3399,11 +3543,30 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3413,16 +3576,14 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "license": "BSD-3-Clause" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, "node_modules/@icons/material": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", - "license": "MIT", "peerDependencies": { "react": "*" } @@ -3431,7 +3592,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3447,7 +3607,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -3456,7 +3615,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3469,7 +3627,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3477,11 +3634,24 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3489,11 +3659,18 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -3502,7 +3679,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -3519,7 +3695,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "license": "MIT", "dependencies": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", @@ -3562,29 +3737,10 @@ } } }, - "node_modules/@jest/core/node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "license": "MIT", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/@jest/environment": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "license": "MIT", "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -3599,7 +3755,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -3616,7 +3771,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -3630,7 +3784,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", @@ -3670,27 +3823,49 @@ } } }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "license": "BSD-3-Clause", + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/@jest/schemas": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.24.1" }, @@ -3702,7 +3877,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -3716,7 +3890,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "license": "MIT", "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -3731,7 +3904,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "license": "MIT", "dependencies": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", @@ -3746,7 +3918,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "license": "MIT", "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -3768,11 +3939,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/@jest/types": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3785,10 +3960,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "license": "MIT", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3799,10 +3973,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } @@ -3811,63 +3984,75 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "license": "MIT", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "license": "MIT" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "license": "MIT", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsreport/browser-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jsreport/browser-client/-/browser-client-3.1.0.tgz", - "integrity": "sha512-ZElwn2KRIzkUzAyD5UKGxULZUhokWuPOlMzrmiur4WirqH3yoiHlOJEdnRGkjjE/fhZzCR8gBFZ/TuOW/fsOIw==", - "license": "MIT" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jsreport/browser-client/-/browser-client-3.1.1.tgz", + "integrity": "sha512-AAeTkqyVJGdWLCA60aHDrh3s8h9z8TokyoR1tCpNtYatfe2cdocVdB0AaNquWTmddRWgAklmOBrowsMFQFY8hg==" }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "license": "MIT" + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "license": "MIT", "dependencies": { "eslint-scope": "5.1.1" } }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3880,7 +4065,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -3889,7 +4073,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3899,10 +4082,9 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", - "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", - "license": "MIT", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", + "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -3921,7 +4103,7 @@ "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <4.0.0", + "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", "webpack-dev-server": "3.x || 4.x", "webpack-hot-middleware": "2.x", @@ -3948,34 +4130,18 @@ } } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", - "license": "MIT", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3984,32 +4150,27 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -4018,38 +4179,71 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, - "node_modules/@rc-component/portal": { + "node_modules/@rc-component/color-picker": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.1.tgz", + "integrity": "sha512-onyAFhWKXuG4P162xE+7IgaJkPkwM94XlOYnQuu69XdXWMfxpeFi6tpJBsieIMV7EnyLV5J3lDzdLiFeK0iEBA==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "@ctrl/tinycolor": "^3.6.1", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", - "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", @@ -4063,20 +4257,56 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/portal/node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", - "license": "MIT" - }, - "node_modules/@rc-component/portal/node_modules/rc-util": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz", - "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==", - "license": "MIT", + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0" + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.12.1.tgz", + "integrity": "sha512-P2pvSN+rImacOoTuT4NZ+tdjJmxoi6FZ9w++7GnYK6hVeU8qD+iLnDHkgtE7tuvpZxIRS3dPF5O2ykupHx9E/g==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.2.tgz", + "integrity": "sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" }, "peerDependencies": { "react": ">=16.9.0", @@ -4084,10 +4314,9 @@ } }, "node_modules/@redux-saga/core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.2.tgz", - "integrity": "sha512-0qr5oleOAmI5WoZLRA6FEa30M4qKZcvx+ZQOQw+RqFeH8t20bvhE329XSPsNfTVP8C6qyDsXOSjuoV+g3+8zkg==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", + "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", "dependencies": { "@babel/runtime": "^7.6.3", "@redux-saga/deferred": "^1.2.1", @@ -4095,7 +4324,6 @@ "@redux-saga/is": "^1.1.3", "@redux-saga/symbols": "^1.1.3", "@redux-saga/types": "^1.2.1", - "redux": "^4.0.4", "typescript-tuple": "^2.2.1" }, "funding": { @@ -4106,14 +4334,12 @@ "node_modules/@redux-saga/deferred": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", - "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==", - "license": "MIT" + "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==" }, "node_modules/@redux-saga/delay-p": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", - "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3" } @@ -4122,7 +4348,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", - "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3", "@redux-saga/types": "^1.2.1" @@ -4131,32 +4356,90 @@ "node_modules/@redux-saga/symbols": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", - "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==", - "license": "MIT" + "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==" }, "node_modules/@redux-saga/types": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", - "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", - "license": "MIT" + "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==" + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.0.1.tgz", + "integrity": "sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.0", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", + "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@remix-run/router": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", + "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/@restart/hooks": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", - "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", - "license": "MIT", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", + "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", "dependencies": { - "dequal": "^2.0.2" + "dequal": "^2.0.3" }, "peerDependencies": { "react": ">=16.8.0" } }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -4176,7 +4459,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -4185,11 +4467,18 @@ "rollup": "^1.20.0 || ^2.0.0" } }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -4205,49 +4494,158 @@ "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "license": "MIT" + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", - "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", - "license": "MIT" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz", + "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==" }, - "node_modules/@sentry/browser": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.40.0.tgz", - "integrity": "sha512-07rZ+cTcpmYB1r84/oZtmSPJJvLCxW8yIh/5s4MdKRyZpqIDKhOz6cCS/4j+l1V+MeLcNLZBjFtNdKA2eocTpg==", - "license": "MIT", + "node_modules/@sentry-internal/feedback": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.93.0.tgz", + "integrity": "sha512-4G7rMeQbYGfCHxEoFroABX+UREYc2BSbFqjLmLbIcWowSpgzcwweLLphWHKOciqK6f7DnNDK0jZzx3u7NrkWHw==", "dependencies": { - "@sentry/core": "7.40.0", - "@sentry/replay": "7.40.0", - "@sentry/types": "7.40.0", - "@sentry/utils": "7.40.0", - "tslib": "^1.9.3" + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry-internal/feedback/node_modules/@sentry/core": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", + "dependencies": { + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@sentry-internal/feedback/node_modules/@sentry/types": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/feedback/node_modules/@sentry/utils": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", + "dependencies": { + "@sentry/types": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.86.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.86.0.tgz", + "integrity": "sha512-b4dUsNWlPWRwakGwR7bhOkqiFlqQszH1hhVFwrm/8s3kqEBZ+E4CeIfCvuHBHQ1cM/fx55xpXX/BU163cy+3iQ==", + "dev": true, + "dependencies": { + "@sentry/core": "7.86.0", + "@sentry/types": "7.86.0", + "@sentry/utils": "7.86.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.93.0.tgz", + "integrity": "sha512-MtLTcQ7y3rfk+aIvnnwCfSJvYhTJnIJi+Mf6y/ap6SKObdlsKMbQoJLlRViglGLq+nKxHLAvU0fONiCEmKfV6A==", + "dependencies": { + "@sentry-internal/feedback": "7.93.0", + "@sentry-internal/tracing": "7.93.0", + "@sentry/core": "7.93.0", + "@sentry/replay": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry-internal/tracing": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==", + "dependencies": { + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry/core": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", + "dependencies": { + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry/types": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry/utils": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", + "dependencies": { + "@sentry/types": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/bundler-plugin-core": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.10.2.tgz", + "integrity": "sha512-7IoekLtROlJZqTxtHQ3IhocBuf9dsEq+JjqlHMyZXoq+QKuvJFvMd/4T+r6KjZ15kMZOIkR+spK3V7duH201hw==", + "dev": true, + "dependencies": { + "@sentry/cli": "^2.22.3", + "@sentry/node": "^7.60.0", + "@sentry/utils": "^7.60.0", + "dotenv": "^16.3.1", + "find-up": "5.0.0", + "glob": "9.3.2", + "magic-string": "0.27.0", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } }, "node_modules/@sentry/cli": { - "version": "1.74.6", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.74.6.tgz", - "integrity": "sha512-pJ7JJgozyjKZSTjOGi86chIngZMLUlYt2HOog+OJn+WGvqEkVymu8m462j1DiXAnex9NspB4zLLNuZ/R6rTQHg==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.23.0.tgz", + "integrity": "sha512-xFTv7YOaKWMCSPgN8A1jZpxJQhwdES89pqMTWjJOgjmkwFvziuaTM7O7kazps/cACDhJp2lK2j6AT6imhr4t9w==", "dev": true, - "hasInstallScript": true, - "license": "BSD-3-Clause", "dependencies": { "https-proxy-agent": "^5.0.0", - "mkdirp": "^0.5.5", "node-fetch": "^2.6.7", - "npmlog": "^4.1.2", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", "which": "^2.0.2" @@ -4256,40 +4654,172 @@ "sentry-cli": "bin/sentry-cli" }, "engines": { - "node": ">= 8" + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.23.0", + "@sentry/cli-linux-arm": "2.23.0", + "@sentry/cli-linux-arm64": "2.23.0", + "@sentry/cli-linux-i686": "2.23.0", + "@sentry/cli-linux-x64": "2.23.0", + "@sentry/cli-win32-i686": "2.23.0", + "@sentry/cli-win32-x64": "2.23.0" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.23.0.tgz", + "integrity": "sha512-tWuTxvb6P5pA0E+O1/7jKQ6AP45DOOW+BAd7mwBMHZ+5xG3nsvvrRS9hOIzBNPTeB2RyIEXgpQ2Mb6NdD21DBQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.23.0.tgz", + "integrity": "sha512-1R8ngBDKtPw++Km6VnVTx76ndrBL9BuBBNpF9TUCGftK3ArdaifqoIx8cZ8aKu8sWXLAKO7lHzxL4BNPZvlDiw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.23.0.tgz", + "integrity": "sha512-KsOckP+b0xAzrRuoP4eiqJ6ASD6SqIplL8BCHOAODQfvWn9rgNwsJWOgKlWwfrJnkJYkpWVYvYeyx0oeUx3N0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.23.0.tgz", + "integrity": "sha512-KRqB98KstBkKh33ZqUq+q8O0U4c01aTWCNPpVrqAX7zikSk0AAJTG8eAtqwDSx949IkKUl8xa6PFLfz+Nb2EMQ==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.23.0.tgz", + "integrity": "sha512-USHZ0zzg9qujGYAyRjLeUfLDZOMgNjCr82m0BSBMmlFs4oKwHmO6bSvdi9UzNNcpmkOavNAdUM4jnZWk11i46Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.23.0.tgz", + "integrity": "sha512-lS/B3pONDl18IEu/I//3vcMnosThobyXpqfAm4WYUtFTiw/wwDHgwGgaIjZWm5wMRkPFzYoRFpZfPlUrJd/4cQ==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.23.0.tgz", + "integrity": "sha512-7LP6wA3w93ViYKQR8tMN2i/SfpQzaXqM2SAHI3yfJ3bdREHOV3+/N0mNiWVRvgL0TKNQJS42v2IILLhiDxufHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, "node_modules/@sentry/core": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.40.0.tgz", - "integrity": "sha512-OPAobQG0GTY++r5LWUcOA1lS+2TY2Lmw/i5s4kL9WbY+f08dbLNEGNBObY7/V98OL4f7OG+nWaPFybgM7kqUTQ==", - "license": "MIT", + "version": "7.86.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.86.0.tgz", + "integrity": "sha512-SbLvqd1bRYzhDS42u7GMnmbDMfth/zRiLElQWbLK/shmuZzTcfQSwNNdF4Yj+VfjOkqPFgGmICHSHVUc9dh01g==", + "dev": true, "dependencies": { - "@sentry/types": "7.40.0", - "@sentry/utils": "7.40.0", - "tslib": "^1.9.3" + "@sentry/types": "7.86.0", + "@sentry/utils": "7.86.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@sentry/node": { + "version": "7.86.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.86.0.tgz", + "integrity": "sha512-cB1bn/LMn2Km97Y3hv63xwWxT50/G5ixGuSxTZ3dCQM6VDhmZoCuC5NGT3itVvaRd6upQXRZa5W0Zgyh0HXKig==", + "dev": true, + "dependencies": { + "@sentry-internal/tracing": "7.86.0", + "@sentry/core": "7.86.0", + "@sentry/types": "7.86.0", + "@sentry/utils": "7.86.0", + "https-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/@sentry/react": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.40.0.tgz", - "integrity": "sha512-7yYagpOCdsXnVTtLL8Y7wAf2xXgsk2ncuju3O/G4kEckkLewZWmQeoknOSGFlAgVdGNhTaXc2WGzgOiBMOkhug==", - "license": "MIT", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.93.0.tgz", + "integrity": "sha512-B0bzziV1lEyN7xd0orUPyJdpoK6CtcyodmQkfY0WsHLm/1d9xi95M05lObHnsMWO1js6c9B9d9kO8RlKFz947A==", "dependencies": { - "@sentry/browser": "7.40.0", - "@sentry/types": "7.40.0", - "@sentry/utils": "7.40.0", - "hoist-non-react-statics": "^3.3.2", - "tslib": "^1.9.3" + "@sentry/browser": "7.93.0", + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0", + "hoist-non-react-statics": "^3.3.2" }, "engines": { "node": ">=8" @@ -4298,100 +4828,197 @@ "react": "15.x || 16.x || 17.x || 18.x" } }, - "node_modules/@sentry/react/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@sentry/react/node_modules/@sentry/core": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", + "dependencies": { + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/types": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/utils": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", + "dependencies": { + "@sentry/types": "7.93.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/@sentry/replay": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.40.0.tgz", - "integrity": "sha512-Y9Kvo9jKouUdrHQhHVv5SmWZClF5o7BFI6oVpLlv4zXORPQlyoZONM/9sxiMvvH73alDSpxzCoxyhlypAOH4ww==", - "license": "MIT", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.93.0.tgz", + "integrity": "sha512-dMlLU8v+OkUeGCrPvTu5NriH7BGj3el4rGHWWAYicfJ2QXqTTq50vfasQBP1JeVNcFqnf1y653TdEIvo4RH4tw==", "dependencies": { - "@sentry/core": "7.40.0", - "@sentry/types": "7.40.0", - "@sentry/utils": "7.40.0" + "@sentry-internal/tracing": "7.93.0", + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=12" } }, - "node_modules/@sentry/tracing": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.40.0.tgz", - "integrity": "sha512-y1SNwlFEC7a2ThtWbT/KbnAVecAWyIeKiO/IRgyZSdcj1z4CliADKNQmkUhnDlLy8jV1ARGuZ1DvsuPNlWyDfw==", - "license": "MIT", + "node_modules/@sentry/replay/node_modules/@sentry-internal/tracing": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==", "dependencies": { - "@sentry/core": "7.40.0", - "@sentry/types": "7.40.0", - "@sentry/utils": "7.40.0", - "tslib": "^1.9.3" + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@sentry/replay/node_modules/@sentry/core": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", + "dependencies": { + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay/node_modules/@sentry/types": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay/node_modules/@sentry/utils": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", + "dependencies": { + "@sentry/types": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-n4XbAQ7e098Jzv4ZvpXAsFgM+XFfjhKci18r7s3UfDMnrB4FTCwhHZoeiygO8PZhB944mEFbNXNFhHkb8nTDbA==", + "dependencies": { + "@sentry-internal/tracing": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry-internal/tracing": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==", + "dependencies": { + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/core": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", + "dependencies": { + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/types": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/utils": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", + "dependencies": { + "@sentry/types": "7.93.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/@sentry/types": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.40.0.tgz", - "integrity": "sha512-dIbqBenbmDx1F8pvfC11C88J83ecwumUhV+YOIxcmVd1fmlPF2hXWZ01+NTkTDkCu341sJx4wPQogByFy8FwGA==", - "license": "MIT", + "version": "7.86.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.86.0.tgz", + "integrity": "sha512-pGAt0+bMfWgo0KG2epthfNV4Wae03tURpoxNjGo5Fr4cXxvLTSijSAQ6rmmO4bXBJ7+rErEjX30g30o/eEdP9g==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.40.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.40.0.tgz", - "integrity": "sha512-ZdCbTpAXPiVVfvNJVftnDhsctOui71MDUhVIdLkgg4Cuic+WHGPRmmZ+H6uZdp7vRaeB+Uvnn5+t2iSAVo/mAA==", - "license": "MIT", + "version": "7.86.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.86.0.tgz", + "integrity": "sha512-6PejFtw9VTFFy5vu0ks+U7Ozkqz+eMt+HN8AZKBKErYzX5/xs0kpkOcSRpu3ETdTYcZf8VAmLVgFgE2BE+3WuQ==", + "dev": true, "dependencies": { - "@sentry/types": "7.40.0", - "tslib": "^1.9.3" + "@sentry/types": "7.86.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, "node_modules/@sentry/webpack-plugin": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz", - "integrity": "sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.10.2.tgz", + "integrity": "sha512-sA+oHgxoiLEaxZt3/o3fVsItyR37PIUWSiSkpdxcziekRZ6EM/h0BqW4qXi+46OmLE+ZiB8qtaqid+GUG9C9VA==", "dev": true, - "license": "MIT", "dependencies": { - "@sentry/cli": "^1.74.6", - "webpack-sources": "^2.0.0 || ^3.0.0" + "@sentry/bundler-plugin-core": "2.10.2", + "unplugin": "1.0.1", + "uuid": "^9.0.0" }, "engines": { - "node": ">= 8" + "node": ">= 14" + }, + "peerDependencies": { + "webpack": ">=4.40.0" } }, "node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "license": "MIT" + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "license": "BSD-3-Clause", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dependencies": { "type-detect": "4.0.8" } @@ -4400,7 +5027,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.7.0" } @@ -4408,28 +5034,25 @@ "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "license": "MIT" + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, "node_modules/@sphinxxxx/color-conversion": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", - "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", - "license": "ISC" + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" }, "node_modules/@splitsoftware/splitio": { - "version": "10.22.3", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.22.3.tgz", - "integrity": "sha512-1MYjuLsTM6N3UEEF+G9Pi8GUw+lEFME8iwbbqaoQxJtHXK6TcQ0i+Kg/yrPXoAuE6RDG17zeltRBfdbZlHrjog==", - "license": "Apache-2.0", + "version": "10.25.1", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.25.1.tgz", + "integrity": "sha512-QmCOI2VNhjIMieibtMcc595oyQB5sgrYKSqw7wxKtwMX0VtuPbZ3Lw8fwd0nH2WSKq3Pcjyu3nVSYQRp1bGEvA==", "dependencies": { - "@splitsoftware/splitio-commons": "1.7.3", + "@splitsoftware/splitio-commons": "1.13.1", "@types/google.analytics": "0.0.40", "@types/ioredis": "^4.28.0", "bloom-filters": "^3.0.0", "ioredis": "^4.28.0", "js-yaml": "^3.13.1", - "node-fetch": "^2.6.7", + "node-fetch": "^2.7.0", "unfetch": "^4.2.0" }, "engines": { @@ -4441,10 +5064,9 @@ } }, "node_modules/@splitsoftware/splitio-commons": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.7.3.tgz", - "integrity": "sha512-rWZ05g6eY0YlaDuNDWc3e/cPudbVRX7y8Lp0eKXE1wIFMf9P5pAdQWvb2KiXXsvGepM0FwA9U6epxEqatBIpiA==", - "license": "Apache-2.0", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.13.1.tgz", + "integrity": "sha512-xGu94sLx+tJb6PeM26vH8/LEElsaVbh2BjoLvL5twR4gKsVezie5ZtHhejWT1+iCVCtJuhjZxKwOm4HGYoVIHQ==", "dependencies": { "tslib": "^2.3.1" }, @@ -4458,12 +5080,11 @@ } }, "node_modules/@splitsoftware/splitio-react": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-1.8.1.tgz", - "integrity": "sha512-IRJ+9kjWJlTtBCANhaRlXgx781ZxDNB4mb5x7Ian1VETdz+gh+KrZjnFXuT6ndHCjhLHrGEgsItL8ibKGUa8Fg==", - "license": "Apache-2.0", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-1.11.0.tgz", + "integrity": "sha512-z7+xh9m8M0x6vOWWNMNelG20JptGMbcY6kSh32pC2WZt2Vfr7PzJqI3g0mx+0ZCDXPaODR0O3OKdp16jp7aA4Q==", "dependencies": { - "@splitsoftware/splitio": "10.22.3", + "@splitsoftware/splitio": "10.25.1", "memoize-one": "^5.1.1", "shallowequal": "^1.1.0" }, @@ -4475,7 +5096,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "license": "Apache-2.0", "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -4483,23 +5103,18 @@ "string.prototype.matchall": "^4.0.6" } }, - "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4512,7 +5127,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4525,7 +5139,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4538,7 +5151,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4551,7 +5163,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4564,7 +5175,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4577,7 +5187,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4590,7 +5199,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4603,7 +5211,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -4626,7 +5233,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "license": "MIT", "dependencies": { "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", @@ -4644,7 +5250,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "license": "MIT", "dependencies": { "@babel/types": "^7.12.6" }, @@ -4660,7 +5265,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.12.3", "@svgr/babel-preset": "^5.5.0", @@ -4679,7 +5283,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", @@ -4697,7 +5300,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "license": "MIT", "dependencies": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-constant-elements": "^7.12.1", @@ -4717,12 +5319,11 @@ } }, "node_modules/@tanem/react-nprogress": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@tanem/react-nprogress/-/react-nprogress-5.0.8.tgz", - "integrity": "sha512-40fHVu6qq4Z+AheTxckcd5trx066FvilViQDcOd/v0FW7ap/bJslcMP7tr1rI5By16oddmfgZzLZEmU32ST1Bg==", - "license": "MIT", + "version": "5.0.51", + "resolved": "https://registry.npmjs.org/@tanem/react-nprogress/-/react-nprogress-5.0.51.tgz", + "integrity": "sha512-YxNUCpznuBVA+PhjEzFmxaa1czXgU+5Ojchw5JBK7DQS6SHIgNudpFohWpNBWMu2KWByGJ2OLH2OwbM/XyP18Q==", "dependencies": { - "@babel/runtime": "^7.18.6", + "@babel/runtime": "^7.22.15", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { @@ -4731,48 +5332,45 @@ } }, "node_modules/@testing-library/cypress": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.3.tgz", - "integrity": "sha512-nY2YaSbmuPo5k6kL0iLj/pGPPfka3iwb3kpTx8QN/vOCns92Saz9wfACqB8FJzcR7+lfA4d5HUOWqmTddBzczg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.1.tgz", + "integrity": "sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.6", - "@testing-library/dom": "^8.1.0" + "@testing-library/dom": "^9.0.0" }, "engines": { "node": ">=12", "npm": ">=6" }, "peerDependencies": { - "cypress": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + "cypress": "^12.0.0 || ^13.0.0" } }, "node_modules/@testing-library/dom": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", - "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", + "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -4781,7 +5379,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -4789,213 +5386,186 @@ "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "license": "MIT" + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "license": "MIT" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "license": "MIT" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "license": "MIT" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", - "dev": true, - "license": "MIT" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "license": "MIT", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "license": "MIT", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "license": "MIT", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", - "license": "MIT", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "license": "MIT", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "license": "MIT", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "license": "MIT", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "license": "MIT", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "node_modules/@types/cookie": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", - "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==", - "license": "MIT" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/d3-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", - "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==", - "license": "MIT" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" }, "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", - "license": "MIT" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" }, "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", - "license": "MIT" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" }, "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", - "license": "MIT", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", - "license": "MIT" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" }, "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", - "license": "MIT", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-shape": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", - "license": "MIT", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" }, "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", - "license": "MIT" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, "node_modules/@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", - "license": "MIT", + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "license": "MIT", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "license": "MIT" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "license": "MIT", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -5004,36 +5574,33 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "license": "MIT", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/google.analytics": { "version": "0.0.40", "resolved": "https://registry.npmjs.org/@types/google.analytics/-/google.analytics-0.0.40.tgz", - "integrity": "sha512-R3HpnLkqmKxhUAf8kIVvDVGJqPtaaZlW4yowNwjOZUTmYUQEgHh8Nh5wkSXKMroNAuQM8gbXJHmNbbgA8tdb7Q==", - "license": "MIT" + "integrity": "sha512-R3HpnLkqmKxhUAf8kIVvDVGJqPtaaZlW4yowNwjOZUTmYUQEgHh8Nh5wkSXKMroNAuQM8gbXJHmNbbgA8tdb7Q==" }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "license": "MIT", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "license": "MIT", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -5042,14 +5609,17 @@ "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", - "license": "MIT", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dependencies": { "@types/node": "*" } @@ -5058,106 +5628,96 @@ "version": "4.28.10", "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "license": "MIT" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "license": "MIT", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "license": "MIT", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "license": "MIT" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "license": "MIT" - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "license": "MIT" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "license": "MIT" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "18.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz", - "integrity": "sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg==", - "license": "MIT" + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "license": "MIT" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "license": "MIT" + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "license": "MIT" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "license": "MIT" + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "license": "MIT" + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "license": "MIT" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", - "license": "MIT", + "version": "18.2.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.43.tgz", + "integrity": "sha512-nvOV01ZdBdd/KW6FahSbcNplt2jCJfyWdTos61RYHV+FVv5L/g9AOX1bmbVcWcLFL8+KHQfh1zVIQrud6ihyQA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5165,10 +5725,9 @@ } }, "node_modules/@types/react-redux": { - "version": "7.1.24", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", - "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", - "license": "MIT", + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -5176,11 +5735,18 @@ "redux": "^4.0.0" } }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5188,36 +5754,41 @@ "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "license": "MIT" + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "license": "MIT" + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "license": "MIT", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "license": "MIT", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -5226,98 +5797,91 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true, - "license": "MIT" + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", + "dev": true }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "license": "MIT", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "license": "MIT" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" }, "node_modules/@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "license": "MIT" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", - "license": "MIT" + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==", - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "license": "MIT", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", - "license": "MIT", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "license": "MIT" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", - "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dependencies": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/type-utils": "5.54.0", - "@typescript-eslint/utils": "5.54.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -5338,28 +5902,12 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.54.0.tgz", - "integrity": "sha512-rRYECOTh5V3iWsrOzXi7h1jp3Bi9OkJHrb3wECi3DVqMGTilo9wAYmCbT+6cGdrzUY3MWcAa2mESM6FMik6tVw==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", "dependencies": { - "@typescript-eslint/utils": "5.54.0" + "@typescript-eslint/utils": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5373,14 +5921,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", - "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", - "license": "BSD-2-Clause", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dependencies": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -5400,13 +5947,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", - "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dependencies": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5417,13 +5963,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", - "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dependencies": { - "@typescript-eslint/typescript-estree": "5.54.0", - "@typescript-eslint/utils": "5.54.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5444,10 +5989,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", - "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5457,13 +6001,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", - "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", - "license": "BSD-2-Clause", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dependencies": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5483,34 +6026,18 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", - "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -5524,28 +6051,32 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "license": "ISC", + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", - "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", - "license": "MIT", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dependencies": { - "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5556,157 +6087,170 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@umijs/route-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@umijs/route-utils/-/route-utils-4.0.1.tgz", + "integrity": "sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==" + }, + "node_modules/@umijs/use-params": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@umijs/use-params/-/use-params-1.0.9.tgz", + "integrity": "sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "license": "Apache-2.0", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, + "node_modules/@wry/caches": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", + "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@wry/context": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.0.tgz", - "integrity": "sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ==", - "license": "MIT", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -5715,10 +6259,9 @@ } }, "node_modules/@wry/equality": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.2.tgz", - "integrity": "sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA==", - "license": "MIT", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", "dependencies": { "tslib": "^2.3.0" }, @@ -5727,10 +6270,9 @@ } }, "node_modules/@wry/trie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.1.tgz", - "integrity": "sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw==", - "license": "MIT", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", + "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", "dependencies": { "tslib": "^2.3.0" }, @@ -5741,26 +6283,23 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "license": "BSD-3-Clause" + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5770,16 +6309,14 @@ } }, "node_modules/ace-builds": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.8.1.tgz", - "integrity": "sha512-wjEQ4khMQYg9FfdEDoOtqdoHwcwFL48H0VB3te5b5A3eqHwxsTw8IX6+xzfisgborIb8dYU+1y9tcmtGFrCPIg==", - "license": "BSD-3-Clause" + "version": "1.32.2", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.2.tgz", + "integrity": "sha512-mnJAc803p+7eeDt07r6XI7ufV7VdkpPq4gJZT8Jb3QsowkaBTVy4tdBgPrVT0WbXLm0toyEQXURKSVNj/7dfJQ==" }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "license": "MIT", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -5791,7 +6328,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "license": "MIT", "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -5801,7 +6337,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5810,10 +6345,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "license": "MIT", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { "acorn": "^8" } @@ -5822,48 +6356,30 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/add-dom-event-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", + "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", + "dependencies": { + "object-assign": "4.x" + } + }, "node_modules/address": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -5872,7 +6388,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -5885,7 +6400,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", "dependencies": { "debug": "4" }, @@ -5898,7 +6412,6 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5911,7 +6424,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5923,11 +6435,46 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -5937,7 +6484,6 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5946,7 +6492,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -5961,7 +6506,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5976,7 +6520,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -5985,7 +6528,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5994,7 +6536,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6006,54 +6547,57 @@ } }, "node_modules/antd": { - "version": "4.24.8", - "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.8.tgz", - "integrity": "sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA==", - "license": "MIT", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.13.1.tgz", + "integrity": "sha512-/qAPsr6UyJPSFZQD9G7kW98GelH2Bajli+1q7CRW4IinYQ0R0UVJckFX11emByhiU4Jd4WNH/hOO+fZtp0eVDA==", "dependencies": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons": "^4.7.0", - "@ant-design/react-slick": "~0.29.1", - "@babel/runtime": "^7.18.3", - "@ctrl/tinycolor": "^3.4.0", - "classnames": "^2.2.6", - "copy-to-clipboard": "^3.2.0", - "lodash": "^4.17.21", - "moment": "^2.29.2", - "rc-cascader": "~3.7.0", - "rc-checkbox": "~2.3.0", - "rc-collapse": "~3.4.2", - "rc-dialog": "~9.0.2", - "rc-drawer": "~6.1.0", - "rc-dropdown": "~4.0.0", - "rc-field-form": "~1.27.0", - "rc-image": "~5.13.0", - "rc-input": "~0.1.4", - "rc-input-number": "~7.3.9", - "rc-mentions": "~1.13.1", - "rc-menu": "~9.8.0", - "rc-motion": "^2.6.1", - "rc-notification": "~4.6.0", - "rc-pagination": "~3.2.0", - "rc-picker": "~2.7.0", - "rc-progress": "~3.4.1", - "rc-rate": "~2.9.0", - "rc-resize-observer": "^1.2.0", - "rc-segmented": "~2.1.0", - "rc-select": "~14.1.13", - "rc-slider": "~10.0.0", - "rc-steps": "~5.0.0-alpha.2", - "rc-switch": "~3.2.0", - "rc-table": "~7.26.0", - "rc-tabs": "~12.5.6", - "rc-textarea": "~0.4.5", - "rc-tooltip": "~5.2.0", - "rc-tree": "~5.7.0", - "rc-tree-select": "~5.5.0", - "rc-trigger": "^5.2.10", - "rc-upload": "~4.3.0", - "rc-util": "^5.22.5", - "scroll-into-view-if-needed": "^2.2.25" + "@ant-design/colors": "^7.0.2", + "@ant-design/cssinjs": "^1.18.2", + "@ant-design/icons": "^5.2.6", + "@ant-design/react-slick": "~1.0.2", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~1.5.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/tour": "~1.12.1", + "@rc-component/trigger": "^1.18.2", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.10", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.21.0", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.2", + "rc-dialog": "~9.3.4", + "rc-drawer": "~7.0.0", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.41.0", + "rc-image": "~7.5.1", + "rc-input": "~1.4.3", + "rc-input-number": "~8.6.1", + "rc-mentions": "~2.10.1", + "rc-menu": "~9.12.4", + "rc-motion": "^2.9.0", + "rc-notification": "~5.3.0", + "rc-pagination": "~4.0.4", + "rc-picker": "~3.14.6", + "rc-progress": "~3.5.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.2.2", + "rc-select": "~14.11.0", + "rc-slider": "~10.5.0", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.37.0", + "rc-tabs": "~14.0.0", + "rc-textarea": "~1.6.3", + "rc-tooltip": "~6.1.3", + "rc-tree": "~5.8.2", + "rc-tree-select": "~5.17.0", + "rc-upload": "~4.5.2", + "rc-util": "^5.38.1", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.0" }, "funding": { "type": "opencollective", @@ -6064,33 +6608,15 @@ "react-dom": ">=16.9.0" } }, - "node_modules/antd/node_modules/rc-select": { - "version": "14.1.16", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", - "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.2.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "license": "ISC", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6103,7 +6629,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/apollo-link-logger/-/apollo-link-logger-2.0.1.tgz", "integrity": "sha512-4KkdwCqWtlOc0vx0W/5o+UfotyZtcJZicraKNyo2KTaCmAGSJ8vDnNRyDlv6o5XtSgdv4NA36cSe6dt49OkGWA==", - "license": "MIT", "engines": { "node": ">= 10", "npm": "> 3" @@ -6112,13 +6637,6 @@ "@apollo/client": "^3.0.0" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "license": "ISC" - }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -6137,61 +6655,56 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } + ] }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=6.0" + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "license": "MIT", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -6204,27 +6717,42 @@ "node_modules/array-tree-filter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", - "license": "MIT" + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "license": "MIT", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6235,14 +6763,13 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "license": "MIT", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6253,14 +6780,13 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", - "license": "MIT", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, @@ -6272,30 +6798,47 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "license": "MIT", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } @@ -6305,58 +6848,59 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "license": "ISC" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "license": "MIT" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", - "license": "MIT" + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dependencies": { + "has-symbols": "^1.0.3" + } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "funding": [ { "type": "opencollective", @@ -6365,13 +6909,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -6386,27 +6933,10 @@ "postcss": "^8.1.0" } }, - "node_modules/autoprefixer/node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6419,52 +6949,46 @@ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true, - "license": "MIT" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true }, "node_modules/axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", - "license": "MPL-2.0", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", - "license": "MIT", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "license": "Apache-2.0", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "license": "MIT", "dependencies": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", @@ -6482,59 +7006,10 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/babel-jest/node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/babel-jest/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/babel-jest/node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, "node_modules/babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -6549,11 +7024,24 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -6567,20 +7055,18 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -6596,7 +7082,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -6611,7 +7096,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -6626,55 +7110,58 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "license": "MIT", "peerDependencies": { "@babel/core": "^7.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "license": "MIT", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "license": "MIT", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "license": "MIT", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.4.4" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-preval": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-5.1.0.tgz", "integrity": "sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@types/babel__core": "^7.1.12", @@ -6686,39 +7173,15 @@ "npm": ">=6" } }, - "node_modules/babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", - "license": "MIT" - }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "license": "MIT" + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -6741,7 +7204,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" @@ -6757,7 +7219,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/plugin-proposal-class-properties": "^7.16.0", @@ -6781,7 +7242,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "license": "MIT", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -6790,26 +7250,22 @@ "node_modules/babel-runtime/node_modules/regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "license": "MIT" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", - "license": "MIT" + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -6832,34 +7288,31 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", - "license": "MIT", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", + "bluebird": "^3.7.2", + "check-types": "^11.2.3", "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", "tryer": "^1.0.1" }, "engines": { @@ -6867,10 +7320,9 @@ } }, "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "license": "Unlicense", + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "engines": { "node": ">=0.6" } @@ -6879,7 +7331,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", "engines": { "node": "*" } @@ -6888,7 +7339,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -6897,14 +7347,12 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/bloom-filters": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bloom-filters/-/bloom-filters-3.0.0.tgz", - "integrity": "sha512-DBDgLkYokKS5NA5y8P9fuTavKQCkleAP39yqpW/5Nab/vwzHv+wOPRM/yDAStghARDleyRI4orW91uuxj48LKQ==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bloom-filters/-/bloom-filters-3.0.1.tgz", + "integrity": "sha512-rU9IU6bgZ1jmqcLWhlKSidrFjbIGjB89CJBsQqUj1+3/11tAJDwn+f7iRu4bbQ2srTjGgNeoWNwcnelumqdi0g==", "dependencies": { "base64-arraybuffer": "^1.0.2", "is-buffer": "^2.0.5", @@ -6920,23 +7368,15 @@ "node": ">=12" } }, - "node_modules/bloom-filters/node_modules/long": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", - "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==", - "license": "Apache-2.0" - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -6956,26 +7396,56 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", - "license": "MIT", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -6983,33 +7453,23 @@ "multicast-dns": "^7.2.5" } }, - "node_modules/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "license": "MIT" - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -7021,7 +7481,6 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", "detect-node": "^2.1.0", @@ -7036,13 +7495,12 @@ "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "license": "BSD-2-Clause" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "funding": [ { "type": "opencollective", @@ -7051,14 +7509,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -7067,27 +7528,10 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -7097,7 +7541,6 @@ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, - "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -7124,7 +7567,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -7134,7 +7576,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", "engines": { "node": "*" } @@ -7142,14 +7583,12 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "license": "MIT", "engines": { "node": ">=6" }, @@ -7158,32 +7597,30 @@ } }, "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } }, "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7193,7 +7630,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -7202,7 +7638,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -7212,7 +7647,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -7224,22 +7658,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==", - "license": "MIT" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -7248,9 +7682,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001370", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz", - "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==", + "version": "1.0.30001568", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", + "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", "funding": [ { "type": "opencollective", @@ -7259,15 +7693,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -7276,14 +7712,12 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7299,7 +7733,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", "engines": { "node": ">=10" } @@ -7309,16 +7742,14 @@ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", - "license": "MIT" + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" }, "node_modules/chokidar": { "version": "3.5.3", @@ -7330,7 +7761,6 @@ "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -7347,38 +7777,53 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "license": "MIT" + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "license": "MIT" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", - "license": "MIT" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "license": "MIT", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dependencies": { "source-map": "~0.6.0" }, @@ -7391,7 +7836,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -7401,7 +7845,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -7410,11 +7853,10 @@ } }, "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, - "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -7430,7 +7872,6 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" @@ -7442,22 +7883,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -7471,7 +7918,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -7480,7 +7926,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } @@ -7489,7 +7934,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -7499,7 +7943,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "license": "MIT", "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -7513,7 +7956,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -7525,7 +7967,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -7539,7 +7980,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -7547,14 +7987,12 @@ "node_modules/coa/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/coa/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -7563,7 +8001,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -7571,27 +8008,15 @@ "node": ">=4" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7602,26 +8027,22 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "license": "MIT" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7630,22 +8051,23 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "license": "ISC" + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -7653,14 +8075,12 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "license": "MIT" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -7672,7 +8092,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -7686,20 +8105,10 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7707,54 +8116,40 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/compute-scroll-into-view": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==", - "license": "MIT" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "license": "MIT" + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -7763,34 +8158,22 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "license": "MIT", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -7798,14 +8181,12 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "license": "MIT", "dependencies": { "is-what": "^3.14.1" }, @@ -7814,10 +8195,9 @@ } }, "node_modules/copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", - "license": "MIT", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "dependencies": { "toggle-selection": "^1.0.6" } @@ -7826,54 +8206,40 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "hasInstallScript": true, - "license": "MIT" + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.0.tgz", - "integrity": "sha512-F+2E63X3ff/nj8uIrf8Rf24UDGIz7p838+xjEp+Bx3y8OWXj+VTPPZNCtdqovPaS9o7Tka5mCH01Zn5vOd6UQg==", - "license": "MIT", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", "dependencies": { - "browserslist": "^4.21.2", - "semver": "7.0.0" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.0.tgz", - "integrity": "sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.34.0.tgz", + "integrity": "sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "license": "MIT", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -7889,7 +8255,6 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", - "license": "MIT", "dependencies": { "cosmiconfig": "^7", "ts-node": "^10.7.0" @@ -7905,30 +8270,36 @@ } }, "node_modules/craco-less": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/craco-less/-/craco-less-2.0.0.tgz", - "integrity": "sha512-980mQaZVrC4ZsvOwvud6/AgvW7fLY3mW5m5+gR4sw4krxszgHb+qoRyOjqsYPD0F4oUmQoSiZSrlYY/bFGD9kQ==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/craco-less/-/craco-less-3.0.1.tgz", + "integrity": "sha512-w4aDZYI1MTbK6DaKBvw6E8bgO1HgXmjRx5MNwOxzoFyPfpgamxiZOGyxnlvkAfYe2Q3LkSK1GcRRi8teyweBsQ==", "dependencies": { - "less": "^4.1.1", - "less-loader": "^7.3.0" + "less": "^4.1.3", + "less-loader": "^11.1.3" }, "peerDependencies": { - "@craco/craco": "^6.0.0", - "react-scripts": "^5.0.0" + "@craco/craco": "^6 || ^7", + "react-scripts": "^5" + } + }, + "node_modules/create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "dependencies": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7942,7 +8313,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -7951,7 +8321,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -7969,7 +8338,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", - "license": "MIT", "dependencies": { "tiny-invariant": "^1.0.6" } @@ -7978,16 +8346,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "license": "ISC", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "engines": { "node": "^10 || ^12 || >=14" }, @@ -7999,7 +8365,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -8014,15 +8379,14 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "license": "MIT", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -8039,26 +8403,10 @@ "webpack": "^5.0.0" } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/css-minimizer-webpack-plugin": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "license": "MIT", "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -8096,7 +8444,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -8108,28 +8455,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -8140,19 +8469,17 @@ "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -8166,7 +8493,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -8181,7 +8507,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -8196,14 +8521,12 @@ "node_modules/css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "license": "MIT" + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "node_modules/css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -8211,29 +8534,21 @@ } }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dependencies": { - "mdn-data": "2.0.14", + "mdn-data": "2.0.4", "source-map": "^0.6.1" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/css-unit-converter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", - "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", - "license": "MIT" - }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -8242,20 +8557,24 @@ } }, "node_modules/cssdb": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.4.1.tgz", - "integrity": "sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ==", - "license": "CC0-1.0", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.1.tgz", + "integrity": "sha512-fqy6ZnNfpb8qAvTT0qijWyTsUmYThsDX2F2ctMG4ceI7mI4DtsMILSiMBiuuDnVIYTyWvCctdp9Nb08p/6m2SQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -8267,7 +8586,6 @@ "version": "5.1.15", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "license": "MIT", "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", @@ -8288,7 +8606,6 @@ "version": "5.2.14", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "license": "MIT", "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", @@ -8331,7 +8648,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -8343,7 +8659,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, @@ -8351,17 +8666,32 @@ "node": ">=8.0.0" } }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "license": "MIT" + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -8372,31 +8702,27 @@ "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "license": "MIT" + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", - "license": "MIT" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "license": "MIT" + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" }, "node_modules/cypress": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz", - "integrity": "sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==", + "version": "13.6.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.3.tgz", + "integrity": "sha512-d/pZvgwjAyZsoyJ3FOsJT5lDsqnxQ/clMqnNc++rkHjbkkiF2h9s0JsZSyyH4QXhVFW3zPFg82jD25roFLOdZA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", @@ -8408,10 +8734,10 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", @@ -8426,12 +8752,13 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -8441,96 +8768,20 @@ "cypress": "bin/cypress" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz", - "integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cypress/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cypress/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/cypress/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/cypress/node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, "node_modules/cypress/node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cypress/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "dev": true }, "node_modules/cypress/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8542,22 +8793,14 @@ } }, "node_modules/d3-array": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", - "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", "engines": { "node": ">=12" } @@ -8566,7 +8809,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -8575,7 +8817,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", "engines": { "node": ">=12" } @@ -8584,7 +8825,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -8593,10 +8833,9 @@ } }, "node_modules/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "license": "ISC", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "engines": { "node": ">=12" } @@ -8604,14 +8843,12 @@ "node_modules/d3-polygon": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -8623,23 +8860,32 @@ "node": ">=12" } }, - "node_modules/d3-shape": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", - "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "license": "ISC", + "node_modules/d3-scale/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dependencies": { - "d3-path": "1 - 3" + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" }, "engines": { "node": ">=12" } }, "node_modules/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "license": "ISC", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { "d3-array": "2 - 3" }, @@ -8651,7 +8897,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -8659,11 +8904,21 @@ "node": ">=12" } }, + "node_modules/d3-time/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-timer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", "engines": { "node": ">=12" } @@ -8671,15 +8926,13 @@ "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "license": "BSD-2-Clause" + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -8691,7 +8944,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "license": "MIT", "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -8701,36 +8953,52 @@ "node": ">=10" } }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/date-arithmetic": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz", - "integrity": "sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==", - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.1.tgz", - "integrity": "sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==", - "license": "MIT", - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } + "integrity": "sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==" }, "node_modules/dayjs": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", - "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", - "license": "MIT" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/dayjs-business-days2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/dayjs-business-days2/-/dayjs-business-days2-1.2.2.tgz", + "integrity": "sha512-tYwNKeMxuNEpGw2k5j/KTcH0c1lV+41wfqkTN21OvP2hwZFnpM4dH2biaOI2gElRmJOQQxkKByuH5bZPlea/Jg==", + "dependencies": { + "dayjs": "^1.11.10" + } }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -8743,51 +9011,39 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "license": "MIT" + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", "engines": { - "node": ">=0.10" + "node": ">=14.16" } }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "license": "MIT" + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "node_modules/deep-diff": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -8796,16 +9052,17 @@ } }, "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "license": "MIT", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", + "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -8813,26 +9070,11 @@ "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8844,14 +9086,12 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "license": "MIT", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } @@ -8860,7 +9100,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -8868,21 +9107,74 @@ "node": ">= 10" } }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -8893,36 +9185,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, "node_modules/denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "license": "Apache-2.0", "engines": { "node": ">=0.10" } @@ -8931,7 +9205,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8940,7 +9213,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -8949,7 +9221,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8959,7 +9230,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -8967,14 +9237,12 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port-alt": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -8991,7 +9259,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8999,37 +9266,17 @@ "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -9038,7 +9285,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -9047,7 +9293,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/dinero.js/-/dinero.js-1.9.1.tgz", "integrity": "sha512-1HXiF2vv3ZeRQ23yr+9lFxj/PbZqutuYWJnE0qfCB9xYBPnuaJ8lXtli1cJM0TvUXW1JTOaePldmqN5JVNxKSA==", - "license": "MIT", "engines": { "node": "*" } @@ -9056,7 +9301,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -9067,20 +9311,17 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "license": "MIT" + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "license": "MIT", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -9089,35 +9330,26 @@ } }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-align": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.3.tgz", - "integrity": "sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==", - "license": "MIT" + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -9126,17 +9358,20 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, + "node_modules/dom-scroll-into-view": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz", + "integrity": "sha512-LwNVg3GJOprWDO+QhLL1Z9MMgWe/KAFLxVWKzjRTxNSPn8/LLDIfmuG71YHznXCqaqTjvHJDYO1MEAgX6XCNbQ==" + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -9155,14 +9390,13 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "license": "MIT", + "deprecated": "Use your platform's native DOMException instead", "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -9174,7 +9408,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", "engines": { "node": ">=8" } @@ -9183,7 +9416,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -9198,7 +9430,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -9212,45 +9443,42 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", - "license": "BSD-2-Clause", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "license": "BSD-2-Clause" + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", - "license": "ISC" + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, - "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -9259,14 +9487,12 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "license": "Apache-2.0", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dependencies": { "jake": "^10.8.5" }, @@ -9278,16 +9504,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.315", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", - "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", - "license": "ISC" + "version": "1.4.611", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.611.tgz", + "integrity": "sha512-ZtRpDxrjHapOwxtv+nuth5ByB8clyn8crVynmRNGO3wG3LOp8RTcyZDqwaI6Ng6y8FCK2hVZmJoqwCskKbNMaw==" }, "node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -9296,16 +9520,14 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -9314,7 +9536,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9324,20 +9545,18 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/engine.io-client": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", - "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", - "license": "MIT", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", + "engine.io-parser": "~5.2.1", "ws": "~8.11.0", "xmlhttprequest-ssl": "~2.0.0" } @@ -9346,7 +9565,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9364,19 +9582,17 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "license": "MIT", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", "engines": { "node": ">=10.0.0" } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "license": "MIT", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -9389,7 +9605,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/enquire-js/-/enquire-js-0.2.1.tgz", "integrity": "sha512-4vbcWD0ncK6VQ5M5giOImQb2hFPrKDZH5U+uRX9S6e9vfC6Q5PX6A38PVS6RMnCdr/luDTtJjjLuJinH/+a+Lw==", - "license": "MIT", "dependencies": { "enquire.js": "^2.1.6" } @@ -9397,17 +9612,16 @@ "node_modules/enquire.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", - "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==", - "license": "MIT" + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -9417,7 +9631,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -9426,7 +9639,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", - "license": "MIT", "dependencies": { "commander": "^4.0.0", "cross-spawn": "^7.0.0" @@ -9442,7 +9654,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -9451,7 +9662,6 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "license": "MIT", "optional": true, "dependencies": { "prr": "~1.0.1" @@ -9464,7 +9674,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -9473,103 +9682,54 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "license": "MIT", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-abstract/node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9581,14 +9741,13 @@ "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "license": "MIT" + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/es-get-iterator": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "license": "MIT", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -9604,40 +9763,57 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "license": "MIT" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "license": "MIT", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -9654,7 +9830,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "license": "MIT", "engines": { "node": ">=6" } @@ -9662,28 +9837,24 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "license": "BSD-2-Clause", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -9696,57 +9867,28 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", - "license": "MIT", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -9754,23 +9896,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -9787,7 +9925,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -9812,30 +9949,27 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "license": "MIT", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "license": "MIT", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dependencies": { "debug": "^3.2.7" }, @@ -9852,19 +9986,17 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-cypress": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", - "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz", + "integrity": "sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==", "dev": true, - "license": "MIT", "dependencies": { - "globals": "^11.12.0" + "globals": "^13.20.0" }, "peerDependencies": { "eslint": ">= 3.2.1" @@ -9874,7 +10006,6 @@ "version": "8.0.3", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "license": "BSD-3-Clause", "dependencies": { "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" @@ -9889,26 +10020,27 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "license": "MIT", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -9917,20 +10049,57 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0" }, @@ -9951,27 +10120,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "license": "MIT", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -9980,74 +10148,44 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "license": "Apache-2.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "license": "MIT", + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "license": "MIT", + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "license": "MIT", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -10057,7 +10195,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -10071,7 +10209,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -10079,13 +10216,43 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "license": "MIT", + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "is-core-module": "^2.9.0", + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -10096,13 +10263,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-testing-library": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.2.tgz", - "integrity": "sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==", - "license": "MIT", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", "dependencies": { - "@typescript-eslint/utils": "^5.43.0" + "@typescript-eslint/utils": "^5.58.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0", @@ -10113,68 +10287,35 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "license": "Apache-2.0", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-webpack-plugin": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "license": "MIT", "dependencies": { "@types/eslint": "^7.29.0 || ^8.4.1", "jest-worker": "^28.0.2", @@ -10198,7 +10339,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -10210,28 +10350,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -10243,7 +10365,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -10256,19 +10377,17 @@ "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -10282,7 +10401,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10296,26 +10414,21 @@ "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -10323,51 +10436,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10375,15 +10447,25 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "license": "BSD-2-Clause", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "acorn": "^8.8.0", + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -10396,7 +10478,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -10406,10 +10487,9 @@ } }, "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", - "license": "BSD-3-Clause", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dependencies": { "estraverse": "^5.1.0" }, @@ -10421,7 +10501,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -10433,7 +10512,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -10441,14 +10519,12 @@ "node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "license": "MIT" + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -10457,27 +10533,25 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter2": { "version": "6.4.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -10486,26 +10560,25 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz", "integrity": "sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==", - "license": "MIT", "optional": true, "engines": { "node": ">=0.12.0" } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" }, "engines": { @@ -10515,24 +10588,11 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/executable": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^2.2.0" }, @@ -10543,14 +10603,12 @@ "node_modules/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", - "license": "BSD-3-Clause" + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "node_modules/exifr": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", - "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==", - "license": "MIT" + "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==" }, "node_modules/exit": { "version": "0.1.2", @@ -10564,7 +10622,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -10579,7 +10636,6 @@ "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -10617,20 +10673,15 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -10638,28 +10689,38 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "license": "MIT" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -10682,26 +10743,17 @@ "dev": true, "engines": [ "node >=0.6.0" - ], - "license": "MIT" + ] }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz", - "integrity": "sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "license": "MIT", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10713,23 +10765,31 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "license": "ISC", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dependencies": { "reusify": "^1.0.4" } @@ -10738,7 +10798,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -10747,10 +10806,9 @@ } }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "license": "Apache-2.0", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dependencies": { "bser": "2.1.1" } @@ -10759,7 +10817,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -10769,7 +10826,6 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -10784,7 +10840,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -10796,7 +10851,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -10816,25 +10870,14 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "license": "ISC", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10846,7 +10889,6 @@ "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "license": "BSD-3-Clause", "engines": { "node": ">= 0.4.0" } @@ -10855,7 +10897,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -10864,19 +10905,20 @@ } }, "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -10894,7 +10936,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -10902,14 +10943,12 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -10922,11 +10961,32 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -10939,46 +10999,53 @@ } }, "node_modules/firebase": { - "version": "9.17.1", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.17.1.tgz", - "integrity": "sha512-MSZaTRaaRLgDFLqoEnoPYK8zkLwQNvYeLZ3YSKdcQxG8hDifNO22ywS1cSA1ZCGHlQeOsDtfDwBejKcANf/RQw==", - "license": "Apache-2.0", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.7.2.tgz", + "integrity": "sha512-zED3kAJyf+Xx5tXpC3vjmlWTm/SIVoJJ6MOLuXYJkqKAUJLG7Q1Jxy6l1DxCzGgBqZHxc0Jh6q+qG++9kimHsw==", "dependencies": { - "@firebase/analytics": "0.9.3", - "@firebase/analytics-compat": "0.2.3", - "@firebase/app": "0.9.3", - "@firebase/app-check": "0.6.3", - "@firebase/app-check-compat": "0.3.3", - "@firebase/app-compat": "0.2.3", + "@firebase/analytics": "0.10.0", + "@firebase/analytics-compat": "0.2.6", + "@firebase/app": "0.9.26", + "@firebase/app-check": "0.8.1", + "@firebase/app-check-compat": "0.3.8", + "@firebase/app-compat": "0.2.26", "@firebase/app-types": "0.9.0", - "@firebase/auth": "0.21.3", - "@firebase/auth-compat": "0.3.3", - "@firebase/database": "0.14.3", - "@firebase/database-compat": "0.3.3", - "@firebase/firestore": "3.8.3", - "@firebase/firestore-compat": "0.3.3", - "@firebase/functions": "0.9.3", - "@firebase/functions-compat": "0.3.3", - "@firebase/installations": "0.6.3", - "@firebase/installations-compat": "0.2.3", - "@firebase/messaging": "0.12.3", - "@firebase/messaging-compat": "0.2.3", - "@firebase/performance": "0.6.3", - "@firebase/performance-compat": "0.2.3", - "@firebase/remote-config": "0.4.3", - "@firebase/remote-config-compat": "0.2.3", - "@firebase/storage": "0.11.1", - "@firebase/storage-compat": "0.3.1", - "@firebase/util": "1.9.2" + "@firebase/auth": "1.5.1", + "@firebase/auth-compat": "0.5.1", + "@firebase/database": "1.0.2", + "@firebase/database-compat": "1.0.2", + "@firebase/firestore": "4.4.1", + "@firebase/firestore-compat": "0.3.24", + "@firebase/functions": "0.11.0", + "@firebase/functions-compat": "0.3.6", + "@firebase/installations": "0.6.4", + "@firebase/installations-compat": "0.2.4", + "@firebase/messaging": "0.12.5", + "@firebase/messaging-compat": "0.2.5", + "@firebase/performance": "0.6.4", + "@firebase/performance-compat": "0.2.4", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-compat": "0.2.4", + "@firebase/storage": "0.12.0", + "@firebase/storage-compat": "0.3.3", + "@firebase/util": "1.9.3" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -10986,16 +11053,14 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "license": "ISC" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/flubber": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/flubber/-/flubber-0.4.2.tgz", "integrity": "sha512-79RkJe3rA4nvRCVc2uXjj7U/BAUq84TS3KHn6c0Hr9K64vhj83ZNLUziNx4pJoBumSPhOl5VjH+Z0uhi+eE8Uw==", - "license": "MIT", "dependencies": { "d3-array": "^1.2.0", "d3-polygon": "^1.0.3", @@ -11005,29 +11070,21 @@ "topojson-client": "^3.0.0" } }, - "node_modules/flubber/node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", - "license": "BSD-3-Clause" - }, "node_modules/flubber/node_modules/svg-path-properties": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-0.2.2.tgz", - "integrity": "sha512-GmrB+b6woz6CCdQe6w1GHs/1lt25l7SR5hmhF8jRdarpv/OgjLyuQygLu1makJapixeb1aQhP/Oa1iKi93o/aQ==", - "license": "ISC" + "integrity": "sha512-GmrB+b6woz6CCdQe6w1GHs/1lt25l7SR5hmhF8jRdarpv/OgjLyuQygLu1makJapixeb1aQhP/Oa1iKi93o/aQ==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -11041,38 +11098,23 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, - "node_modules/for-each/node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", - "license": "MIT", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -11107,11 +11149,19 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -11123,11 +11173,40 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -11141,26 +11220,10 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -11169,7 +11232,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -11183,29 +11245,26 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "license": "MIT", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11214,7 +11273,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -11226,16 +11284,14 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "license": "Unlicense" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -11251,21 +11307,22 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "license": "MIT", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -11278,84 +11335,14 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -11364,20 +11351,19 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "license": "MIT", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11386,14 +11372,12 @@ "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -11403,7 +11387,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -11418,7 +11401,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -11435,7 +11417,6 @@ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", "dev": true, - "license": "MIT", "dependencies": { "async": "^3.2.0" } @@ -11445,55 +11426,49 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "license": "ISC", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", + "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, - "license": "MIT", "dependencies": { "ini": "2.0.0" }, @@ -11508,7 +11483,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -11520,7 +11494,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -11533,14 +11506,12 @@ "node_modules/global-prefix/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -11554,19 +11525,23 @@ "integrity": "sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA==" }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -11581,7 +11556,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -11601,7 +11575,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -11610,22 +11583,19 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "license": "MIT" + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", - "license": "MIT", + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -11634,7 +11604,6 @@ "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -11649,7 +11618,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -11663,32 +11631,17 @@ "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "license": "(Apache-2.0 OR MPL-1.1)" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11697,18 +11650,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11718,7 +11669,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11730,7 +11680,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11742,7 +11691,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -11753,41 +11701,29 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "license": "ISC" + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", "bin": { "he": "bin/he" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -11796,7 +11732,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "license": "MIT", "engines": { "node": ">= 6.0.0" } @@ -11805,7 +11740,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -11813,11 +11747,42 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "license": "MIT", "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -11826,22 +11791,29 @@ } }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "license": "MIT" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -11862,7 +11834,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", "engines": { "node": ">= 12" } @@ -11871,16 +11842,14 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "license": "MIT", "dependencies": { "void-elements": "3.1.0" } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "license": "MIT", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.4.tgz", + "integrity": "sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -11910,7 +11879,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -11921,14 +11889,12 @@ "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -11943,14 +11909,12 @@ "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "license": "MIT" + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -11964,7 +11928,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -11978,7 +11941,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -12003,7 +11965,6 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", @@ -12017,7 +11978,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -12027,18 +11987,18 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=8.12.0" } }, "node_modules/i18next": { - "version": "22.4.10", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.10.tgz", - "integrity": "sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA==", + "version": "23.7.16", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.7.16.tgz", + "integrity": "sha512-SrqFkMn9W6Wb43ZJ9qrO6U2U4S80RsFMA7VYFSqp7oc7RllQOYDCdRfsse6A7Cq/V8MnpxKvJCYgM8++27n4Fw==", "funding": [ { "type": "individual", @@ -12053,51 +12013,24 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], - "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.6" + "@babel/runtime": "^7.23.2" } }, "node_modules/i18next-browser-languagedetector": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz", - "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==", - "license": "MIT", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz", + "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==", "dependencies": { - "@babel/runtime": "^7.19.4" - } - }, - "node_modules/i18next-browser-languagedetector/node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/i18next/node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" + "@babel/runtime": "^7.23.2" } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -12107,7 +12040,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -12116,16 +12048,14 @@ } }, "node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "license": "ISC" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "license": "MIT", "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -12151,14 +12081,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "license": "MIT", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "engines": { "node": ">= 4" } @@ -12167,7 +12095,6 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -12177,26 +12104,23 @@ } }, "node_modules/immer": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", - "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", - "license": "MIT", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" } }, "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "license": "MIT" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -12208,20 +12132,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -12240,7 +12154,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -12250,7 +12163,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12259,7 +12171,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -12268,27 +12179,24 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "license": "MIT", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -12299,7 +12207,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", "engines": { "node": ">=12" } @@ -12308,7 +12215,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -12317,7 +12223,6 @@ "version": "4.28.5", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", - "license": "MIT", "dependencies": { "cluster-key-slot": "^1.1.0", "debug": "^4.3.1", @@ -12339,20 +12244,10 @@ "url": "https://opencollective.com/ioredis" } }, - "node_modules/ioredis/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "engines": { "node": ">= 10" } @@ -12361,7 +12256,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "license": "MIT", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -12374,13 +12269,12 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "license": "MIT", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { @@ -12390,14 +12284,26 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -12409,7 +12315,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -12421,7 +12326,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -12451,16 +12355,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "license": "MIT", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -12473,7 +12375,6 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, - "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -12482,12 +12383,11 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "license": "MIT", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12497,7 +12397,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -12512,7 +12411,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -12527,16 +12425,25 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -12545,16 +12452,28 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -12567,7 +12486,6 @@ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, - "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" @@ -12583,7 +12501,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12591,14 +12508,12 @@ "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "license": "MIT" + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12610,7 +12525,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -12619,7 +12533,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -12634,7 +12547,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12643,7 +12555,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -12652,7 +12563,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -12664,7 +12574,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -12675,14 +12584,12 @@ "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -12698,7 +12605,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12707,7 +12613,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -12716,7 +12621,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12725,7 +12629,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -12737,7 +12640,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -12749,7 +12651,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -12764,7 +12665,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -12776,16 +12676,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "license": "MIT", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -12797,15 +12692,13 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -12817,7 +12710,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12826,7 +12718,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -12838,7 +12729,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -12850,14 +12740,12 @@ "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "license": "MIT" + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -12868,20 +12756,17 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12890,23 +12775,20 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "license": "BSD-3-Clause", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "license": "BSD-3-Clause", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -12918,25 +12800,45 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "license": "BSD-3-Clause", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -12947,10 +12849,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "license": "BSD-3-Clause", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -12962,19 +12863,29 @@ "node_modules/iterall": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", - "license": "MIT" + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } }, "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "license": "Apache-2.0", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -12983,17 +12894,35 @@ "node": ">=10" } }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "license": "MIT" + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" }, "node_modules/jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "license": "MIT", "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -13018,7 +12947,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "execa": "^5.0.0", @@ -13028,11 +12956,51 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/jest-circus": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -13062,7 +13030,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "license": "MIT", "dependencies": { "@jest/core": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -13092,11 +13059,45 @@ } } }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/jest-config": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", @@ -13135,224 +13136,49 @@ } } }, - "node_modules/jest-config/node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/jest-config/node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "license": "MIT", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "*" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-config/node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "license": "MIT", + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "*" } }, - "node_modules/jest-config/node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/jest-config/node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-config/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-config/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/jest-config/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/jest-diff": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", @@ -13367,7 +13193,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -13379,7 +13204,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -13395,7 +13219,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -13413,7 +13236,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -13430,7 +13252,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -13439,7 +13260,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -13465,7 +13285,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/source-map": "^27.5.1", @@ -13493,7 +13312,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "license": "MIT", "dependencies": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" @@ -13506,7 +13324,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", @@ -13521,7 +13338,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -13541,7 +13357,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -13551,10 +13366,9 @@ } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "license": "MIT", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "engines": { "node": ">=6" }, @@ -13571,7 +13385,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -13580,7 +13393,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -13601,7 +13413,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", @@ -13615,7 +13426,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "license": "MIT", "dependencies": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", @@ -13647,7 +13457,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -13676,20 +13485,90 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "license": "MIT", + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/jest-serializer": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "license": "MIT", "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -13702,7 +13581,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -13731,365 +13609,10 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-simple-access/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/@babel/traverse/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-snapshot/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -14106,7 +13629,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", @@ -14123,7 +13645,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -14140,103 +13661,10 @@ "jest": "^27.0.0 || ^28.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "license": "MIT", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "license": "MIT", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "license": "MIT", - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/console": { + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "license": "MIT", "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -14249,11 +13677,18 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/@jest/test-result": { + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "license": "MIT", "dependencies": { "@jest/console": "^28.1.3", "@jest/types": "^28.1.3", @@ -14264,11 +13699,10 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/@jest/types": { + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "license": "MIT", "dependencies": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -14281,20 +13715,18 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "license": "MIT", + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -14302,11 +13734,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watcher/node_modules/emittery": { + "node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -14314,11 +13745,10 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/jest-watcher/node_modules/jest-message-util": { + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^28.1.3", @@ -14334,11 +13764,26 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/jest-util": { + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "license": "MIT", "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -14351,11 +13796,51 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/pretty-format": { + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "license": "MIT", "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -14366,17 +13851,91 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/react-is": { + "node_modules/jest-watch-typeahead/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "license": "MIT" + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -14390,7 +13949,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -14401,42 +13959,36 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "license": "Apache-2.0", "engines": { "node": ">= 0.6.0" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -14449,14 +14001,12 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "license": "MIT", "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -14502,7 +14052,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -14512,88 +14061,89 @@ "node": ">= 6" } }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "license": "BSD-3-Clause", + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" + "punycode": "^2.1.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=10" } }, "node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", - "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==", - "license": "MIT" + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", - "license": "MIT", "dependencies": { "string-convert": "^0.2.0" } }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "license": "MIT", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -14602,27 +14152,25 @@ } }, "node_modules/jsoneditor": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-9.9.0.tgz", - "integrity": "sha512-NHJhyaqcc5U33ah6dEcd0S9b14Auocpe9nydvC9ui7Uq/vjEFnsd7ot6O9Jqwv53B7DmHFUWq5cT4qeWh4MEoA==", - "license": "Apache-2.0", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-10.0.0.tgz", + "integrity": "sha512-yh/kj/Ecxacj7ZG2ynmJvHcESgdHiAe1N7iKUVIYFpeP4/rwp87yua2y0BDayyY6uJz01KgRvdl4W1Wt94EkOQ==", "dependencies": { - "ace-builds": "^1.6.0", + "ace-builds": "^1.32.2", "ajv": "^6.12.6", "javascript-natural-sort": "^0.7.1", "jmespath": "^0.16.0", "json-source-map": "^0.6.1", - "jsonrepair": "^2.2.1", + "jsonrepair": "3.5.0", "mobius1-selectr": "^2.4.13", "picomodal": "^3.0.0", - "vanilla-picker": "^2.12.1" + "vanilla-picker": "^2.12.2" } }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -14630,20 +14178,40 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/jsonrepair": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-2.2.1.tgz", - "integrity": "sha512-o9Je8TceILo872uQC9fIBJm957j1Io7z8Ca1iWIqY6S5S65HGE9XN7XEEw7+tUviB9Vq4sygV89MVTxl+rhZyg==", - "license": "ISC", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.5.0.tgz", + "integrity": "sha512-SavvDsUP9Xnqo2MoC6Wl6zNyX3f+I5199hRbXBtAITyP2NTPyAgyx5xM0bgcIljRjzsIvOBANbgfWe8XXlyeLA==", "bin": { "jsonrepair": "bin/cli.js" } @@ -14656,7 +14224,6 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -14667,27 +14234,34 @@ "node_modules/jsreport-browser-client-dist": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsreport-browser-client-dist/-/jsreport-browser-client-dist-1.3.0.tgz", - "integrity": "sha512-E83cVmxQ5np3rxns6dhFu15m5kZ5yXJDIyfbHjLPxO0AZXVQOuMrdvYsUCj+j/ZSaiROoBCstZRO7pa4HmZNGw==", - "license": "MIT" + "integrity": "sha512-E83cVmxQ5np3rxns6dhFu15m5kZ5yXJDIyfbHjLPxO0AZXVQOuMrdvYsUCj+j/ZSaiROoBCstZRO7pa4HmZNGw==" }, "node_modules/jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", - "license": "MIT", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.2" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14696,16 +14270,14 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "license": "MIT", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "engines": { "node": ">= 8" } @@ -14713,16 +14285,26 @@ "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "license": "CC0-1.0" + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "license": "MIT", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" } }, "node_modules/lazy-ass": { @@ -14730,16 +14312,14 @@ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", "dev": true, - "license": "MIT", "engines": { "node": "> 0.8" } }, "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", - "license": "Apache-2.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -14762,17 +14342,11 @@ } }, "node_modules/less-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", - "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", - "license": "MIT", - "dependencies": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz", + "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==", "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -14780,48 +14354,13 @@ }, "peerDependencies": { "less": "^3.5.0 || ^4.0.0", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "license": "MIT", - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" + "webpack": "^5.0.0" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", "engines": { "node": ">=6" } @@ -14830,7 +14369,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -14839,38 +14377,15 @@ "node": ">= 0.8.0" } }, - "node_modules/levn/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/levn/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/libphonenumber-js": { - "version": "1.10.21", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.21.tgz", - "integrity": "sha512-/udZhx49av2r2gZR/+xXSrwcR8smX/sDNrVpOFrvW+CA26TfYTVZfwb3MIDvmwAYMLs7pXuJjZX0VxxGpqPhsA==", - "license": "MIT" + "version": "1.10.53", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.53.tgz", + "integrity": "sha512-sDTnnqlWK4vH4AlDQuswz3n4Hx7bIQWTpIcScJX+Sp7St3LXHmfiax/ZFfyYxHmkdCvydOLSuvtAO/XpXiSySw==" }, "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "engines": { "node": ">=10" } @@ -14878,15 +14393,13 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", "dev": true, - "license": "MIT", "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.16", @@ -14909,20 +14422,33 @@ } } }, + "node_modules/listr2/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "license": "MIT", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14936,7 +14462,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -14950,100 +14475,89 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "node_modules/lodash.eq": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lodash.eq/-/lodash.eq-4.0.0.tgz", - "integrity": "sha512-vbrJpXL6kQNG6TkInxX12DZRfuYVllSxhwYqjYB78g2zF3UI15nFO/0AgmZnZRnaQ38sZtjCiVjGr2rnKt4v0g==", - "license": "MIT" + "integrity": "sha512-vbrJpXL6kQNG6TkInxX12DZRfuYVllSxhwYqjYB78g2zF3UI15nFO/0AgmZnZRnaQ38sZtjCiVjGr2rnKt4v0g==" }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, "node_modules/lodash.indexof": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/lodash.indexof/-/lodash.indexof-4.0.5.tgz", - "integrity": "sha512-t9wLWMQsawdVmf6/IcAgVGqAJkNzYVcn4BHYZKTPW//l7N5Oq7Bq138BaVk19agcsPZePcidSgTTw4NqS1nUAw==", - "license": "MIT" + "integrity": "sha512-t9wLWMQsawdVmf6/IcAgVGqAJkNzYVcn4BHYZKTPW//l7N5Oq7Bq138BaVk19agcsPZePcidSgTTw4NqS1nUAw==" }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "license": "MIT" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "license": "MIT" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -15060,7 +14574,6 @@ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", @@ -15079,7 +14592,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -15097,7 +14609,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15108,22 +14619,19 @@ } }, "node_modules/logrocket": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/logrocket/-/logrocket-3.0.1.tgz", - "integrity": "sha512-jOWG+jEzobKVxGytzZ+4KGm2kiMQMRTHab2uDWQyVZcHfEF38BlCH1yjQVY4LCmuQUwZitP9biMzJZnyUQ0dtQ==", - "license": "MIT" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/logrocket/-/logrocket-7.0.0.tgz", + "integrity": "sha512-IvM4RKYTAByljKTWCx/Q+58Nvt4Dmf/0PIHLfall3kqDtxiDSVKSzu3/bvGb3riHE/C7xY3wzLxy6v+Wui1NUQ==" }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -15135,115 +14643,121 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, "engines": { - "node": ">=10" + "node": "14 || >=16.14" } }, "node_modules/luxon": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", - "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", - "license": "MIT", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } }, "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, - "license": "WTFPL", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "license": "MIT", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, "dependencies": { - "semver": "^6.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/markerjs2": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.28.1.tgz", - "integrity": "sha512-Hx1JixKfkP0hCKhl1qfNuP90Z9MVjHKAjMRo2xyU3fZVQuwaHO2qx1u8NqCeRqA/QuZqBlsU+FLdNkoazgsiSQ==", - "license": "SEE LICENSE IN LICENSE" + "version": "2.31.5", + "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.31.5.tgz", + "integrity": "sha512-fOk0IPfqmwdmKlcaf9qfD8SnBBEzJtgl6NVcDOQpUJAcyyk6/wkA4m410NQ8mD7B42WdjkAzAGj2BMxHsSYthQ==" }, "node_modules/material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", - "license": "ISC" + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "license": "Unlicense", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -15252,26 +14766,22 @@ "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "license": "MIT" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -15280,7 +14790,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15289,7 +14798,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -15301,14 +14809,12 @@ "node_modules/microseconds": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", - "license": "MIT" + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -15320,7 +14826,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15329,7 +14834,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -15341,30 +14845,14 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", - "license": "MIT", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dependencies": { "schema-utils": "^4.0.0" }, @@ -15383,7 +14871,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -15395,28 +14882,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -15427,19 +14896,17 @@ "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -15452,32 +14919,44 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "license": "MIT" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -15488,32 +14967,20 @@ "node_modules/mobius1-selectr": { "version": "2.4.13", "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", - "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==", - "license": "MIT" + "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "license": "MIT", "engines": { "node": "*" } }, - "node_modules/moment-business-days": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/moment-business-days/-/moment-business-days-1.2.0.tgz", - "integrity": "sha512-QJlceLfMSxy/jZSOgJYCKeKw+qGYHj8W0jMa/fYruyoJ85+bJuLRiYv5DIaflyuRipmYRfD4kDlSwVYteLN+Jw==", - "license": "MIT", - "peerDependencies": { - "moment": "2.x.x" - } - }, "node_modules/moment-timezone": { - "version": "0.5.41", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.41.tgz", - "integrity": "sha512-e0jGNZDOHfBXJGz8vR/sIMXvBIGJJcqFjmlg9lmE+5KX1U7/RZNMswfD8nKnNCnQdKTIj50IaRKwl1fvMLyyRg==", - "license": "MIT", + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", "dependencies": { "moment": "^2.29.4" }, @@ -15522,16 +14989,14 @@ } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -15540,20 +15005,34 @@ "multicast-dns": "cli.js" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nano-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", - "license": "ISC", "dependencies": { "big-integer": "^1.6.16" } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "license": "MIT", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -15564,23 +15043,19 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "license": "MIT" + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" }, "node_modules/needle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", - "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", - "license": "MIT", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "optional": true, "dependencies": { - "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, @@ -15591,34 +15066,10 @@ "node": ">= 4.4.x" } }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15626,24 +15077,21 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -15659,33 +15107,10 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -15693,20 +15118,17 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15715,7 +15137,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15724,7 +15145,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -15736,7 +15156,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -15744,24 +15163,10 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -15769,27 +15174,15 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "license": "MIT" + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15798,16 +15191,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "license": "MIT", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15816,7 +15207,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "license": "MIT", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -15832,20 +15223,18 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "license": "MIT", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -15856,28 +15245,26 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "license": "MIT", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "license": "MIT", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -15887,15 +15274,15 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "license": "MIT", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "dependencies": { - "array.prototype.reduce": "^1.0.4", + "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" }, "engines": { "node": ">= 0.8" @@ -15904,28 +15291,37 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "license": "MIT", + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "license": "MIT", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -15937,20 +15333,22 @@ "node_modules/oblivious-set": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", - "license": "MIT" + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/omit.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-2.0.2.tgz", + "integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -15962,7 +15360,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15971,7 +15368,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -15980,7 +15376,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -15995,7 +15390,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -16009,20 +15403,20 @@ } }, "node_modules/optimism": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz", - "integrity": "sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==", - "license": "MIT", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", + "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", "dependencies": { - "@wry/context": "^0.6.0", - "@wry/trie": "^0.3.0" + "@wry/caches": "^1.0.0", + "@wry/context": "^0.7.0", + "@wry/trie": "^0.4.3", + "tslib": "^2.3.0" } }, - "node_modules/optimism/node_modules/@wry/context": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz", - "integrity": "sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw==", - "license": "MIT", + "node_modules/optimism/node_modules/@wry/trie": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", "dependencies": { "tslib": "^2.3.0" }, @@ -16031,38 +15425,16 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "license": "MIT", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -16072,44 +15444,12 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -16120,14 +15460,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "aggregate-error": "^3.0.0" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" @@ -16136,11 +15474,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -16153,7 +15498,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -16162,7 +15506,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -16172,7 +15515,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -16184,7 +15526,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -16202,7 +15543,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -16210,14 +15550,12 @@ "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -16226,7 +15564,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -16236,7 +15573,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16245,7 +15581,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16254,7 +15589,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16262,29 +15596,42 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "license": "MIT", + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, "dependencies": { - "isarray": "0.0.1" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16292,20 +15639,17 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/phone": { - "version": "3.1.35", - "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.35.tgz", - "integrity": "sha512-OEF2yXxJ2kTzMECk+ymbAmbYuucBNIMeYcqsiZD5Kz2QrRAP2BOEuerqalaC/chkAHLH3MXWKRK3qu07AvlRuQ==", - "license": "MIT", + "version": "3.1.42", + "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.42.tgz", + "integrity": "sha512-J+cbZtGcN/ph10TRxwCLYZx9/k4WOU1wImMiUiUjr/2sWnY7bR7CadehbsM8E9UyG+/shgmH++eKbhD0kR4EZA==", "engines": { "node": ">=12" } @@ -16313,14 +15657,12 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "license": "ISC" + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -16331,23 +15673,20 @@ "node_modules/picomodal": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz", - "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==", - "license": "MIT" + "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==" }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "license": "MIT", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } @@ -16356,7 +15695,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -16368,7 +15706,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -16381,7 +15718,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -16389,11 +15725,24 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -16405,7 +15754,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -16417,7 +15765,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -16429,7 +15776,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -16438,11 +15784,24 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -16454,15 +15813,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "funding": [ { "type": "opencollective", @@ -16471,11 +15829,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -16487,7 +15848,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -16506,7 +15866,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "license": "CC0-1.0", "engines": { "node": ">=8" }, @@ -16519,7 +15878,6 @@ "version": "8.2.4", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" @@ -16532,7 +15890,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16547,7 +15904,6 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16566,7 +15922,6 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16585,7 +15940,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16604,7 +15958,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -16622,7 +15975,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -16638,7 +15990,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16657,7 +16008,6 @@ "version": "12.1.11", "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16676,7 +16026,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -16695,7 +16044,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -16714,7 +16062,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -16726,7 +16073,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -16738,7 +16084,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -16750,7 +16095,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -16762,7 +16106,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -16782,7 +16125,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16797,7 +16139,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "license": "MIT", "peerDependencies": { "postcss": "^8.1.4" } @@ -16806,7 +16147,6 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -16821,7 +16161,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -16836,7 +16175,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } @@ -16845,7 +16183,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -16861,7 +16198,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -16877,17 +16213,16 @@ } }, "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "license": "MIT", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" @@ -16897,7 +16232,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } @@ -16906,7 +16240,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -16925,7 +16258,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -16942,20 +16274,25 @@ } }, "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">= 14" }, "peerDependencies": { "postcss": ">=8.0.9", @@ -16970,11 +16307,26 @@ } } }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -16992,35 +16344,10 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -17032,7 +16359,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -17044,7 +16370,6 @@ "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" @@ -17060,7 +16385,6 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -17078,7 +16402,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17093,7 +16416,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "license": "MIT", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -17110,7 +16432,6 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", @@ -17127,7 +16448,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -17142,7 +16462,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -17151,10 +16470,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -17171,7 +16489,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -17186,7 +16503,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -17198,12 +16514,11 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -17220,7 +16535,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -17240,7 +16554,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "license": "CC0-1.0", "dependencies": { "@csstools/normalize.css": "*", "postcss-browser-comments": "^4", @@ -17258,7 +16571,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -17270,7 +16582,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17285,7 +16596,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17300,7 +16610,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17315,7 +16624,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17330,7 +16638,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17345,7 +16652,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -17361,7 +16667,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "license": "MIT", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -17377,7 +16682,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -17389,7 +16693,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17414,7 +16717,6 @@ "url": "https://liberapay.com/mrcgrtz" } ], - "license": "MIT", "engines": { "node": "^12 || ^14 || >=16" }, @@ -17426,7 +16728,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "license": "MIT", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -17442,7 +16743,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17461,7 +16761,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", "peerDependencies": { "postcss": "^8" } @@ -17470,7 +16769,6 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17489,7 +16787,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.1.1", "@csstools/postcss-color-function": "^1.1.1", @@ -17556,7 +16853,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -17575,7 +16871,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" @@ -17591,7 +16886,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -17606,7 +16900,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } @@ -17615,7 +16908,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -17631,10 +16923,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "license": "MIT", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17647,7 +16938,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" @@ -17663,16 +16953,31 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", "engines": { "node": ">= 10" } }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "node_modules/postcss-svgo/node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -17693,7 +16998,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -17707,13 +17011,12 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "engines": { "node": ">= 0.8.0" } @@ -17722,7 +17025,6 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "license": "MIT", "engines": { "node": ">=6" }, @@ -17734,7 +17036,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -17744,7 +17045,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -17758,7 +17058,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -17769,14 +17068,12 @@ "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/preval.macro": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz", "integrity": "sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==", - "license": "MIT", "dependencies": { "babel-plugin-preval": "^5.0.0" }, @@ -17784,27 +17081,33 @@ "node": ">=10" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "license": "MIT", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dependencies": { "asap": "~2.0.6" } @@ -17813,7 +17116,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -17826,7 +17128,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -17834,11 +17135,10 @@ } }, "node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, - "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -17850,20 +17150,17 @@ "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", "@types/node": ">=13.7.0", - "long": "^4.0.0" + "long": "^5.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "engines": { + "node": ">=12.0.0" } }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -17876,7 +17173,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -17884,38 +17180,33 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "license": "MIT", "optional": true }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -17924,17 +17215,24 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "license": "MIT", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" } }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -17946,23 +17244,26 @@ } }, "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz", + "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==", "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -17980,26 +17281,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + ] }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", "dependencies": { "performance-now": "^2.1.0" } @@ -18007,14 +17294,12 @@ "node_modules/raf-schd": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", - "license": "MIT" + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -18023,7 +17308,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -18032,7 +17316,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -18043,36 +17326,59 @@ "node": ">= 0.8" } }, - "node_modules/rc-align": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.12.tgz", - "integrity": "sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==", - "license": "MIT", + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "dom-align": "^1.7.0", - "lodash": "^4.17.21", - "rc-util": "^5.3.0", - "resize-observer-polyfill": "^1.5.1" + "safer-buffer": ">= 2.1.2 < 3" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc-animate": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.1.1.tgz", + "integrity": "sha512-8wg2Zg3EETy0k/9kYuis30NJNQg1D6/WSQwnCiz6SvyxQXNet/rVraRz3bPngwY6rcU2nlRvoShiYOorXyF7Sg==", + "dependencies": { + "@ant-design/css-animation": "^1.7.2", + "classnames": "^2.2.6", + "raf": "^3.4.0", + "rc-util": "^4.15.3" + } + }, + "node_modules/rc-animate/node_modules/rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "dependencies": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" } }, "node_modules/rc-cascader": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", - "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", - "license": "MIT", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.21.0.tgz", + "integrity": "sha512-7aADjbfqiR4HrTHG9S019p2jeKM/AxISPA5+sBJR7Mlhm/i+lR7VjBju3KQulJNJLKNEnQYg4TFhcPf2SLua9g==", "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", "classnames": "^2.3.1", - "rc-select": "~14.1.0", - "rc-tree": "~5.7.0", - "rc-util": "^5.6.1" + "rc-select": "~14.11.0-0", + "rc-tree": "~5.8.1", + "rc-util": "^5.37.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18080,13 +17386,13 @@ } }, "node_modules/rc-checkbox": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", - "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", "dependencies": { "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" + "classnames": "^2.3.2", + "rc-util": "^5.25.2" }, "peerDependencies": { "react": ">=16.9.0", @@ -18094,16 +17400,14 @@ } }, "node_modules/rc-collapse": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", - "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", - "license": "MIT", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.2.tgz", + "integrity": "sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.3.4", - "rc-util": "^5.2.1", - "shallowequal": "^1.1.0" + "rc-util": "^5.27.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18111,10 +17415,9 @@ } }, "node_modules/rc-dialog": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", - "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", - "license": "MIT", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz", + "integrity": "sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", @@ -18128,15 +17431,15 @@ } }, "node_modules/rc-drawer": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.3.tgz", - "integrity": "sha512-AvHisO90A+xMLMKBw2zs89HxjWxusM2BUABlgK60RhweIHF8W/wk0hSOrxBlUXoA9r1F+10na3g6GZ97y1qDZA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.0.0.tgz", + "integrity": "sha512-ePcS4KtQnn57bCbVXazHN2iC8nTPCXlWEIA/Pft87Pd9U7ZeDkdRzG47jWG2/TAFXFlFltRAMcslqmUM8NPCGA==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-6", + "@rc-component/portal": "^1.1.1", "classnames": "^2.2.6", "rc-motion": "^2.6.1", - "rc-util": "^5.21.2" + "rc-util": "^5.36.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18144,14 +17447,13 @@ } }, "node_modules/rc-dropdown": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", - "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", "dependencies": { "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.0", "classnames": "^2.2.6", - "rc-trigger": "^5.3.1", "rc-util": "^5.17.0" }, "peerDependencies": { @@ -18160,14 +17462,13 @@ } }, "node_modules/rc-field-form": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.1.tgz", - "integrity": "sha512-RShegnwFu6TH8tl2olCxn+B4Wyh5EiQH8c/7wucbkLNyue05YiH5gomUAg1vbZjp71yFKwegClctsEG5CNBWAA==", - "license": "MIT", + "version": "1.41.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.41.0.tgz", + "integrity": "sha512-k9AS0wmxfJfusWDP/YXWTpteDNaQ4isJx9UKxx4/e8Dub4spFeZ54/EuN2sYrMRID/+hUznPgVZeg+Gf7XSYCw==", "dependencies": { "@babel/runtime": "^7.18.0", "async-validator": "^4.1.0", - "rc-util": "^5.8.0" + "rc-util": "^5.32.2" }, "engines": { "node": ">=8.x" @@ -18177,33 +17478,53 @@ "react-dom": ">=16.9.0" } }, + "node_modules/rc-form": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/rc-form/-/rc-form-2.4.12.tgz", + "integrity": "sha512-sHfyWRrnjCHkeCYfYAGop2GQBUC6CKMPcJF9h/gL/vTmZB/RN6fNOGKjXrXjFbwFwKXUWBoPtIDDDmXQW9xNdw==", + "dependencies": { + "async-validator": "~1.11.3", + "babel-runtime": "6.x", + "create-react-class": "^15.5.3", + "dom-scroll-into-view": "1.x", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.4", + "rc-util": "^4.15.3", + "react-is": "^16.13.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0" + } + }, + "node_modules/rc-form/node_modules/async-validator": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.11.5.tgz", + "integrity": "sha512-XNtCsMAeAH1pdLMEg1z8/Bb3a8cdCbui9QbJATRFHHHW5kT6+NPI3zSVQUXgikTFITzsg+kYY5NTWhM2Orwt9w==" + }, + "node_modules/rc-form/node_modules/rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "dependencies": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" + } + }, "node_modules/rc-image": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", - "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", - "license": "MIT", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.5.1.tgz", + "integrity": "sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag==", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", "classnames": "^2.2.6", - "rc-dialog": "~9.0.0", + "rc-dialog": "~9.3.4", "rc-motion": "^2.6.2", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-image/node_modules/rc-motion": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", - "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.21.0" + "rc-util": "^5.34.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -18211,10 +17532,9 @@ } }, "node_modules/rc-input": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", - "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", - "license": "MIT", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.4.3.tgz", + "integrity": "sha512-aHyQUAIRmTlOnvk5EcNqEpJ+XMtfMpYRAJayIlJfsvvH9cAKUWboh4egm23vgMA7E+c/qm4BZcnrDcA960GC1w==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -18226,14 +17546,15 @@ } }, "node_modules/rc-input-number": { - "version": "7.3.11", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", - "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", - "license": "MIT", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.6.1.tgz", + "integrity": "sha512-gaAMUKtUKLktJ3Yx93tjgYY1M0HunnoqzPEqkb9//Ydup4DcG0TFL9yHBA3pgVdNIt5f0UWyHCgFBj//JxeD6A==", "dependencies": { "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", "classnames": "^2.2.5", - "rc-util": "^5.23.0" + "rc-input": "~1.4.0", + "rc-util": "^5.28.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18241,17 +17562,17 @@ } }, "node_modules/rc-mentions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", - "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", - "license": "MIT", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.10.1.tgz", + "integrity": "sha512-72qsEcr/7su+a07ndJ1j8rI9n0Ka/ngWOLYnWMMv0p2mi/5zPwPrEDTt6Uqpe8FWjWhueDJx/vzunL6IdKDYMg==", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^1.5.0", "classnames": "^2.2.6", - "rc-menu": "~9.8.0", - "rc-textarea": "^0.4.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.22.5" + "rc-input": "~1.4.0", + "rc-menu": "~9.12.0", + "rc-textarea": "~1.6.1", + "rc-util": "^5.34.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -18259,16 +17580,15 @@ } }, "node_modules/rc-menu": { - "version": "9.8.2", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", - "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", - "license": "MIT", + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.4.tgz", + "integrity": "sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg==", "dependencies": { "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.17.0", "classnames": "2.x", "rc-motion": "^2.4.3", - "rc-overflow": "^1.2.8", - "rc-trigger": "^5.1.2", + "rc-overflow": "^1.3.1", "rc-util": "^5.27.0" }, "peerDependencies": { @@ -18276,41 +17596,10 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-menu/node_modules/rc-overflow": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", - "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.19.2" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-menu/node_modules/rc-util": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz", - "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-motion": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.2.tgz", - "integrity": "sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==", - "license": "MIT", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", + "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -18322,14 +17611,13 @@ } }, "node_modules/rc-notification": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.0.tgz", - "integrity": "sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ==", - "license": "MIT", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.3.0.tgz", + "integrity": "sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", - "rc-motion": "^2.2.0", + "rc-motion": "^2.9.0", "rc-util": "^5.20.1" }, "engines": { @@ -18341,15 +17629,14 @@ } }, "node_modules/rc-overflow": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.6.tgz", - "integrity": "sha512-YqbocgzuQxfq2wZy72vdAgrgzzEuM/5d4gF9TBEodCpXPbUeXGrUXNm1J6G1MSkCU2N0ePIgCEu5qD/0Ldi63Q==", - "license": "MIT", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-resize-observer": "^1.0.0", - "rc-util": "^5.19.2" + "rc-util": "^5.37.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18357,13 +17644,13 @@ } }, "node_modules/rc-pagination": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", - "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", - "license": "MIT", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.0.4.tgz", + "integrity": "sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==", "dependencies": { "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" + "classnames": "^2.3.2", + "rc-util": "^5.38.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18371,33 +17658,45 @@ } }, "node_modules/rc-picker": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.0.tgz", - "integrity": "sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==", - "license": "MIT", + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.14.6.tgz", + "integrity": "sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag==", "dependencies": { "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", "classnames": "^2.2.1", - "date-fns": "2.x", - "dayjs": "1.x", - "moment": "^2.24.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" + "rc-util": "^5.30.0" }, "engines": { "node": ">=8.x" }, "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", "react": ">=16.9.0", "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } } }, "node_modules/rc-progress": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", - "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", - "license": "MIT", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", + "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -18422,10 +17721,9 @@ } }, "node_modules/rc-rate": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", - "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", - "license": "MIT", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -18440,14 +17738,13 @@ } }, "node_modules/rc-resize-observer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz", - "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==", - "license": "MIT", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.20.7", "classnames": "^2.2.1", - "rc-util": "^5.15.0", + "rc-util": "^5.38.0", "resize-observer-polyfill": "^1.5.1" }, "peerDependencies": { @@ -18468,30 +17765,10 @@ "tween-functions": "1.x" } }, - "node_modules/rc-scroll-anim/node_modules/rc-tween-one": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-2.7.3.tgz", - "integrity": "sha512-n4OPRLO6VMZHj61unq5KKxHMMfBz52bxob94fN3U5M9GqFg3H+T3TXnpHPnAK+cq/xBGo70ik2vB4Fpjo/txcA==", - "dependencies": { - "babel-runtime": "6.x", - "prop-types": "^15.6.1", - "raf": "~3.4.0", - "react-lifecycles-compat": "^3.0.4", - "style-utils": "~0.2.0", - "tween-functions": "~1.2.0" - } - }, - "node_modules/rc-scroll-anim/node_modules/style-utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.2.1.tgz", - "integrity": "sha512-eKRIfWnUSdBqe2ko+qisUwBSlfWpHru89geRqzmScpDhkPW1ksmE04d//nDcXeF+TVK5cnBG90mMmHgxyxXleQ==", - "license": "MIT" - }, "node_modules/rc-segmented": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.0.tgz", - "integrity": "sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==", - "license": "MIT", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", + "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -18504,18 +17781,17 @@ } }, "node_modules/rc-select": { - "version": "14.1.9", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.9.tgz", - "integrity": "sha512-DK01+Q7oCWr5jVPiEp/BTQ8xCB4rI4LfXzZtSmBWJhOMuibyZD1Vlz/DlVKCUFmtBM4SzG4/SltGHoGlcbCqiw==", - "license": "MIT", + "version": "14.11.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.11.0.tgz", + "integrity": "sha512-8J8G/7duaGjFiTXCBLWfh5P+KDWyA3KTlZDfV3xj/asMPqB2cmxfM+lH50wRiPIRsCQ6EbkCFBccPuaje3DHIg==", "dependencies": { "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", "classnames": "2.x", "rc-motion": "^2.0.1", - "rc-overflow": "^1.0.0", - "rc-trigger": "^5.0.4", + "rc-overflow": "^1.3.1", "rc-util": "^5.16.1", - "rc-virtual-list": "^3.2.0" + "rc-virtual-list": "^3.5.2" }, "engines": { "node": ">=8.x" @@ -18526,15 +17802,13 @@ } }, "node_modules/rc-slider": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", - "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", - "license": "MIT", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.5.0.tgz", + "integrity": "sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", - "rc-util": "^5.18.1", - "shallowequal": "^1.1.0" + "rc-util": "^5.27.0" }, "engines": { "node": ">=8.x" @@ -18545,10 +17819,9 @@ } }, "node_modules/rc-steps": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", - "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", "dependencies": { "@babel/runtime": "^7.16.7", "classnames": "^2.2.3", @@ -18562,27 +17835,14 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-steps/node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/rc-switch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", - "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.21.0", "classnames": "^2.2.1", - "rc-util": "^5.0.1" + "rc-util": "^5.30.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18590,16 +17850,16 @@ } }, "node_modules/rc-table": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", - "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", - "license": "MIT", + "version": "7.37.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.37.0.tgz", + "integrity": "sha512-hEB17ktLRVfVmdo+U8MjGr+PuIgdQ8Cxj/N5lwMvP/Az7TOrQxwTMLVEDoj207tyPYLTWifHIF9EJREWwyk67g==", "dependencies": { "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", "classnames": "^2.2.5", "rc-resize-observer": "^1.1.0", - "rc-util": "^5.22.5", - "shallowequal": "^1.1.0" + "rc-util": "^5.37.0", + "rc-virtual-list": "^3.11.1" }, "engines": { "node": ">=8.x" @@ -18610,18 +17870,17 @@ } }, "node_modules/rc-tabs": { - "version": "12.5.7", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.7.tgz", - "integrity": "sha512-i9gY2TcwCNmBM+bXCDDTvb6mnRYIDkkNm+UGoIqrLOFnRRbAqjsSf+tgyvzhBvbK8XcSrMhzKKLaOMbGyND8YA==", - "license": "MIT", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-14.0.0.tgz", + "integrity": "sha512-lp1YWkaPnjlyhOZCPrAWxK6/P6nMGX/BAZcAC3nuVwKz0Byfp+vNnQKK8BRCP2g/fzu+SeB5dm9aUigRu3tRkQ==", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", - "rc-dropdown": "~4.0.0", - "rc-menu": "~9.8.0", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.12.0", "rc-motion": "^2.6.2", "rc-resize-observer": "^1.0.0", - "rc-util": "^5.16.0" + "rc-util": "^5.34.1" }, "engines": { "node": ">=8.x" @@ -18631,60 +17890,16 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-tabs/node_modules/rc-motion": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", - "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.21.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tabs/node_modules/rc-util": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz", - "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-textarea": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", - "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", - "license": "MIT", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.6.3.tgz", + "integrity": "sha512-8k7+8Y2GJ/cQLiClFMg8kUXOOdvcFQrnGeSchOvI2ZMIVvX5a3zQpLxoODL0HTrvU63fPkRmMuqaEcOF9dQemA==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", + "rc-input": "~1.4.0", "rc-resize-observer": "^1.0.0", - "rc-util": "^5.24.4", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-textarea/node_modules/rc-util": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz", - "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0" + "rc-util": "^5.27.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -18692,14 +17907,13 @@ } }, "node_modules/rc-tooltip": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", - "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", - "license": "MIT", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.3.tgz", + "integrity": "sha512-HMSbSs5oieZ7XddtINUddBLSVgsnlaSb3bZrzzGWjXa7/B7nNedmsuz72s7EWFEro9mNa7RyF3gOXKYqvJiTcQ==", "dependencies": { "@babel/runtime": "^7.11.2", - "classnames": "^2.3.1", - "rc-trigger": "^5.0.0" + "@rc-component/trigger": "^1.18.0", + "classnames": "^2.3.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -18707,16 +17921,15 @@ } }, "node_modules/rc-tree": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.2.tgz", - "integrity": "sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg==", - "license": "MIT", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.2.tgz", + "integrity": "sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.0.1", "rc-util": "^5.16.1", - "rc-virtual-list": "^3.4.8" + "rc-virtual-list": "^3.5.1" }, "engines": { "node": ">=10.x" @@ -18727,15 +17940,14 @@ } }, "node_modules/rc-tree-select": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", - "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", - "license": "MIT", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.17.0.tgz", + "integrity": "sha512-7sRGafswBhf7n6IuHyCEFCildwQIgyKiV8zfYyUoWfZEFdhuk7lCH+DN0aHt+oJrdiY9+6Io/LDXloGe01O8XQ==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", - "rc-select": "~14.1.0", - "rc-tree": "~5.7.0", + "rc-select": "~14.11.0-0", + "rc-tree": "~5.8.1", "rc-util": "^5.16.1" }, "peerDependencies": { @@ -18743,50 +17955,23 @@ "react-dom": "*" } }, - "node_modules/rc-trigger": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.1.tgz", - "integrity": "sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.6", - "rc-align": "^4.0.0", - "rc-motion": "^2.0.0", - "rc-util": "^5.19.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-tween-one": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-1.8.1.tgz", - "integrity": "sha512-Avg8EXHdt6ABV9WnmTmh6zEaAzUvl4bFZKbP3y6BE8UGBGp1qUhlIgCB83gL+5eA0VECdM/b9PsEBRrcxzSpGw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-2.7.3.tgz", + "integrity": "sha512-n4OPRLO6VMZHj61unq5KKxHMMfBz52bxob94fN3U5M9GqFg3H+T3TXnpHPnAK+cq/xBGo70ik2vB4Fpjo/txcA==", "dependencies": { "babel-runtime": "6.x", - "deep-eql": "~3.0.1", "prop-types": "^15.6.1", "raf": "~3.4.0", - "style-utils": "~0.1.13", + "react-lifecycles-compat": "^3.0.4", + "style-utils": "~0.2.0", "tween-functions": "~1.2.0" } }, - "node_modules/rc-tween-one/node_modules/style-utils": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.1.24.tgz", - "integrity": "sha512-MVZSKubpU/vIfpmOsi8/0ckWxb0WmGBmyNoEDGWZM9cM8n8sCL6DJftl3lEf8Uy5zKQ9+O1XdJxscWTDosCQpQ==", - "license": "MIT" - }, "node_modules/rc-upload": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", - "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", - "license": "MIT", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz", + "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==", "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -18798,29 +17983,32 @@ } }, "node_modules/rc-util": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.23.0.tgz", - "integrity": "sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg==", - "license": "MIT", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz", + "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==", "dependencies": { "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" + "react-is": "^18.2.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/rc-virtual-list": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.8.tgz", - "integrity": "sha512-qSN+Rv4i/E7RCTvTMr1uZo7f3crJJg/5DekoCagydo9zsXrxj07zsFSxqizqW+ldGA16lwa8So/bIbV9Ofjddg==", - "license": "MIT", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz", + "integrity": "sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==", "dependencies": { + "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", "rc-resize-observer": "^1.0.0", - "rc-util": "^5.15.0" + "rc-util": "^5.36.0" }, "engines": { "node": ">=8.x" @@ -18831,13 +18019,11 @@ } }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "license": "MIT", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -18847,7 +18033,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "license": "MIT", "dependencies": { "core-js": "^3.19.2", "object-assign": "^4.1.1", @@ -18861,21 +18046,24 @@ } }, "node_modules/react-app-polyfill/node_modules/core-js": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", - "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", + "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/react-beautiful-dnd": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", - "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", - "license": "Apache-2.0", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", "dependencies": { "@babel/runtime": "^7.9.2", "css-box-model": "^1.2.0", @@ -18886,21 +18074,19 @@ "use-memo-one": "^1.1.1" }, "peerDependencies": { - "react": "^16.8.5 || ^17.0.0", - "react-dom": "^16.8.5 || ^17.0.0" + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-beautiful-dnd/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-beautiful-dnd/node_modules/react-redux": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", - "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", - "license": "MIT", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -18921,11 +18107,18 @@ } } }, + "node_modules/react-beautiful-dnd/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/react-big-calendar": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.6.8.tgz", - "integrity": "sha512-uDuHoqH5/Wnk3tBxXnrXQD5w9FEofd1Ch1vMpLuv2LRBqrF2u7FcIruc80urizrkxcDWrTGxa7bsr0a9bby4Mw==", - "license": "MIT", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.8.6.tgz", + "integrity": "sha512-/weukU7kfaowMgC634Vtzc3eNAEpTPxmK9aVEpRQ6gIrTUlL8E+xpgWZ4ouc8HdwRDD0nJD14po5NGbTOFwbtg==", "dependencies": { "@babel/runtime": "^7.20.7", "clsx": "^1.2.1", @@ -18949,35 +18142,15 @@ "react-dom": "^16.14.0 || ^17 || ^18" } }, - "node_modules/react-big-calendar/node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/react-big-calendar/node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "license": "MIT" - }, "node_modules/react-big-calendar/node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, "node_modules/react-color": { "version": "2.19.3", "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", - "license": "MIT", "dependencies": { "@icons/material": "^0.2.4", "lodash": "^4.17.15", @@ -18992,14 +18165,13 @@ } }, "node_modules/react-cookie": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz", - "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.0.1.tgz", + "integrity": "sha512-SmDjy2TFp+vS6BGOqW7HyaWKyJzVmIH74uP3mxq6kswlwLJEBtIbhkrioozdvQL9r81yprHYFQkSmcO4HiXPdA==", "dependencies": { - "@types/hoist-non-react-statics": "^3.0.1", - "hoist-non-react-statics": "^3.0.0", - "universal-cookie": "^4.0.0" + "@types/hoist-non-react-statics": "^3.3.5", + "hoist-non-react-statics": "^3.3.2", + "universal-cookie": "^7.0.0" }, "peerDependencies": { "react": ">= 16.3.0" @@ -19009,7 +18181,6 @@ "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -19044,7 +18215,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -19056,40 +18226,35 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "license": "MIT", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/react-drag-listview": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/react-drag-listview/-/react-drag-listview-0.2.1.tgz", - "integrity": "sha512-LFR/14CpmiieITCywfe2rxAg1szAqsynpqgquSgirT9cansDwJdpqAVEjzIRSEql/DRIYTvBYLvMI/HJcVeU4w==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-drag-listview/-/react-drag-listview-2.0.0.tgz", + "integrity": "sha512-7Apx/1Xt4qu+JHHP0rH6aLgZgS7c2MX8ocHVGCi03KfeIWEu0t14MhT3boQKM33l5eJrE/IWfExFTvoYq22fsg==", "dependencies": { "babel-runtime": "^6.26.0", "prop-types": "^15.5.8" } }, "node_modules/react-draggable": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", - "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", - "license": "MIT", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", + "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", "dependencies": { "clsx": "^1.1.1", "prop-types": "^15.8.1" @@ -19102,14 +18267,12 @@ "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "license": "MIT" + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "node_modules/react-grid-gallery": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/react-grid-gallery/-/react-grid-gallery-1.0.0.tgz", "integrity": "sha512-S1gr6WXBlPFVrE0x2BHuu7jhyaB61mabcMQyx+8KCgAyKzGza0WF67AfAnS9Q00aurFEq4IP8eqb2Bk5F4RAmQ==", - "license": "MIT", "peerDependencies": { "react": ">=16.14.0" } @@ -19118,7 +18281,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.3.4.tgz", "integrity": "sha512-sB3rNhorW77HUdOjB4JkelZTdJGQKuXLl3gNg+BI8gJkTScspL1myfZzW/EM0dLEn+1eH+xW+wNqk0oIM9o7cw==", - "license": "MIT", "dependencies": { "clsx": "^1.1.1", "lodash.isequal": "^4.0.0", @@ -19132,16 +18294,15 @@ } }, "node_modules/react-i18next": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.2.0.tgz", - "integrity": "sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ==", - "license": "MIT", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.0.tgz", + "integrity": "sha512-OCrS8rHNAmnr8ggGRDxjakzihrMW7HCbsplduTm3EuuQ6fyvWGT41ksZpqbduYoqJurBmEsEVZ1pILSUWkHZng==", "dependencies": { - "@babel/runtime": "^7.20.6", + "@babel/runtime": "^7.22.5", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { - "i18next": ">= 19.0.0", + "i18next": ">= 23.2.3", "react": ">= 16.8.0" }, "peerDependenciesMeta": { @@ -19153,23 +18314,10 @@ } } }, - "node_modules/react-i18next/node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/react-icons": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.7.1.tgz", - "integrity": "sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw==", - "license": "MIT", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", "peerDependencies": { "react": "*" } @@ -19178,7 +18326,7 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/react-image-lightbox/-/react-image-lightbox-5.1.4.tgz", "integrity": "sha512-kTiAODz091bgT7SlWNHab0LSMZAPJtlNWDGKv7pLlLY1krmf7FuG1zxE0wyPpeA8gPdwfr3cu6sPwZRqWsc3Eg==", - "license": "MIT", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "prop-types": "^15.7.2", "react-modal": "^3.11.1" @@ -19189,10 +18337,9 @@ } }, "node_modules/react-intersection-observer": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz", - "integrity": "sha512-WNRqMQvKpupr6MzecAQI0Pj0+JQong307knLP4g/nBex7kYfIaZsPpXaIhKHR+oV8z+goUbH9e10j6lGRnTzlQ==", - "license": "MIT", + "version": "9.5.3", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.3.tgz", + "integrity": "sha512-NJzagSdUPS5rPhaLsHXYeJbsvdpbJwL6yCHtMk91hc0ufQ2BnXis+0QQ9NBh6n9n+Q3OyjR6OQLShYbaNBkThQ==", "peerDependencies": { "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } @@ -19200,20 +18347,17 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-modal": { "version": "3.16.1", "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", - "license": "MIT", "dependencies": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -19229,23 +18373,21 @@ } }, "node_modules/react-number-format": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.1.3.tgz", - "integrity": "sha512-N4XVBXDEIu9qVZIIwKTfCwhPh1fWx/i50I6XnMLsckj7OHi7A85+AMCzUmMCpx05usVVee14Rr/P7MUY0Pp2Kg==", - "license": "MIT", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.1.tgz", + "integrity": "sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==", "dependencies": { "prop-types": "^15.7.2" }, "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^18.0.0", - "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^18.0.0" + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-overlays": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.11.6", @@ -19262,36 +18404,23 @@ } }, "node_modules/react-redux": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", - "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", - "license": "MIT", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", + "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4" + "@types/react": "^18.2.25", + "react": "^18.0", + "react-native": ">=0.69", + "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, "react-native": { "optional": true }, @@ -19300,26 +18429,18 @@ } } }, - "node_modules/react-redux/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "license": "MIT" - }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-resizable": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.4.tgz", - "integrity": "sha512-StnwmiESiamNzdRHbSSvA65b0ZQJ7eVQpPusrSmcpyGKzC0gojhtO62xxH6YOBmepk9dQTBi9yxidL3W4s3EBA==", - "license": "MIT", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", + "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", "dependencies": { "prop-types": "15.x", "react-draggable": "^4.0.3" @@ -19328,63 +18449,40 @@ "react": ">= 16.3" } }, - "node_modules/react-resize-detector": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz", - "integrity": "sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-router": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", - "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", - "license": "MIT", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", + "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "@remix-run/router": "1.14.2" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": ">=15" + "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", - "license": "MIT", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", + "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.3", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "@remix-run/router": "1.14.2", + "react-router": "6.21.3" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": ">=15" + "react": ">=16.8", + "react-dom": ">=16.8" } }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -19457,7 +18555,6 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "license": "BSD-2-Clause", "engines": { "node": ">=10" } @@ -19466,7 +18563,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -19476,28 +18572,12 @@ "node": ">=12" } }, - "node_modules/react-scripts/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/react-smooth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.1.tgz", - "integrity": "sha512-Own9TA0GPPf3as4vSwFhDouVfXP15ie/wIHklhyKBH5AN6NFtdk0UpHBnonV11BtqDkAWlt40MOUc+5srmW7NA==", - "license": "MIT", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz", + "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==", "dependencies": { - "fast-equals": "^2.0.0", + "fast-equals": "^5.0.0", "react-transition-group": "2.9.0" }, "peerDependencies": { @@ -19506,11 +18586,18 @@ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-smooth/node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/react-sticky": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.3.tgz", "integrity": "sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ==", - "license": "MIT", "dependencies": { "prop-types": "^15.5.8", "raf": "^3.3.0" @@ -19524,17 +18611,33 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/react-sublime-video/-/react-sublime-video-0.2.5.tgz", "integrity": "sha512-pDVLyzq20LSc2Z4uZiCZZS4UZ56ghQZQW2d+8LzGH7+dtBRGyyXrdxJgZbA2cX4uVHcytByDs4nggWO/J7sReA==", - "license": "MIT", "dependencies": { "prop-types": "^15.5.10", "rc-tween-one": "^1.2.5" } }, + "node_modules/react-sublime-video/node_modules/rc-tween-one": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-1.8.1.tgz", + "integrity": "sha512-Avg8EXHdt6ABV9WnmTmh6zEaAzUvl4bFZKbP3y6BE8UGBGp1qUhlIgCB83gL+5eA0VECdM/b9PsEBRrcxzSpGw==", + "dependencies": { + "babel-runtime": "6.x", + "deep-eql": "~3.0.1", + "prop-types": "^15.6.1", + "raf": "~3.4.0", + "style-utils": "~0.1.13", + "tween-functions": "~1.2.0" + } + }, + "node_modules/react-sublime-video/node_modules/style-utils": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.1.24.tgz", + "integrity": "sha512-MVZSKubpU/vIfpmOsi8/0ckWxb0WmGBmyNoEDGWZM9cM8n8sCL6DJftl3lEf8Uy5zKQ9+O1XdJxscWTDosCQpQ==" + }, "node_modules/react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "license": "BSD-3-Clause", "dependencies": { "dom-helpers": "^3.4.0", "loose-envify": "^1.4.0", @@ -19550,16 +18653,14 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" } }, "node_modules/react-virtualized": { - "version": "9.22.3", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", - "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", - "license": "MIT", + "version": "9.22.5", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", "dependencies": { "@babel/runtime": "^7.7.2", "clsx": "^1.0.4", @@ -19569,15 +18670,14 @@ "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha", - "react-dom": "^15.3.0 || ^16.0.0-alpha" + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" } }, "node_modules/reactcss": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", - "license": "MIT", "dependencies": { "lodash": "^4.0.1" } @@ -19586,43 +18686,27 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", "dependencies": { "pify": "^2.3.0" } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "license": "MIT", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -19631,23 +18715,21 @@ } }, "node_modules/recharts": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.4.3.tgz", - "integrity": "sha512-/hkRHTQShEOKDYd2OlKLIvGA0X9v/XVO/mNeRoDHg0lgFRL2KbGzeqVnStI3mMfORUZ6Hak4JbQ+uDiin1Foqg==", - "license": "MIT", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.4.tgz", + "integrity": "sha512-/Q7/wdf8bW91lN3NEeCjL9RWfaiXQViJFgdnas4Eix/I8B9HAI3tHHK/CW/zDfgRMh4fzW1zlfjoz1IAapLO1Q==", "dependencies": { - "classnames": "^2.2.5", + "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.19", "react-is": "^16.10.2", - "react-resize-detector": "^7.1.2", - "react-smooth": "^2.0.1", + "react-smooth": "^2.0.5", "recharts-scale": "^0.4.4", - "reduce-css-calc": "^2.1.8", + "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { "prop-types": "^15.6.0", @@ -19659,16 +18741,22 @@ "version": "0.4.5", "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "license": "MIT", "dependencies": { "decimal.js-light": "^2.4.1" } }, + "node_modules/recharts/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "license": "MIT", "dependencies": { "minimatch": "^3.0.5" }, @@ -19676,17 +18764,35 @@ "node": ">=6.0.0" } }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==", - "license": "MIT" + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "license": "MIT", "engines": { "node": ">=4" } @@ -19695,7 +18801,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "license": "MIT", "dependencies": { "redis-errors": "^1.0.0" }, @@ -19703,37 +18808,16 @@ "node": ">=4" } }, - "node_modules/reduce-css-calc": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", - "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", - "license": "MIT", - "dependencies": { - "css-unit-converter": "^1.1.1", - "postcss-value-parser": "^3.3.0" - } - }, - "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "license": "MIT" - }, "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/redux-logger": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", "dev": true, - "license": "MIT", "dependencies": { "deep-diff": "^0.3.5" } @@ -19742,83 +18826,50 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", - "license": "MIT", "peerDependencies": { "redux": ">4.0.0" } }, "node_modules/redux-saga": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.2.tgz", - "integrity": "sha512-6xAHWgOqRP75MFuLq88waKK9/+6dCdMQjii2TohDMARVHeQ6HZrZoJ9HZ3dLqMWCZ9kj4iuS6CDsujgnovn11A==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", + "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", "dependencies": { - "@redux-saga/core": "^1.2.2" + "@redux-saga/core": "^1.3.0" } }, "node_modules/redux-state-sync": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/redux-state-sync/-/redux-state-sync-3.1.4.tgz", "integrity": "sha512-nhJBzaXVXPXvUhQJ7m0LdoXBnrcw+cTYQ8bzW9DeJKdq6UNYynXwQWAlVUvsbT/hDV+vB6BC4DMLXkUVGpF2yQ==", - "license": "ISC", "dependencies": { "broadcast-channel": "^3.1.0" } }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "license": "Apache-2.0" + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "license": "MIT", + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -19827,46 +18878,76 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, - "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "license": "MIT", + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "license": "MIT" + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "license": "BSD-2-Clause", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dependencies": { "jsesc": "~0.5.0" }, @@ -19874,11 +18955,18 @@ "regjsparser": "bin/parser" } }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -19887,7 +18975,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -19901,7 +18988,6 @@ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", "dev": true, - "license": "MIT", "dependencies": { "throttleit": "^1.0.0" } @@ -19910,7 +18996,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19919,7 +19004,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19927,28 +19011,24 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==", - "license": "MIT" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", + "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "license": "MIT" + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "license": "MIT", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -19963,7 +19043,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -19971,26 +19050,26 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -20014,17 +19093,20 @@ } } }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/resolve-url-loader/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "license": "ISC" + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "node_modules/resolve-url-loader/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "license": "MIT", "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -20041,7 +19123,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "license": "MIT", "engines": { "node": ">=10" } @@ -20050,7 +19131,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", - "license": "MIT", "engines": { "node": ">=0.8" } @@ -20060,7 +19140,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -20073,7 +19152,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -20082,7 +19160,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -20092,14 +19169,12 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -20110,11 +19185,49 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -20129,7 +19242,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "license": "MIT", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -20144,7 +19257,6 @@ "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -20158,7 +19270,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -20181,21 +19292,36 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -20213,14 +19339,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -20230,23 +19354,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize.css": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", - "license": "CC0-1.0" + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, "node_modules/sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", - "license": "MIT", + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", + "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -20256,14 +19385,13 @@ "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -20298,16 +19426,15 @@ } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "license": "ISC" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "optional": true }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -20316,20 +19443,17 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "license": "MIT", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "license": "MIT", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -20344,32 +19468,29 @@ } }, "node_modules/scroll-into-view-if-needed": { - "version": "2.2.29", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz", - "integrity": "sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "dependencies": { - "compute-scroll-into-view": "^1.0.17" + "compute-scroll-into-view": "^3.0.2" } }, "node_modules/seedrandom": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "license": "MIT", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -20377,19 +19498,39 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -20413,7 +19554,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -20421,14 +19561,17 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -20437,7 +19580,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -20455,7 +19597,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -20464,7 +19605,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -20473,7 +19613,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -20487,26 +19626,22 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -20515,7 +19650,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -20526,24 +19660,42 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -20554,14 +19706,12 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -20573,16 +19723,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "license": "MIT", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -20591,7 +19739,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -20604,20 +19751,17 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -20627,7 +19771,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -20638,25 +19781,23 @@ } }, "node_modules/socket.io-client": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz", - "integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==", - "license": "MIT", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz", + "integrity": "sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.4.0", - "socket.io-parser": "~4.2.1" + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", - "license": "MIT", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -20669,34 +19810,38 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "license": "MIT" + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-explorer": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.2.tgz", - "integrity": "sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "btoa": "^1.2.1", "chalk": "^4.1.0", @@ -20707,7 +19852,7 @@ "gzip-size": "^6.0.0", "lodash": "^4.17.20", "open": "^7.3.1", - "source-map": "^0.7.3", + "source-map": "^0.7.4", "temp": "^0.9.4", "yargs": "^16.2.0" }, @@ -20716,7 +19861,66 @@ "source-map-explorer": "bin/cli.js" }, "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/source-map-explorer/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/source-map-explorer/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/source-map-explorer/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/source-map-explorer/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-explorer/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/source-map-explorer/node_modules/open": { @@ -20724,7 +19928,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -20741,16 +19944,41 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, + "node_modules/source-map-explorer/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map-explorer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -20759,7 +19987,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", - "license": "MIT", "dependencies": { "abab": "^2.0.5", "iconv-lite": "^0.6.3", @@ -20776,23 +20003,10 @@ "webpack": "^5.0.0" } }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -20802,13 +20016,12 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "license": "MIT" + "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -20824,7 +20037,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -20834,50 +20046,27 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spdy-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, - "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -20902,13 +20091,12 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "license": "MIT" + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -20920,7 +20108,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -20928,20 +20115,101 @@ "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT" + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -20950,7 +20218,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "license": "MIT", + "dev": true, "dependencies": { "internal-slot": "^1.0.4" }, @@ -20958,55 +20226,23 @@ "node": ">= 0.4" } }, - "node_modules/stop-iteration-iterator/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", - "license": "MIT" + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -21018,14 +20254,12 @@ "node_modules/string-natural-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "license": "MIT" + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21035,48 +20269,67 @@ "node": ">=8" } }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "license": "MIT", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "license": "MIT", + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "license": "MIT", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21086,7 +20339,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -21100,7 +20352,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -21109,19 +20360,17 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "license": "MIT", "engines": { "node": ">=10" } @@ -21130,7 +20379,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -21139,7 +20387,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -21148,10 +20395,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "license": "MIT", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", "engines": { "node": ">= 12.13.0" }, @@ -21164,31 +20410,27 @@ } }, "node_modules/style-utils": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.3.8.tgz", - "integrity": "sha512-RmGftIhY4tqtD1ERwKsVEDlt/M6UyxN/rcr95UmlooWmhtL0RwVUYJkpo1kSx3ppd9/JZzbknhy742zbMAawjQ==", - "license": "MIT" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.2.1.tgz", + "integrity": "sha512-eKRIfWnUSdBqe2ko+qisUwBSlfWpHru89geRqzmScpDhkPW1ksmE04d//nDcXeF+TVK5cnBG90mMmHgxyxXleQ==" }, "node_modules/styled-components": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", - "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", - "hasInstallScript": true, - "license": "MIT", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz", + "integrity": "sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==", "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" + "@emotion/is-prop-valid": "1.2.1", + "@emotion/unitless": "0.8.0", + "@types/stylis": "4.2.0", + "css-to-react-native": "3.2.0", + "csstype": "3.1.2", + "postcss": "8.4.31", + "shallowequal": "1.1.0", + "stylis": "4.3.1", + "tslib": "2.5.0" }, "engines": { - "node": ">=10" + "node": ">= 16" }, "funding": { "type": "opencollective", @@ -21196,36 +20438,50 @@ }, "peerDependencies": { "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" + "react-dom": ">= 16.8.0" } }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "has-flag": "^3.0.0" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14" } }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" @@ -21237,11 +20493,16 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, "node_modules/subscriptions-transport-ws": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz", "integrity": "sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==", - "license": "MIT", + "deprecated": "The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md", "dependencies": { "backo2": "^1.0.2", "eventemitter3": "^3.1.0", @@ -21256,14 +20517,88 @@ "node_modules/subscriptions-transport-ws/node_modules/eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "license": "MIT" + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/subscriptions-transport-ws/node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21272,10 +20607,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "license": "MIT", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -21288,7 +20622,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -21299,20 +20632,18 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svg-path-properties": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-1.0.11.tgz", - "integrity": "sha512-Wo6SjzONZPL9UAgrnwcCkDGRYP9CbHJGkNcPFIgEVRjiOiJxSd/AtwnGk/4N4iOLGUoas57TMxY0xASDeb9YJg==", - "license": "ISC" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-1.3.0.tgz", + "integrity": "sha512-R1+z37FrqyS3UXDhajNfvMxKI0smuVdedqOo4YbAQUfGqA86B9mGvr2IEXrwjjvGzCtdIKy/ad9N8m6YclaKAw==" }, "node_modules/svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "license": "MIT", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -21339,7 +20670,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -21351,7 +20681,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -21365,7 +20694,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -21373,14 +20701,12 @@ "node_modules/svgo/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/svgo/node_modules/css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -21388,24 +20714,10 @@ "nth-check": "^1.0.2" } }, - "node_modules/svgo/node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/svgo/node_modules/css-what": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -21417,69 +20729,50 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" } }, - "node_modules/svgo/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/svgo/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, "node_modules/svgo/node_modules/domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, "node_modules/svgo/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/svgo/node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "license": "CC0-1.0" - }, "node_modules/svgo/node_modules/nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "~1.0.0" } }, + "node_modules/svgo/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/svgo/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -21488,84 +20781,78 @@ } }, "node_modules/svgpath": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.5.0.tgz", - "integrity": "sha512-o/vohwqjUO9nDAh4rcjE3KaW/v//At8UJu2LJMybXidf5QLQLVA4bxH0//4YCsr+1H4Gw1Wi/Jc62ynzSBYidw==", - "license": "MIT" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", + "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==", + "funding": { + "url": "https://github.com/fontello/svg2ttf?sponsor=1" + } + }, + "node_modules/swr": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.4.tgz", + "integrity": "sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ==", + "dependencies": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } }, "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", - "license": "MIT", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", + "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", "dependencies": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" } }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -21575,7 +20862,6 @@ "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, - "license": "MIT", "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" @@ -21588,17 +20874,57 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/temp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/temp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/temp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -21610,7 +20936,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -21628,7 +20953,6 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -21640,7 +20964,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -21653,13 +20976,12 @@ } }, "node_modules/terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", - "license": "BSD-2-Clause", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -21671,16 +20993,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "license": "MIT", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -21704,21 +21025,15 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -21728,65 +21043,117 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } }, "node_modules/throat": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "license": "MIT" + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } }, "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "node_modules/tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "node_modules/tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", - "license": "MIT", - "engines": { - "node": "*" - } + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, - "license": "MIT", "dependencies": { "rimraf": "^3.0.0" }, @@ -21797,14 +21164,12 @@ "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause" + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "license": "MIT", "engines": { "node": ">=4" } @@ -21813,7 +21178,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -21824,14 +21188,12 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } @@ -21840,7 +21202,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "license": "ISC", "dependencies": { "commander": "2" }, @@ -21850,43 +21211,52 @@ "topoquantize": "bin/topoquantize" } }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "license": "BSD-3-Clause", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.8" + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "license": "MIT" + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -21895,10 +21265,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "license": "MIT", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -21938,10 +21307,9 @@ } }, "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "license": "MIT", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "engines": { "node": ">=0.4.0" } @@ -21949,26 +21317,23 @@ "node_modules/ts-node/node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "license": "MIT", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dependencies": { "minimist": "^1.2.0" }, @@ -21976,6 +21341,14 @@ "json5": "lib/cli.js" } }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -21985,7 +21358,6 @@ "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -21999,15 +21371,13 @@ "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -22018,13 +21388,12 @@ "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", - "license": "BSD" + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==" }, "node_modules/tween-one": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/tween-one/-/tween-one-1.1.8.tgz", - "integrity": "sha512-b9WD0/ZauKmhpomV5skXkTw6MMOEKLmBsWXV754Vp0WuJALcDP5u7PQSvMMFqVSQ/eg8R8DAxiaNebHZtB57fg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/tween-one/-/tween-one-1.2.7.tgz", + "integrity": "sha512-F+Z9LO9GsYqf0j5bgNhAF98RDrAZ7QjQrujJ2lVYSHl4+dBPW/atHluL2bwclZf8Vo0Yo96f6pw2uq1OGzpC/Q==", "dependencies": { "@babel/runtime": "^7.11.1", "flubber": "^0.4.2", @@ -22034,20 +21403,23 @@ "tween-functions": "^1.2.0" } }, + "node_modules/tween-one/node_modules/style-utils": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.3.8.tgz", + "integrity": "sha512-RmGftIhY4tqtD1ERwKsVEDlt/M6UyxN/rcr95UmlooWmhtL0RwVUYJkpo1kSx3ppd9/JZzbknhy742zbMAawjQ==" + }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" + "dev": true }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "license": "MIT", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -22057,7 +21429,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", "engines": { "node": ">=4" } @@ -22066,7 +21437,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -22078,7 +21448,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -22087,11 +21456,58 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -22105,29 +21521,14 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/typescript-compare": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", - "license": "MIT", "dependencies": { "typescript-logic": "^0.0.0" } @@ -22135,14 +21536,12 @@ "node_modules/typescript-logic": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", - "license": "MIT" + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" }, "node_modules/typescript-tuple": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", - "license": "MIT", "dependencies": { "typescript-compare": "^0.0.2" } @@ -22151,7 +21550,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -22166,7 +21564,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", @@ -22177,17 +21574,36 @@ "react": ">=15.0.0" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", - "license": "MIT" + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -22196,7 +21612,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -22206,19 +21621,17 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "engines": { "node": ">=4" } @@ -22227,7 +21640,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -22236,20 +21648,26 @@ } }, "node_modules/universal-cookie": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", - "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.0.0.tgz", + "integrity": "sha512-T3XwZ2cUbHRU+UNfPSaPd0zti50tVIvk6onLA90pa+qKwsP8ksn5pwYM7rWMODoX1OCA9qPAN8uK88Avq5YbtQ==", "dependencies": { - "@types/cookie": "^0.3.3", - "cookie": "^0.4.0" + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0" + } + }, + "node_modules/universal-cookie/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -22258,7 +21676,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", - "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.6.2", "detect-node": "^2.0.4" @@ -22268,23 +21685,32 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/unplugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", + "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", + "dev": true, + "dependencies": { + "acorn": "^8.8.1", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, "node_modules/unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "license": "MIT" + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -22293,16 +21719,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -22311,15 +21736,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -22329,25 +21757,31 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/use-memo-one": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", - "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", - "license": "MIT", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -22355,14 +21789,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -22376,23 +21808,25 @@ "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -22400,14 +21834,12 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "license": "MIT" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "license": "ISC", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -22417,26 +21849,23 @@ "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/v8-to-istanbul/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" - }, "node_modules/vanilla-picker": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz", - "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==", - "license": "ISC", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.2.tgz", + "integrity": "sha512-dk0gNeNL9fQFGd1VEhNDQfFlbCqAiksRh1H2tVPlavkH88n/a/y30rXi9PPKrYPTK5kEfPO4xcldt4ts/1wIAg==", "dependencies": { "@sphinxxxx/color-conversion": "^2.2.2" } @@ -22445,7 +21874,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -22458,35 +21886,16 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/verror/node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, "node_modules/victory-vendor": { - "version": "36.6.8", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.8.tgz", - "integrity": "sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ==", - "license": "MIT AND ISC", + "version": "36.7.0", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz", + "integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -22505,10 +21914,9 @@ } }, "node_modules/victory-vendor/node_modules/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", - "license": "ISC", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dependencies": { "internmap": "1 - 2" }, @@ -22516,23 +21924,10 @@ "node": ">=12" } }, - "node_modules/victory-vendor/node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -22541,7 +21936,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "license": "MIT", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -22550,7 +21945,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "license": "MIT", "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -22562,7 +21956,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -22571,7 +21964,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -22580,7 +21972,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -22593,43 +21984,39 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", - "license": "Apache-2.0" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.1.tgz", + "integrity": "sha512-xQ9lvIpfLxUj0eSmT79ZjRoU5wIRfIr7pNukL7ZE4EcWZSmfZQqOlhuAGfkVa3EFmzPHZhWhXfm2i5ys+THVPg==" }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "license": "BSD-2-Clause", "engines": { "node": ">=10.4" } }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "license": "MIT", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -22638,9 +22025,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -22664,7 +22051,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -22687,7 +22073,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -22699,28 +22084,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -22731,19 +22098,17 @@ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -22754,10 +22119,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "license": "MIT", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -22765,7 +22129,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -22778,6 +22142,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -22787,7 +22152,7 @@ "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -22803,6 +22168,9 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } @@ -22812,7 +22180,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -22824,28 +22191,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack-dev-server/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/webpack-dev-server/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -22856,19 +22205,17 @@ "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -22879,10 +22226,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", - "license": "MIT", + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", + "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", "engines": { "node": ">=10.0.0" }, @@ -22903,7 +22249,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "license": "MIT", "dependencies": { "tapable": "^2.0.0", "webpack-sources": "^2.2.0" @@ -22919,7 +22264,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "license": "MIT", "dependencies": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" @@ -22929,12 +22273,12 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "license": "MIT", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -22945,22 +22289,40 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "license": "MIT" + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -22974,7 +22336,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -22983,42 +22344,49 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "license": "MIT", "dependencies": { "iconv-lite": "0.4.24" } }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "license": "MIT" + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "license": "MIT" + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -23033,7 +22401,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -23045,11 +22412,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-collection": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "license": "MIT", "dependencies": { "is-map": "^2.0.1", "is-set": "^2.0.1", @@ -23061,17 +22452,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "license": "MIT", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -23080,61 +22469,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "license": "MIT" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "license": "MIT", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "engines": { "node": ">=0.10.0" } }, - "node_modules/workbox-background-sync": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", - "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==", - "license": "MIT", - "dependencies": { - "idb": "^6.1.4", - "workbox-core": "6.5.3" - } - }, - "node_modules/workbox-background-sync/node_modules/idb": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", - "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", - "license": "ISC" - }, - "node_modules/workbox-broadcast-update": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz", - "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.5.3" - } - }, "node_modules/workbox-build": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", - "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -23158,647 +22509,30 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.5.4", - "workbox-broadcast-update": "6.5.4", - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-google-analytics": "6.5.4", - "workbox-navigation-preload": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-range-requests": "6.5.4", - "workbox-recipes": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4", - "workbox-streams": "6.5.4", - "workbox-sw": "6.5.4", - "workbox-window": "6.5.4" + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "license": "MIT", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, "node_modules/workbox-build/node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23810,137 +22544,54 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/workbox-build/node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "license": "MIT", + "node_modules/workbox-build/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/workbox-build/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "license": "MIT", + "node_modules/workbox-build/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/workbox-build/node_modules/core-js-compat": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.0.tgz", - "integrity": "sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.5" + "engines": { + "node": "*" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/workbox-build/node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, "node_modules/workbox-build/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/workbox-build/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "node_modules/workbox-build/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6" - } - }, - "node_modules/workbox-build/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/workbox-build/node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/workbox-build/node_modules/regexpu-core": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", - "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", - "license": "MIT", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/workbox-build/node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" + "node": "*" } }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" }, @@ -23952,31 +22603,19 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "license": "MIT", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/workbox-build/node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/workbox-build/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "license": "BSD-2-Clause" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "node_modules/workbox-build/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -23984,315 +22623,232 @@ } }, "node_modules/workbox-build/node_modules/workbox-background-sync": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", - "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-broadcast-update": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", - "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", - "license": "MIT" + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" }, "node_modules/workbox-build/node_modules/workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-google-analytics": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", - "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", "dependencies": { - "workbox-background-sync": "6.5.4", - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-navigation-preload": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", - "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-range-requests": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", - "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build/node_modules/workbox-streams": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", - "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4" - } - }, - "node_modules/workbox-build/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/workbox-cacheable-response": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz", - "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.5.3" + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" } }, "node_modules/workbox-core": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz", - "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==", - "license": "MIT" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", + "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==" }, "node_modules/workbox-expiration": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz", - "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", + "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", "dependencies": { - "idb": "^6.1.4", - "workbox-core": "6.5.3" - } - }, - "node_modules/workbox-expiration/node_modules/idb": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", - "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", - "license": "ISC" - }, - "node_modules/workbox-google-analytics": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz", - "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==", - "license": "MIT", - "dependencies": { - "workbox-background-sync": "6.5.3", - "workbox-core": "6.5.3", - "workbox-routing": "6.5.3", - "workbox-strategies": "6.5.3" + "idb": "^7.0.1", + "workbox-core": "7.0.0" } }, "node_modules/workbox-navigation-preload": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz", - "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", + "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", "dependencies": { - "workbox-core": "6.5.3" + "workbox-core": "7.0.0" } }, "node_modules/workbox-precaching": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz", - "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", + "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", "dependencies": { - "workbox-core": "6.5.3", - "workbox-routing": "6.5.3", - "workbox-strategies": "6.5.3" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz", - "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.5.3" + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" } }, "node_modules/workbox-recipes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", - "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", "dependencies": { - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "node_modules/workbox-recipes/node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, "node_modules/workbox-recipes/node_modules/workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-recipes/node_modules/workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", - "license": "MIT" + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" }, "node_modules/workbox-recipes/node_modules/workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-recipes/node_modules/workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, "node_modules/workbox-recipes/node_modules/workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-recipes/node_modules/workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-routing": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz", - "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", + "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", "dependencies": { - "workbox-core": "6.5.3" + "workbox-core": "7.0.0" } }, "node_modules/workbox-strategies": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz", - "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", + "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", "dependencies": { - "workbox-core": "6.5.3" - } - }, - "node_modules/workbox-streams": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz", - "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==", - "license": "MIT", - "dependencies": { - "workbox-core": "6.5.3", - "workbox-routing": "6.5.3" + "workbox-core": "7.0.0" } }, "node_modules/workbox-sw": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", - "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==", - "license": "MIT" + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" }, "node_modules/workbox-webpack-plugin": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz", - "integrity": "sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.5.4" + "workbox-build": "6.6.0" }, "engines": { "node": ">=10.0.0" @@ -24305,33 +22861,29 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "license": "MIT", "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "node_modules/workbox-window": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", - "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-window/node_modules/workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", - "license": "MIT" + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -24347,14 +22899,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -24366,7 +22916,6 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -24386,14 +22935,12 @@ "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "license": "Apache-2.0" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", @@ -24403,20 +22950,10 @@ "node": ">=0.4.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "license": "MIT", "dependencies": { "cuint": "^0.2.2" } @@ -24425,58 +22962,52 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -24486,7 +23017,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", "engines": { "node": ">=6" } @@ -24495,7 +23025,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -24506,14 +23035,12 @@ "node_modules/zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", - "license": "MIT" + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" }, "node_modules/zen-observable-ts": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", - "license": "MIT", "dependencies": { "zen-observable": "0.8.15" } diff --git a/client/package.json b/client/package.json index 602f30e12..4d49a746c 100644 --- a/client/package.json +++ b/client/package.json @@ -4,85 +4,83 @@ "private": true, "proxy": "http://localhost:4000", "dependencies": { - "@apollo/client": "^3.7.9", + "@ant-design/compatible": "^5.1.2", + "@ant-design/pro-layout": "^7.17.16", + "@apollo/client": "^3.8.10", "@asseinfo/react-kanban": "^2.2.0", - "@craco/craco": "^7.0.0", - "@fingerprintjs/fingerprintjs": "^3.4.2", + "@craco/craco": "^7.1.0", + "@fingerprintjs/fingerprintjs": "^4.2.1", "@jsreport/browser-client": "^3.1.0", - "@sentry/react": "^7.40.0", - "@sentry/tracing": "^7.40.0", - "@splitsoftware/splitio-react": "^1.8.1", - "@tanem/react-nprogress": "^5.0.8", - "antd": "^4.24.8", + "@reduxjs/toolkit": "^2.0.1", + "@sentry/react": "^7.93.0", + "@sentry/tracing": "^7.93.0", + "@splitsoftware/splitio-react": "^1.11.0", + "@tanem/react-nprogress": "^5.0.51", + "antd": "^5.12.8", "apollo-link-logger": "^2.0.1", - "axios": "^1.3.4", - "craco-less": "^2.0.0", + "axios": "^1.6.5", + "craco-less": "^3.0.1", + "dayjs": "^1.11.10", + "dayjs-business-days2": "^1.2.2", "dinero.js": "^1.9.1", - "dotenv": "^16.0.1", + "dotenv": "^16.3.1", "enquire-js": "^0.2.1", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "firebase": "^9.17.1", + "firebase": "^10.7.2", "graphql": "^16.6.0", - "i18next": "^22.4.10", - "i18next-browser-languagedetector": "^7.0.1", - "jsoneditor": "^9.9.0", + "i18next": "^23.7.16", + "i18next-browser-languagedetector": "^7.0.2", + "jsoneditor": "^10.0.0", "jsreport-browser-client-dist": "^1.3.0", - "libphonenumber-js": "^1.10.21", - "logrocket": "^3.0.1", - "markerjs2": "^2.28.1", - "moment-business-days": "^1.2.0", - "moment-timezone": "^0.5.41", + "libphonenumber-js": "^1.10.53", + "logrocket": "^7.0.0", + "markerjs2": "^2.31.4", "normalize-url": "^8.0.0", - "phone": "^3.1.35", + "phone": "^3.1.42", "preval.macro": "^5.0.0", "prop-types": "^15.8.1", - "query-string": "^7.1.3", + "query-string": "^8.1.0", "rc-queue-anim": "^2.0.0", "rc-scroll-anim": "^2.7.6", - "react": "^17.0.2", - "react-big-calendar": "^1.6.8", + "react": "^18.2.0", + "react-big-calendar": "^1.8.6", "react-color": "^2.19.3", - "react-cookie": "^4.1.1", - "react-dom": "^17.0.2", - "react-drag-listview": "^0.2.1", + "react-cookie": "^7.0.1", + "react-dom": "^18.2.0", + "react-drag-listview": "^2.0.0", "react-grid-gallery": "^1.0.0", - "react-grid-layout": "^1.3.4", - "react-i18next": "^12.2.0", - "react-icons": "^4.7.1", + "react-grid-layout": "1.3.4", + "react-i18next": "^14.0.0", + "react-icons": "^5.0.1", "react-image-lightbox": "^5.1.4", - "react-intersection-observer": "^9.4.3", - "react-number-format": "^5.1.3", - "react-redux": "^8.0.5", - "react-resizable": "^3.0.4", - "react-router-dom": "^5.3.0", + "react-intersection-observer": "^9.5.3", + "react-number-format": "^5.1.4", + "react-redux": "^9.1.0", + "react-resizable": "^3.0.5", + "react-router-dom": "^6.21.3", "react-scripts": "^5.0.1", "react-sticky": "^6.0.3", "react-sublime-video": "^0.2.5", - "react-virtualized": "^9.22.3", - "recharts": "^2.4.3", - "redux": "^4.2.1", + "react-virtualized": "^9.22.5", + "recharts": "^2.10.4", + "redux": "^5.0.1", "redux-persist": "^6.0.0", - "redux-saga": "^1.2.2", + "redux-saga": "^1.3.0", "redux-state-sync": "^3.1.4", - "reselect": "^4.1.7", - "sass": "^1.58.3", - "socket.io-client": "^4.6.1", - "styled-components": "^5.3.6", + "reselect": "^5.1.0", + "sass": "^1.70.0", + "socket.io-client": "^4.7.4", + "styled-components": "^6.1.8", "subscriptions-transport-ws": "^0.11.0", - "web-vitals": "^2.1.4", - "workbox-background-sync": "^6.5.3", - "workbox-broadcast-update": "^6.5.3", - "workbox-cacheable-response": "^6.5.3", - "workbox-core": "^6.5.3", - "workbox-expiration": "^6.5.3", - "workbox-google-analytics": "^6.5.3", - "workbox-navigation-preload": "^6.5.3", - "workbox-precaching": "^6.5.3", - "workbox-range-requests": "^6.5.3", - "workbox-routing": "^6.5.3", - "workbox-strategies": "^6.5.3", - "workbox-streams": "^6.5.3", + "terser-webpack-plugin": "^5.3.10", + "web-vitals": "^3.5.1", + "workbox-core": "^7.0.0", + "workbox-expiration": "^7.0.0", + "workbox-navigation-preload": "^7.0.0", + "workbox-precaching": "^7.0.0", + "workbox-routing": "^7.0.0", + "workbox-strategies": "^7.0.0", "yauzl": "^2.10.0" }, "scripts": { @@ -119,12 +117,13 @@ "react-error-overlay": "6.0.9" }, "devDependencies": { - "@sentry/webpack-plugin": "^1.20.0", - "@testing-library/cypress": "^8.0.3", - "cypress": "^10.3.1", - "eslint-plugin-cypress": "^2.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@sentry/webpack-plugin": "^2.10.2", + "@testing-library/cypress": "^10.0.1", + "cypress": "^13.6.3", + "eslint-plugin-cypress": "^2.15.1", "react-error-overlay": "6.0.11", "redux-logger": "^3.0.6", - "source-map-explorer": "^2.5.2" + "source-map-explorer": "^2.5.3" } } diff --git a/client/public/3rdparty-api.txt b/client/public/3rdparty-api.txt index 9d76ffc9c..f5acd9569 100644 --- a/client/public/3rdparty-api.txt +++ b/client/public/3rdparty-api.txt @@ -190,7 +190,7 @@ This package contains the following license and notice below: # @firebase/logger This package serves as the base of all logging in the JS SDK. Any logging that -is intended to be visible to Firebase end developers should go through this +is intended to be open to Firebase end developers should go through this module. ## Basic Usage @@ -9375,7 +9375,7 @@ parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible +to the extent that it includes a convenient and prominently open feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the diff --git a/client/public/3rdparty-app.txt b/client/public/3rdparty-app.txt index 0e6120c50..8fe9b97b2 100644 --- a/client/public/3rdparty-app.txt +++ b/client/public/3rdparty-app.txt @@ -1029,7 +1029,7 @@ The following NPM packages may be included in this product: - postcss-dir-pseudo-class@5.0.0 - postcss-double-position-gradients@1.0.0 - postcss-env-function@2.0.2 - - postcss-focus-visible@4.0.0 + - postcss-focus-open@4.0.0 - postcss-focus-within@3.0.0 - postcss-gap-properties@2.0.0 - postcss-image-set-function@3.0.1 @@ -1699,7 +1699,7 @@ This package contains the following license and notice below: # @firebase/logger This package serves as the base of all logging in the JS SDK. Any logging that -is intended to be visible to Firebase end developers should go through this +is intended to be open to Firebase end developers should go through this module. ## Basic Usage @@ -24029,7 +24029,7 @@ parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible +to the extent that it includes a convenient and prominently open feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index c58ddd7e4..668d9bc75 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -2,14 +2,15 @@ import { ApolloProvider } from "@apollo/client"; import { SplitFactory, SplitSdk } from "@splitsoftware/splitio-react"; import { ConfigProvider } from "antd"; import enLocale from "antd/es/locale/en_US"; -import moment from "moment"; +import dayjs from "../utils/day"; +import 'dayjs/locale/en'; import React from "react"; import { useTranslation } from "react-i18next"; import GlobalLoadingBar from "../components/global-loading-bar/global-loading-bar.component"; import client from "../utils/GraphQLClient"; import App from "./App"; -moment.locale("en-US"); +dayjs.locale("en"); export const factory = SplitSdk({ core: { diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index cce68932e..a46aeb702 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -1,11 +1,11 @@ -import { useClient } from "@splitsoftware/splitio-react"; -import { Button, Result } from "antd"; +import {useSplitClient} from "@splitsoftware/splitio-react"; +import {Button, Result} from "antd"; import LogRocket from "logrocket"; -import React, { lazy, Suspense, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Route, Switch } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {lazy, Suspense, useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Route, Routes} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import DocumentEditorContainer from "../components/document-editor/document-editor.container"; import ErrorBoundary from "../components/error-boundary/error-boundary.component"; //Component Imports @@ -13,149 +13,136 @@ import LoadingSpinner from "../components/loading-spinner/loading-spinner.compon import DisclaimerPage from "../pages/disclaimer/disclaimer.page"; import LandingPage from "../pages/landing/landing.page"; import TechPageContainer from "../pages/tech/tech.page.container"; -import { setOnline } from "../redux/application/application.actions"; -import { selectOnline } from "../redux/application/application.selectors"; -import { checkUserSession } from "../redux/user/user.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../redux/user/user.selectors"; -import PrivateRoute from "../utils/private-route"; +import {setOnline} from "../redux/application/application.actions"; +import {selectOnline} from "../redux/application/application.selectors"; +import {checkUserSession} from "../redux/user/user.actions"; +import {selectBodyshop, selectCurrentUser,} from "../redux/user/user.selectors"; +import PrivateRoute from "../components/PrivateRoute"; import "./App.styles.scss"; +import handleBeta from "../utils/betaHandler"; const ResetPassword = lazy(() => - import("../pages/reset-password/reset-password.component") + import("../pages/reset-password/reset-password.component") ); const ManagePage = lazy(() => import("../pages/manage/manage.page.container")); const SignInPage = lazy(() => import("../pages/sign-in/sign-in.page")); const CsiPage = lazy(() => import("../pages/csi/csi.container.page")); const MobilePaymentContainer = lazy(() => - import("../pages/mobile-payment/mobile-payment.container") + import("../pages/mobile-payment/mobile-payment.container") ); - const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - online: selectOnline, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + online: selectOnline, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - checkUserSession: () => dispatch(checkUserSession()), - setOnline: (isOnline) => dispatch(setOnline(isOnline)), + checkUserSession: () => dispatch(checkUserSession()), + setOnline: (isOnline) => dispatch(setOnline(isOnline)), }); -export function App({ - bodyshop, - checkUserSession, - currentUser, - online, - setOnline, -}) { - const client = useClient(); +export function App({bodyshop, checkUserSession, currentUser, online, setOnline}) { - useEffect(() => { - if (!navigator.onLine) { - setOnline(false); - } + const client = useSplitClient().client; + const [listenersAdded, setListenersAdded] = useState(false) + const {t} = useTranslation(); - checkUserSession(); - }, [checkUserSession, setOnline]); - //const b = Grid.useBreakpoint(); - // console.log("Breakpoints:", b); - - const { t } = useTranslation(); - - window.addEventListener("offline", function (e) { - setOnline(false); - }); - - window.addEventListener("online", function (e) { - setOnline(true); - }); - useEffect(() => { - if (currentUser.authorized && bodyshop) { - client.setAttribute("imexshopid", bodyshop.imexshopid); - - LogRocket.init("rome-online/rome-online"); - if (client.getTreatment("LogRocket_Tracking") === "on") { - LogRocket.init("rome-online/rome-online"); - } - } - }, [bodyshop, client, currentUser.authorized]); - - if (currentUser.authorized === null) { - return ; - } - - if (!online) - return ( - { - window.location.reload(); - }} - > - {t("general.actions.refresh")} - + useEffect(() => { + if (!navigator.onLine) { + setOnline(false); } - /> - ); - return ( - - }> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); + checkUserSession(); + }, [checkUserSession, setOnline]); + + //const b = Grid.useBreakpoint(); + // console.log("Breakpoints:", b); + + // Associate event listeners, memoize to prevent multiple listeners being added + useEffect(() => { + const offlineListener = (e) => { + setOnline(false); + } + + const onlineListener = (e) => { + setOnline(true); + } + + if (!listenersAdded) { + console.log('Added events for offline and online'); + window.addEventListener("offline", offlineListener); + window.addEventListener("online", onlineListener); + setListenersAdded(true); + } + + return () => { + window.removeEventListener("offline", offlineListener); + window.removeEventListener("online", onlineListener); + } + }, [setOnline, listenersAdded]); + + useEffect(() => { + if (currentUser.authorized && bodyshop) { + client.setAttribute("imexshopid", bodyshop.imexshopid); + + if ( + client.getTreatment("LogRocket_Tracking") === "on" || + window.location.hostname === 'beta.romeonline.io' + ) { + console.log("LR Start"); + LogRocket.init("rome-online/rome-online"); + } + } + }, [bodyshop, client, currentUser.authorized]); + + if (currentUser.authorized === null) { + return ; + } + + handleBeta(); + + if (!online) + return ( + { + window.location.reload(); + }} + > + {t("general.actions.refresh")} + + } + /> + ); + + // Any route that is not assigned and matched will default to the Landing Page component + return ( + }> + + }/> + }/> + }/> + }/> + }/> + }/> + }> + }/> + + }> + }/> + + }> + }/> + + + + ); } export default connect(mapStateToProps, mapDispatchToProps)(App); diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index 50e656895..63358885a 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -1,6 +1,14 @@ //Global Styles. @import "react-big-calendar/lib/sass/styles"; +.ant-menu-item-divider { + border-bottom: 1px solid #74695c !important; +} + +.ant-menu-dark .ant-menu-item:hover { + background-color: #1890ff !important; +} + .imex-table-header { display: flex; flex-wrap: wrap; diff --git a/client/src/components/PrivateRoute.js b/client/src/components/PrivateRoute.js new file mode 100644 index 000000000..c1d9ef74f --- /dev/null +++ b/client/src/components/PrivateRoute.js @@ -0,0 +1,17 @@ +import React, {useEffect} from "react"; +import {Outlet, useLocation, useNavigate} from "react-router-dom"; + +function PrivateRoute({component: Component, isAuthorized, ...rest}) { + const location = useLocation(); + const navigate = useNavigate(); + + useEffect(() => { + if (!isAuthorized) { + navigate(`/signin?redirect=${location.pathname}`); + } + }, [isAuthorized, navigate, location]); + + return ; +} + +export default PrivateRoute; \ No newline at end of file diff --git a/client/src/components/_test/test.page.jsx b/client/src/components/_test/test.page.jsx index 13195631b..df1d9b41b 100644 --- a/client/src/components/_test/test.page.jsx +++ b/client/src/components/_test/test.page.jsx @@ -1,31 +1,31 @@ -import { Button } from "antd"; +import {Button} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setModalContext} from "../../redux/modals/modals.actions"; const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({ - setRefundPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "refund_payment" })), + setRefundPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "refund_payment"})), }); -function Test({ setRefundPaymentContext, refundPaymentModal }) { - console.log("refundPaymentModal", refundPaymentModal); - return ( -
- -
- ); +function Test({setRefundPaymentContext, refundPaymentModal}) { + console.log("refundPaymentModal", refundPaymentModal); + return ( +
+ +
+ ); } export default connect(mapStateToProps, mapDispatchToProps)(Test); diff --git a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx index 260589c2f..07d0e9b4a 100644 --- a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx +++ b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx @@ -1,233 +1,233 @@ -import { Input, Table, Checkbox, Card, Space } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {Card, Checkbox, Input, Space, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import {alphaSort, dateSort} from "../../utils/sorters"; import PayableExportButton from "../payable-export-button/payable-export-button.component"; import PayableExportAll from "../payable-export-all-button/payable-export-all-button.component"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {DateFormatter} from "../../utils/DateFormatter"; import queryString from "query-string"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; import BillMarkSelectedExported from "../payable-mark-selected-exported/payable-mark-selected-exported.component"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingPayablesTableComponent); export function AccountingPayablesTableComponent({ - bodyshop, - loading, - bills, - refetch, -}) { - const { t } = useTranslation(); - const [selectedBills, setSelectedBills] = useState([]); - const [transInProgress, setTransInProgress] = useState(false); - const [state, setState] = useState({ - sortedInfo: {}, - search: "", - }); + bodyshop, + loading, + bills, + refetch, + }) { + const {t} = useTranslation(); + const [selectedBills, setSelectedBills] = useState([]); + const [transInProgress, setTransInProgress] = useState(false); + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("bills.fields.vendorname"), - dataIndex: "vendorname", - key: "vendorname", - sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), - sortOrder: - state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, - render: (text, record) => ( - alphaSort(a.vendor.name, b.vendor.name), + sortOrder: + state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + render: (text, record) => ( + + {record.vendor.name} + + ), + }, + { + title: t("bills.fields.invoice_number"), + dataIndex: "invoice_number", + key: "invoice_number", + sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), + sortOrder: + state.sortedInfo.columnKey === "invoice_number" && + state.sortedInfo.order, + render: (text, record) => ( + + {record.invoice_number} + + ), + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("bills.fields.date"), + dataIndex: "date", + key: "date", + + sorter: (a, b) => dateSort(a.date, b.date), + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("bills.fields.total"), + dataIndex: "total", + key: "total", + + sorter: (a, b) => a.total - b.total, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => ( + {record.total} + ), + }, + { + title: t("bills.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: t("exportlogs.labels.attempts"), + dataIndex: "attempts", + key: "attempts", + + render: (text, record) => ( + + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + sorter: (a, b) => a.clm_total - b.clm_total, + + render: (text, record) => ( + + ), + }, + ]; + + const handleSearch = (e) => { + setState({...state, search: e.target.value}); + logImEXEvent("accounting_payables_table_search"); + }; + + const dataSource = state.search + ? bills.filter( + (v) => + (v.vendor.name || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.invoice_number || "") + .toLowerCase() + .includes(state.search.toLowerCase()) + ) + : bills; + + return ( + + + + {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && ( + + )} + + + } > - {record.vendor.name} - - ), - }, - { - title: t("bills.fields.invoice_number"), - dataIndex: "invoice_number", - key: "invoice_number", - sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), - sortOrder: - state.sortedInfo.columnKey === "invoice_number" && - state.sortedInfo.order, - render: (text, record) => ( - - {record.invoice_number} - - ), - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => ( - {record.job.ro_number} - ), - }, - { - title: t("bills.fields.date"), - dataIndex: "date", - key: "date", - - sorter: (a, b) => dateSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("bills.fields.total"), - dataIndex: "total", - key: "total", - - sorter: (a, b) => a.total - b.total, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => ( - {record.total} - ), - }, - { - title: t("bills.fields.is_credit_memo"), - dataIndex: "is_credit_memo", - key: "is_credit_memo", - sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, - sortOrder: - state.sortedInfo.columnKey === "is_credit_memo" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: t("exportlogs.labels.attempts"), - dataIndex: "attempts", - key: "attempts", - - render: (text, record) => ( - - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - sorter: (a, b) => a.clm_total - b.clm_total, - - render: (text, record) => ( - - ), - }, - ]; - - const handleSearch = (e) => { - setState({ ...state, search: e.target.value }); - logImEXEvent("accounting_payables_table_search"); - }; - - const dataSource = state.search - ? bills.filter( - (v) => - (v.vendor.name || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.invoice_number || "") - .toLowerCase() - .includes(state.search.toLowerCase()) - ) - : bills; - - return ( - - - - {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && ( - - )} - - - } - > - - setSelectedBills(selectedRows.map((i) => i.id)), - onSelect: (record, selected, selectedRows, nativeEvent) => { - setSelectedBills(selectedRows.map((i) => i.id)); - }, - getCheckboxProps: (record) => ({ - disabled: record.exported, - }), - selectedRowKeys: selectedBills, - type: "checkbox", - }} - /> - - ); +
+ setSelectedBills(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedBills(selectedRows.map((i) => i.id)); + }, + getCheckboxProps: (record) => ({ + disabled: record.exported, + }), + selectedRowKeys: selectedBills, + type: "checkbox", + }} + /> + + ); } diff --git a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx index ecd785f91..a4ea52f59 100644 --- a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx +++ b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx @@ -1,14 +1,14 @@ -import { Card, Input, Space, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Card, Input, Space, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import {DateFormatter, DateTimeFormatter} from "../../utils/DateFormatter"; +import {alphaSort, dateSort} from "../../utils/sorters"; import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import PaymentExportButton from "../payment-export-button/payment-export-button.component"; @@ -18,215 +18,215 @@ import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingPayablesTableComponent); export function AccountingPayablesTableComponent({ - bodyshop, - loading, - payments, - refetch, -}) { - const { t } = useTranslation(); - const [selectedPayments, setSelectedPayments] = useState([]); - const [transInProgress, setTransInProgress] = useState(false); - const [state, setState] = useState({ - sortedInfo: {}, - search: "", - }); + bodyshop, + loading, + payments, + refetch, + }) { + const {t} = useTranslation(); + const [selectedPayments, setSelectedPayments] = useState([]); + const [transInProgress, setTransInProgress] = useState(false); + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => ( - {record.job.ro_number} - ), - }, - { - title: t("payments.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => dateSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("payments.fields.date"), + dataIndex: "date", + key: "date", + sorter: (a, b) => dateSort(a.date, b.date), + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - render: (text, record) => { - return record.job.owner ? ( - - - - ) : ( - - + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => { + return record.job.owner ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("payments.fields.amount"), - dataIndex: "amount", - key: "amount", - render: (text, record) => ( - {record.amount} - ), - }, - { - title: t("payments.fields.memo"), - dataIndex: "memo", - key: "memo", - }, - { - title: t("payments.fields.transactionid"), - dataIndex: "transactionid", - key: "transactionid", - }, - { - title: t("payments.fields.created_at"), - dataIndex: "created_at", - key: "created_at", - render: (text, record) => ( - {record.created_at} - ), - }, - { - title: t("payments.fields.exportedat"), - dataIndex: "exportedat", - key: "exportedat", - render: (text, record) => ( - {record.exportedat} - ), - }, - { - title: t("exportlogs.labels.attempts"), - dataIndex: "attempts", - key: "attempts", + ); + }, + }, + { + title: t("payments.fields.amount"), + dataIndex: "amount", + key: "amount", + render: (text, record) => ( + {record.amount} + ), + }, + { + title: t("payments.fields.memo"), + dataIndex: "memo", + key: "memo", + }, + { + title: t("payments.fields.transactionid"), + dataIndex: "transactionid", + key: "transactionid", + }, + { + title: t("payments.fields.created_at"), + dataIndex: "created_at", + key: "created_at", + render: (text, record) => ( + {record.created_at} + ), + }, + { + title: t("payments.fields.exportedat"), + dataIndex: "exportedat", + key: "exportedat", + render: (text, record) => ( + {record.exportedat} + ), + }, + { + title: t("exportlogs.labels.attempts"), + dataIndex: "attempts", + key: "attempts", - render: (text, record) => ( - - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - sorter: (a, b) => a.clm_total - b.clm_total, + render: (text, record) => ( + + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + sorter: (a, b) => a.clm_total - b.clm_total, - render: (text, record) => ( - - ), - }, - ]; + render: (text, record) => ( + + ), + }, + ]; - const handleSearch = (e) => { - setState({ ...state, search: e.target.value }); - logImEXEvent("account_payments_table_search"); - }; + const handleSearch = (e) => { + setState({...state, search: e.target.value}); + logImEXEvent("account_payments_table_search"); + }; - const dataSource = state.search - ? payments.filter( - (v) => - (v.paymentnum || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - ((v.job && v.job.ro_number) || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - ((v.job && v.job.ownr_fn) || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - ((v.job && v.job.ownr_ln) || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - ((v.job && v.job.ownr_co_nm) || "") - .toLowerCase() - .includes(state.search.toLowerCase()) - ) - : payments; + const dataSource = state.search + ? payments.filter( + (v) => + (v.paymentnum || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + ((v.job && v.job.ro_number) || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + ((v.job && v.job.ownr_fn) || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + ((v.job && v.job.ownr_ln) || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + ((v.job && v.job.ownr_co_nm) || "") + .toLowerCase() + .includes(state.search.toLowerCase()) + ) + : payments; - return ( - - - - {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && ( - - )} - - - } - > -
- setSelectedPayments(selectedRows.map((i) => i.id)), - onSelect: (record, selected, selectedRows, nativeEvent) => { - setSelectedPayments(selectedRows.map((i) => i.id)); - }, - getCheckboxProps: (record) => ({ - disabled: record.exported, - }), - selectedRowKeys: selectedPayments, - type: "checkbox", - }} - /> - - ); + return ( + + + + {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && ( + + )} + + + } + > +
+ setSelectedPayments(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedPayments(selectedRows.map((i) => i.id)); + }, + getCheckboxProps: (record) => ({ + disabled: record.exported, + }), + selectedRowKeys: selectedPayments, + type: "checkbox", + }} + /> + + ); } diff --git a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx index 082d42da2..2ff947618 100644 --- a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx +++ b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx @@ -1,247 +1,247 @@ -import { Button, Card, Input, Space, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {Button, Card, Input, Space, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import {alphaSort, dateSort} from "../../utils/sorters"; import JobExportButton from "../jobs-close-export-button/jobs-close-export-button.component"; import JobsExportAllButton from "../jobs-export-all-button/jobs-export-all-button.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {DateFormatter} from "../../utils/DateFormatter"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingReceivablesTableComponent); export function AccountingReceivablesTableComponent({ - bodyshop, - loading, - jobs, - refetch, -}) { - const { t } = useTranslation(); - const [selectedJobs, setSelectedJobs] = useState([]); - const [transInProgress, setTransInProgress] = useState(false); + bodyshop, + loading, + jobs, + refetch, + }) { + const {t} = useTranslation(); + const [selectedJobs, setSelectedJobs] = useState([]); + const [transInProgress, setTransInProgress] = useState(false); - const [state, setState] = useState({ - sortedInfo: {}, - search: "", - }); + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => ( - {record.ro_number} - ), - }, + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.ro_number} + ), + }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => a.status - b.status, - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.date_invoiced"), - dataIndex: "date_invoiced", - key: "date_invoiced", - sorter: (a, b) => dateSort(a.date_invoiced, b.date_invoiced), - sortOrder: - state.sortedInfo.columnKey === "date_invoiced" && - state.sortedInfo.order, - render: (text, record) => ( - {record.date_invoiced} - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - render: (text, record) => { - return record.owner ? ( - - - - ) : ( - - + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => a.status - b.status, + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.date_invoiced"), + dataIndex: "date_invoiced", + key: "date_invoiced", + sorter: (a, b) => dateSort(a.date_invoiced, b.date_invoiced), + sortOrder: + state.sortedInfo.columnKey === "date_invoiced" && + state.sortedInfo.order, + render: (text, record) => ( + {record.date_invoiced} + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => { + return record.owner ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ) : ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ); - }, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.clm_total"), - dataIndex: "clm_total", - key: "clm_total", - sorter: (a, b) => a.clm_total - b.clm_total, - sortOrder: - state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, - render: (text, record) => { - return {record.clm_total}; - }, - }, - { - title: t("exportlogs.labels.attempts"), - dataIndex: "attempts", - key: "attempts", - render: (text, record) => ( - - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", + ); + }, + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, + render: (text, record) => { + return {record.clm_total}; + }, + }, + { + title: t("exportlogs.labels.attempts"), + dataIndex: "attempts", + key: "attempts", + render: (text, record) => ( + + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", - render: (text, record) => ( - - - - - - - ), - }, - ]; + render: (text, record) => ( + + + + + + + ), + }, + ]; - const handleSearch = (e) => { - setState({ ...state, search: e.target.value }); - logImEXEvent("accounting_receivables_search"); - }; + const handleSearch = (e) => { + setState({...state, search: e.target.value}); + logImEXEvent("accounting_receivables_search"); + }; - const dataSource = state.search - ? jobs.filter( - (v) => - (v.ro_number || "") - .toString() - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.ownr_fn || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.ownr_ln || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.ownr_co_nm || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.v_model_desc || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.v_make_desc || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.clm_no || "").toLowerCase().includes(state.search.toLowerCase()) - ) - : jobs; + const dataSource = state.search + ? jobs.filter( + (v) => + (v.ro_number || "") + .toString() + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.ownr_fn || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.ownr_ln || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.ownr_co_nm || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.v_model_desc || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.v_make_desc || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.clm_no || "").toLowerCase().includes(state.search.toLowerCase()) + ) + : jobs; - return ( - - {!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && ( - + {!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && ( + + )} + {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && ( + + )} + + + } + > +
+ setSelectedJobs(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedJobs(selectedRows.map((i) => i.id)); + }, + getCheckboxProps: (record) => ({ + disabled: record.exported, + }), + selectedRowKeys: selectedJobs, + type: "checkbox", + }} /> - )} - {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && ( - - )} - - - } - > -
- setSelectedJobs(selectedRows.map((i) => i.id)), - onSelect: (record, selected, selectedRows, nativeEvent) => { - setSelectedJobs(selectedRows.map((i) => i.id)); - }, - getCheckboxProps: (record) => ({ - disabled: record.exported, - }), - selectedRowKeys: selectedJobs, - type: "checkbox", - }} - /> - - ); + + ); } diff --git a/client/src/components/alert/alert.component.jsx b/client/src/components/alert/alert.component.jsx index f02edd614..5af5fce31 100644 --- a/client/src/components/alert/alert.component.jsx +++ b/client/src/components/alert/alert.component.jsx @@ -1,6 +1,6 @@ -import { Alert } from "antd"; +import {Alert} from "antd"; import React from "react"; export default function AlertComponent(props) { - return ; + return ; } diff --git a/client/src/components/alert/alert.component.test.js b/client/src/components/alert/alert.component.test.js index f4cd6cbaa..32114c305 100644 --- a/client/src/components/alert/alert.component.test.js +++ b/client/src/components/alert/alert.component.test.js @@ -1,19 +1,19 @@ -import { shallow } from "enzyme"; +import {shallow} from "enzyme"; import React from "react"; import Alert from "./alert.component"; describe("Alert component", () => { - let wrapper; - beforeEach(() => { - const mockProps = { - type: "error", - message: "Test error message.", - }; + let wrapper; + beforeEach(() => { + const mockProps = { + type: "error", + message: "Test error message.", + }; - wrapper = shallow(); - }); + wrapper = shallow(); + }); - it("should render Alert component", () => { - expect(wrapper).toMatchSnapshot(); - }); + it("should render Alert component", () => { + expect(wrapper).toMatchSnapshot(); + }); }); diff --git a/client/src/components/allocations-assignment/allocations-assignment.component.jsx b/client/src/components/allocations-assignment/allocations-assignment.component.jsx index bc6273bdb..1d1804341 100644 --- a/client/src/components/allocations-assignment/allocations-assignment.component.jsx +++ b/client/src/components/allocations-assignment/allocations-assignment.component.jsx @@ -1,72 +1,72 @@ -import { Select, Button, Popover, InputNumber } from "antd"; +import {Button, InputNumber, Popover, Select} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop }); export function AllocationsAssignmentComponent({ - bodyshop, - handleAssignment, - assignment, - setAssignment, - visibilityState, - maxHours -}) { - const { t } = useTranslation(); + bodyshop, + handleAssignment, + assignment, + setAssignment, + visibilityState, + maxHours + }) { + const {t} = useTranslation(); - const onChange = e => { - setAssignment({ ...assignment, employeeid: e }); - }; + const onChange = e => { + setAssignment({...assignment, employeeid: e}); + }; - const [visibility, setVisibility] = visibilityState; + const [visibility, setVisibility] = visibilityState; - const popContent = ( -
- - setAssignment({ ...assignment, hours: e })} - /> + const popContent = ( +
+ + setAssignment({...assignment, hours: e})} + /> - - -
- ); + + +
+ ); - return ( - - - - ); + return ( + + + + ); } export default connect(mapStateToProps, null)(AllocationsAssignmentComponent); diff --git a/client/src/components/allocations-assignment/allocations-assignment.component.test.js b/client/src/components/allocations-assignment/allocations-assignment.component.test.js index 83fd82e12..8aad7efe6 100644 --- a/client/src/components/allocations-assignment/allocations-assignment.component.test.js +++ b/client/src/components/allocations-assignment/allocations-assignment.component.test.js @@ -1,35 +1,35 @@ -import { mount } from "enzyme"; +import {mount} from "enzyme"; import React from "react"; -import { MockBodyshop } from "../../utils/TestingHelpers"; -import { AllocationsAssignmentComponent } from "./allocations-assignment.component"; +import {MockBodyshop} from "../../utils/TestingHelpers"; +import {AllocationsAssignmentComponent} from "./allocations-assignment.component"; describe("AllocationsAssignmentComponent component", () => { - let wrapper; + let wrapper; - beforeEach(() => { - const mockProps = { - bodyshop: MockBodyshop, - handleAssignment: jest.fn(), - assignment: {}, - setAssignment: jest.fn(), - visibilityState: [false, jest.fn()], - maxHours: 4, - }; + beforeEach(() => { + const mockProps = { + bodyshop: MockBodyshop, + handleAssignment: jest.fn(), + assignment: {}, + setAssignment: jest.fn(), + visibilityState: [false, jest.fn()], + maxHours: 4, + }; - wrapper = mount(); - }); + wrapper = mount(); + }); - it("should render AllocationsAssignmentComponent component", () => { - expect(wrapper).toMatchSnapshot(); - }); + it("should render AllocationsAssignmentComponent component", () => { + expect(wrapper).toMatchSnapshot(); + }); - it("should render a list of employees", () => { - const empList = wrapper.find("#employeeSelector"); - expect(empList.children()).to.have.lengthOf(2); - }); + it("should render a list of employees", () => { + const empList = wrapper.find("#employeeSelector"); + expect(empList.children()).to.have.lengthOf(2); + }); - it("should create an allocation on save", () => { - wrapper.find("Button").simulate("click"); - expect(wrapper).toMatchSnapshot(); - }); + it("should create an allocation on save", () => { + wrapper.find("Button").simulate("click"); + expect(wrapper).toMatchSnapshot(); + }); }); diff --git a/client/src/components/allocations-assignment/allocations-assignment.container.jsx b/client/src/components/allocations-assignment/allocations-assignment.container.jsx index a082bc69c..5153066cb 100644 --- a/client/src/components/allocations-assignment/allocations-assignment.container.jsx +++ b/client/src/components/allocations-assignment/allocations-assignment.container.jsx @@ -1,47 +1,47 @@ -import React, { useState } from "react"; +import React, {useState} from "react"; import AllocationsAssignmentComponent from "./allocations-assignment.component"; -import { useMutation } from "@apollo/client"; -import { INSERT_ALLOCATION } from "../../graphql/allocations.queries"; -import { useTranslation } from "react-i18next"; -import { notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {INSERT_ALLOCATION} from "../../graphql/allocations.queries"; +import {useTranslation} from "react-i18next"; +import {notification} from "antd"; export default function AllocationsAssignmentContainer({ - jobLineId, - hours, - refetch, -}) { - const visibilityState = useState(false); - const { t } = useTranslation(); - const [assignment, setAssignment] = useState({ - joblineid: jobLineId, - hours: parseFloat(hours), - employeeid: null, - }); - const [insertAllocation] = useMutation(INSERT_ALLOCATION); + jobLineId, + hours, + refetch, + }) { + const visibilityState = useState(false); + const {t} = useTranslation(); + const [assignment, setAssignment] = useState({ + joblineid: jobLineId, + hours: parseFloat(hours), + employeeid: null, + }); + const [insertAllocation] = useMutation(INSERT_ALLOCATION); - const handleAssignment = () => { - insertAllocation({ variables: { alloc: { ...assignment } } }) - .then((r) => { - notification["success"]({ - message: t("allocations.successes.save"), - }); - visibilityState[1](false); - if (refetch) refetch(); - }) - .catch((error) => { - notification["error"]({ - message: t("employees.errors.saving", { message: error.message }), - }); - }); - }; + const handleAssignment = () => { + insertAllocation({variables: {alloc: {...assignment}}}) + .then((r) => { + notification["success"]({ + message: t("allocations.successes.save"), + }); + visibilityState[1](false); + if (refetch) refetch(); + }) + .catch((error) => { + notification["error"]({ + message: t("employees.errors.saving", {message: error.message}), + }); + }); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx b/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx index 9c0bef386..2af0d75d0 100644 --- a/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx +++ b/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx @@ -1,68 +1,68 @@ -import { Button, Popover, Select } from "antd"; +import {Button, Popover, Select} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export default connect( - mapStateToProps, - null + mapStateToProps, + null )(function AllocationsBulkAssignmentComponent({ - disabled, - bodyshop, - handleAssignment, - assignment, - setAssignment, - visibilityState, -}) { - const { t } = useTranslation(); + disabled, + bodyshop, + handleAssignment, + assignment, + setAssignment, + visibilityState, + }) { + const {t} = useTranslation(); - const onChange = (e) => { - setAssignment({ ...assignment, employeeid: e }); - }; + const onChange = (e) => { + setAssignment({...assignment, employeeid: e}); + }; - const [visibility, setVisibility] = visibilityState; + const [visibility, setVisibility] = visibilityState; - const popContent = ( -
- + const popContent = ( +
+ - - -
- ); + + +
+ ); - return ( - - - - ); + return ( + + + + ); }); diff --git a/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.container.jsx b/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.container.jsx index fc6eb5a33..aad3ea8d2 100644 --- a/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.container.jsx +++ b/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.container.jsx @@ -1,47 +1,47 @@ -import React, { useState } from "react"; +import React, {useState} from "react"; import AllocationsBulkAssignment from "./allocations-bulk-assignment.component"; -import { useMutation } from "@apollo/client"; -import { INSERT_ALLOCATION } from "../../graphql/allocations.queries"; -import { useTranslation } from "react-i18next"; -import { notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {INSERT_ALLOCATION} from "../../graphql/allocations.queries"; +import {useTranslation} from "react-i18next"; +import {notification} from "antd"; export default function AllocationsBulkAssignmentContainer({ - jobLines, - refetch, -}) { - const visibilityState = useState(false); - const { t } = useTranslation(); - const [assignment, setAssignment] = useState({ - employeeid: null, - }); - const [insertAllocation] = useMutation(INSERT_ALLOCATION); - - const handleAssignment = () => { - const allocs = jobLines.reduce((acc, value) => { - acc.push({ - joblineid: value.id, - hours: parseFloat(value.mod_lb_hrs) || 0, - employeeid: assignment.employeeid, - }); - return acc; - }, []); - - insertAllocation({ variables: { alloc: allocs } }).then((r) => { - notification["success"]({ - message: t("employees.successes.save"), - }); - visibilityState[1](false); - if (refetch) refetch(); + jobLines, + refetch, + }) { + const visibilityState = useState(false); + const {t} = useTranslation(); + const [assignment, setAssignment] = useState({ + employeeid: null, }); - }; + const [insertAllocation] = useMutation(INSERT_ALLOCATION); - return ( - 0 ? false : true} - handleAssignment={handleAssignment} - assignment={assignment} - setAssignment={setAssignment} - visibilityState={visibilityState} - /> - ); + const handleAssignment = () => { + const allocs = jobLines.reduce((acc, value) => { + acc.push({ + joblineid: value.id, + hours: parseFloat(value.mod_lb_hrs) || 0, + employeeid: assignment.employeeid, + }); + return acc; + }, []); + + insertAllocation({variables: {alloc: allocs}}).then((r) => { + notification["success"]({ + message: t("employees.successes.save"), + }); + visibilityState[1](false); + if (refetch) refetch(); + }); + }; + + return ( + 0 ? false : true} + handleAssignment={handleAssignment} + assignment={assignment} + setAssignment={setAssignment} + visibilityState={visibilityState} + /> + ); } diff --git a/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx b/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx index 41b14c593..9f1447348 100644 --- a/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx +++ b/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx @@ -1,20 +1,20 @@ import Icon from "@ant-design/icons"; import React from "react"; -import { MdRemoveCircleOutline } from "react-icons/md"; +import {MdRemoveCircleOutline} from "react-icons/md"; -export default function AllocationsLabelComponent({ allocation, handleClick }) { - return ( -
+export default function AllocationsLabelComponent({allocation, handleClick}) { + return ( +
{`${allocation.employee.first_name || ""} ${ - allocation.employee.last_name || "" + allocation.employee.last_name || "" } (${allocation.hours || ""})`} - -
- ); + +
+ ); } diff --git a/client/src/components/allocations-employee-label/allocations-employee-label.container.jsx b/client/src/components/allocations-employee-label/allocations-employee-label.container.jsx index 539afd898..e573e806b 100644 --- a/client/src/components/allocations-employee-label/allocations-employee-label.container.jsx +++ b/client/src/components/allocations-employee-label/allocations-employee-label.container.jsx @@ -1,32 +1,32 @@ import React from "react"; -import { useMutation } from "@apollo/client"; -import { DELETE_ALLOCATION } from "../../graphql/allocations.queries"; +import {useMutation} from "@apollo/client"; +import {DELETE_ALLOCATION} from "../../graphql/allocations.queries"; import AllocationsLabelComponent from "./allocations-employee-label.component"; -import { notification } from "antd"; -import { useTranslation } from "react-i18next"; +import {notification} from "antd"; +import {useTranslation} from "react-i18next"; -export default function AllocationsLabelContainer({ allocation, refetch }) { - const [deleteAllocation] = useMutation(DELETE_ALLOCATION); - const { t } = useTranslation(); +export default function AllocationsLabelContainer({allocation, refetch}) { + const [deleteAllocation] = useMutation(DELETE_ALLOCATION); + const {t} = useTranslation(); - const handleClick = (e) => { - e.preventDefault(); - deleteAllocation({ variables: { id: allocation.id } }) - .then((r) => { - notification["success"]({ - message: t("allocations.successes.deleted"), - }); - if (refetch) refetch(); - }) - .catch((error) => { - notification["error"]({ message: t("allocations.errors.deleting") }); - }); - }; + const handleClick = (e) => { + e.preventDefault(); + deleteAllocation({variables: {id: allocation.id}}) + .then((r) => { + notification["success"]({ + message: t("allocations.successes.deleted"), + }); + if (refetch) refetch(); + }) + .catch((error) => { + notification["error"]({message: t("allocations.errors.deleting")}); + }); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/audit-trail-list/audit-trail-list.component.jsx b/client/src/components/audit-trail-list/audit-trail-list.component.jsx index 651bb5794..3f6decd80 100644 --- a/client/src/components/audit-trail-list/audit-trail-list.component.jsx +++ b/client/src/components/audit-trail-list/audit-trail-list.component.jsx @@ -1,85 +1,85 @@ -import React, { useState } from "react"; -import { Table } from "antd"; -import { alphaSort } from "../../utils/sorters"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; -import { useTranslation } from "react-i18next"; +import React, {useState} from "react"; +import {Table} from "antd"; +import {alphaSort} from "../../utils/sorters"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; import AuditTrailValuesComponent from "../audit-trail-values/audit-trail-values.component"; import {pageLimit} from "../../utils/config"; -export default function AuditTrailListComponent({ loading, data }) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: {}, - }); - const { t } = useTranslation(); - const columns = [ - { - title: t("audit.fields.created"), - dataIndex: " created", - key: " created", - width: "10%", - render: (text, record) => ( - {record.created} - ), - sorter: (a, b) => a.created - b.created, - sortOrder: - state.sortedInfo.columnKey === "created" && state.sortedInfo.order, - }, - { - title: t("audit.fields.operation"), - dataIndex: "operation", - key: "operation", - width: "10%", - sorter: (a, b) => alphaSort(a.operation, b.operation), - sortOrder: - state.sortedInfo.columnKey === "operation" && state.sortedInfo.order, - }, - { - title: t("audit.fields.values"), - dataIndex: " old_val", - key: " old_val", - width: "10%", - render: (text, record) => ( - ( + {record.created} + ), + sorter: (a, b) => a.created - b.created, + sortOrder: + state.sortedInfo.columnKey === "created" && state.sortedInfo.order, + }, + { + title: t("audit.fields.operation"), + dataIndex: "operation", + key: "operation", + width: "10%", + sorter: (a, b) => alphaSort(a.operation, b.operation), + sortOrder: + state.sortedInfo.columnKey === "operation" && state.sortedInfo.order, + }, + { + title: t("audit.fields.values"), + dataIndex: " old_val", + key: " old_val", + width: "10%", + render: (text, record) => ( + + ), + }, + { + title: t("audit.fields.useremail"), + dataIndex: "useremail", + key: "useremail", + width: "10%", + sorter: (a, b) => alphaSort(a.useremail, b.useremail), + sortOrder: + state.sortedInfo.columnKey === "useremail" && state.sortedInfo.order, + }, + ]; + + const formItemLayout = { + labelCol: { + xs: {span: 12}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 12}, + }, + }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + return ( +
- ), - }, - { - title: t("audit.fields.useremail"), - dataIndex: "useremail", - key: "useremail", - width: "10%", - sorter: (a, b) => alphaSort(a.useremail, b.useremail), - sortOrder: - state.sortedInfo.columnKey === "useremail" && state.sortedInfo.order, - }, - ]; - - const formItemLayout = { - labelCol: { - xs: { span: 12 }, - sm: { span: 5 }, - }, - wrapperCol: { - xs: { span: 24 }, - sm: { span: 12 }, - }, - }; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - return ( -
- ); + ); } diff --git a/client/src/components/audit-trail-list/audit-trail-list.container.jsx b/client/src/components/audit-trail-list/audit-trail-list.container.jsx index 966f8e2ff..cd5672943 100644 --- a/client/src/components/audit-trail-list/audit-trail-list.container.jsx +++ b/client/src/components/audit-trail-list/audit-trail-list.container.jsx @@ -1,40 +1,40 @@ import React from "react"; import AuditTrailListComponent from "./audit-trail-list.component"; -import { useQuery } from "@apollo/client"; -import { QUERY_AUDIT_TRAIL } from "../../graphql/audit_trail.queries"; +import {useQuery} from "@apollo/client"; +import {QUERY_AUDIT_TRAIL} from "../../graphql/audit_trail.queries"; import AlertComponent from "../alert/alert.component"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import EmailAuditTrailListComponent from "./email-audit-trail-list.component"; -import { Card, Row } from "antd"; +import {Card, Row} from "antd"; -export default function AuditTrailListContainer({ recordId }) { - const { loading, error, data } = useQuery(QUERY_AUDIT_TRAIL, { - variables: { id: recordId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +export default function AuditTrailListContainer({recordId}) { + const {loading, error, data} = useQuery(QUERY_AUDIT_TRAIL, { + variables: {id: recordId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - logImEXEvent("audittrail_view", { recordId }); - return ( -
- {error ? ( - - ) : ( - - - - - - - - - )} -
- ); + logImEXEvent("audittrail_view", {recordId}); + return ( +
+ {error ? ( + + ) : ( + + + + + + + + + )} +
+ ); } diff --git a/client/src/components/audit-trail-list/email-audit-trail-list.component.jsx b/client/src/components/audit-trail-list/email-audit-trail-list.component.jsx index f96db86b2..015b0d962 100644 --- a/client/src/components/audit-trail-list/email-audit-trail-list.component.jsx +++ b/client/src/components/audit-trail-list/email-audit-trail-list.component.jsx @@ -1,64 +1,64 @@ -import { Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import {alphaSort} from "../../utils/sorters"; import {pageLimit} from "../../utils/config"; -export default function EmailAuditTrailListComponent({ loading, data }) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: {}, - }); - const { t } = useTranslation(); - const columns = [ - { - title: t("audit.fields.created"), - dataIndex: " created", - key: " created", - width: "10%", - render: (text, record) => ( - {record.created} - ), - sorter: (a, b) => a.created - b.created, - sortOrder: - state.sortedInfo.columnKey === "created" && state.sortedInfo.order, - }, +export default function EmailAuditTrailListComponent({loading, data}) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {}, + }); + const {t} = useTranslation(); + const columns = [ + { + title: t("audit.fields.created"), + dataIndex: " created", + key: " created", + width: "10%", + render: (text, record) => ( + {record.created} + ), + sorter: (a, b) => a.created - b.created, + sortOrder: + state.sortedInfo.columnKey === "created" && state.sortedInfo.order, + }, - { - title: t("audit.fields.useremail"), - dataIndex: "useremail", - key: "useremail", - width: "10%", - sorter: (a, b) => alphaSort(a.useremail, b.useremail), - sortOrder: - state.sortedInfo.columnKey === "useremail" && state.sortedInfo.order, - }, - ]; + { + title: t("audit.fields.useremail"), + dataIndex: "useremail", + key: "useremail", + width: "10%", + sorter: (a, b) => alphaSort(a.useremail, b.useremail), + sortOrder: + state.sortedInfo.columnKey === "useremail" && state.sortedInfo.order, + }, + ]; - const formItemLayout = { - labelCol: { - xs: { span: 12 }, - sm: { span: 5 }, - }, - wrapperCol: { - xs: { span: 24 }, - sm: { span: 12 }, - }, - }; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const formItemLayout = { + labelCol: { + xs: {span: 12}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 12}, + }, + }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - return ( -
- ); + return ( +
+ ); } diff --git a/client/src/components/audit-trail-values/audit-trail-values.component.jsx b/client/src/components/audit-trail-values/audit-trail-values.component.jsx index d9a9854eb..3838a60dd 100644 --- a/client/src/components/audit-trail-values/audit-trail-values.component.jsx +++ b/client/src/components/audit-trail-values/audit-trail-values.component.jsx @@ -1,29 +1,30 @@ import React from "react"; -import { List } from "antd"; +import {List} from "antd"; import Icon from "@ant-design/icons"; -import { FaArrowRight } from "react-icons/fa"; -export default function AuditTrailValuesComponent({ oldV, newV }) { - if (!oldV && !newV) return
; +import {FaArrowRight} from "react-icons/fa"; + +export default function AuditTrailValuesComponent({oldV, newV}) { + if (!oldV && !newV) return
; + + if (!oldV && newV) + return ( + + {Object.keys(newV).map((key, idx) => ( + + {key}: {JSON.stringify(newV[key])} + + ))} + + ); - if (!oldV && newV) return ( - - {Object.keys(newV).map((key, idx) => ( - - {key}: {JSON.stringify(newV[key])} - - ))} - + + {Object.keys(oldV).map((key, idx) => ( + + {key}: {oldV[key]} + {JSON.stringify(newV[key])} + + ))} + ); - - return ( - - {Object.keys(oldV).map((key, idx) => ( - - {key}: {oldV[key]} - {JSON.stringify(newV[key])} - - ))} - - ); } diff --git a/client/src/components/barcode-popup/barcode-popup.component.jsx b/client/src/components/barcode-popup/barcode-popup.component.jsx index cd59a4a7c..457de3b49 100644 --- a/client/src/components/barcode-popup/barcode-popup.component.jsx +++ b/client/src/components/barcode-popup/barcode-popup.component.jsx @@ -1,22 +1,23 @@ -import { Tag, Popover } from "antd"; +import {Popover, Tag} from "antd"; import React from "react"; import Barcode from "react-barcode"; -import { useTranslation } from "react-i18next"; -export default function BarcodePopupComponent({ value, children }) { - const { t } = useTranslation(); - return ( -
- - } - > - {children ? children : {t("general.labels.barcode")}} - -
- ); +import {useTranslation} from "react-i18next"; + +export default function BarcodePopupComponent({value, children}) { + const {t} = useTranslation(); + return ( +
+ + } + > + {children ? children : {t("general.labels.barcode")}} + +
+ ); } diff --git a/client/src/components/bill-cm-returns-table/bill-cm-returns-table.component.jsx b/client/src/components/bill-cm-returns-table/bill-cm-returns-table.component.jsx index 47588ef1c..7e2e43dd2 100644 --- a/client/src/components/bill-cm-returns-table/bill-cm-returns-table.component.jsx +++ b/client/src/components/bill-cm-returns-table/bill-cm-returns-table.component.jsx @@ -1,135 +1,136 @@ -import { Checkbox, Form, Skeleton, Typography } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; +import {Checkbox, Form, Skeleton, Typography} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component"; import "./bill-cm-returns-table.styles.scss"; + export default function BillCmdReturnsTableComponent({ - form, - returnLoading, - returnData, -}) { - const { t } = useTranslation(); + form, + returnLoading, + returnData, + }) { + const {t} = useTranslation(); - useEffect(() => { - if (returnData) { - form.setFieldsValue({ - outstanding_returns: returnData.parts_order_lines, - }); - } - }, [returnData, form]); - - return ( - - prev.jobid !== cur.jobid || - prev.is_credit_memo !== cur.is_credit_memo || - prev.vendorid !== cur.vendorid - } - noStyle - > - {() => { - const isReturn = form.getFieldValue("is_credit_memo"); - - if (!isReturn) { - return null; + useEffect(() => { + if (returnData) { + form.setFieldsValue({ + outstanding_returns: returnData.parts_order_lines, + }); } + }, [returnData, form]); - if (returnLoading) return ; + return ( + + prev.jobid !== cur.jobid || + prev.is_credit_memo !== cur.is_credit_memo || + prev.vendorid !== cur.vendorid + } + noStyle + > + {() => { + const isReturn = form.getFieldValue("is_credit_memo"); - return ( - - {(fields, { add, remove, move }) => { - return ( - <> - - {t("bills.labels.creditsnotreceived")} - -
- - - - - - - - - - - - {fields.map((field, index) => ( - - + if (!isReturn) { + return null; + } - - - - + if (returnLoading) return ; - - - ))} - -
{t("parts_orders.fields.line_desc")}{t("parts_orders.fields.part_type")}{t("parts_orders.fields.quantity")}{t("parts_orders.fields.act_price")}{t("parts_orders.fields.cost")}{t("parts_orders.labels.mark_as_received")}
- - - - - - - - - - - - - - - - - - - - - - - -
- - ); + return ( + + {(fields, {add, remove, move}) => { + return ( + <> + + {t("bills.labels.creditsnotreceived")} + + + + + + + + + + + + + + {fields.map((field, index) => ( + + + + + + + + + + + ))} + +
{t("parts_orders.fields.line_desc")}{t("parts_orders.fields.part_type")}{t("parts_orders.fields.quantity")}{t("parts_orders.fields.act_price")}{t("parts_orders.fields.cost")}{t("parts_orders.labels.mark_as_received")}
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + ); + }} +
+ ); }} - - ); - }} - - ); + + ); } diff --git a/client/src/components/bill-cm-returns-table/bill-cm-returns-table.styles.scss b/client/src/components/bill-cm-returns-table/bill-cm-returns-table.styles.scss index 442c4f35d..2b1a11fc7 100644 --- a/client/src/components/bill-cm-returns-table/bill-cm-returns-table.styles.scss +++ b/client/src/components/bill-cm-returns-table/bill-cm-returns-table.styles.scss @@ -1,19 +1,19 @@ .bill-cm-returns-table { - table-layout: fixed; - width: 100%; + table-layout: fixed; + width: 100%; - th, - td { - padding: 8px; - text-align: left; - border-bottom: 1px solid #ddd; + th, + td { + padding: 8px; + text-align: left; + border-bottom: 1px solid #ddd; - .ant-form-item { - margin-bottom: 0px !important; - } + .ant-form-item { + margin-bottom: 0px !important; } + } - tr:hover { - background-color: #f5f5f5; - } + tr:hover { + background-color: #f5f5f5; + } } \ No newline at end of file diff --git a/client/src/components/bill-delete-button/bill-delete-button.component.jsx b/client/src/components/bill-delete-button/bill-delete-button.component.jsx index 5d2d154f6..e0f096754 100644 --- a/client/src/components/bill-delete-button/bill-delete-button.component.jsx +++ b/client/src/components/bill-delete-button/bill-delete-button.component.jsx @@ -1,80 +1,80 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, notification, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { DELETE_BILL } from "../../graphql/bills.queries"; +import {DeleteFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, notification, Popconfirm} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {DELETE_BILL} from "../../graphql/bills.queries"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; -export default function BillDeleteButton({ bill, callback }) { - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const [deleteBill] = useMutation(DELETE_BILL); +export default function BillDeleteButton({bill, callback}) { + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const [deleteBill] = useMutation(DELETE_BILL); - const handleDelete = async () => { - setLoading(true); - const result = await deleteBill({ - variables: { billId: bill.id }, - update(cache, { errors }) { - if (errors) return; - cache.modify({ - fields: { - bills(existingBills, { readField }) { - return existingBills.filter( - (billref) => bill.id !== readField("id", billref) - ); + const handleDelete = async () => { + setLoading(true); + const result = await deleteBill({ + variables: {billId: bill.id}, + update(cache, {errors}) { + if (errors) return; + cache.modify({ + fields: { + bills(existingBills, {readField}) { + return existingBills.filter( + (billref) => bill.id !== readField("id", billref) + ); + }, + search_bills(existingBills, {readField}) { + return existingBills.filter( + (billref) => bill.id !== readField("id", billref) + ); + }, + }, + }); }, - search_bills(existingBills, { readField }) { - return existingBills.filter( - (billref) => bill.id !== readField("id", billref) - ); - }, - }, }); - }, - }); - if (!!!result.errors) { - notification["success"]({ message: t("bills.successes.deleted") }); + if (!!!result.errors) { + notification["success"]({message: t("bills.successes.deleted")}); - if (callback && typeof callback === "function") callback(bill.id); - } else { - //Check if it's an fkey violation. - const error = JSON.stringify(result.errors); + if (callback && typeof callback === "function") callback(bill.id); + } else { + //Check if it's an fkey violation. + const error = JSON.stringify(result.errors); - if (error.toLowerCase().includes("inventory_billid_fkey")) { - notification["error"]({ - message: t("bills.errors.deleting", { - error: t("bills.errors.existinginventoryline"), - }), - }); - } else { - notification["error"]({ - message: t("bills.errors.deleting", { - error: JSON.stringify(result.errors), - }), - }); - } - } + if (error.toLowerCase().includes("inventory_billid_fkey")) { + notification["error"]({ + message: t("bills.errors.deleting", { + error: t("bills.errors.existinginventoryline"), + }), + }); + } else { + notification["error"]({ + message: t("bills.errors.deleting", { + error: JSON.stringify(result.errors), + }), + }); + } + } - setLoading(false); - }; + setLoading(false); + }; - return ( - }> - - - - - ); + return ( + }> + + + + + ); } diff --git a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx index 12ca80301..fd3f5ecbe 100644 --- a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx +++ b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx @@ -1,21 +1,17 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Button, Form, PageHeader, Popconfirm, Space } from "antd"; -import moment from "moment"; +import {useMutation, useQuery} from "@apollo/client"; +import {Button, Form, Popconfirm, Space} from "antd"; +import dayjs from "../../utils/day"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { - DELETE_BILL_LINE, - INSERT_NEW_BILL_LINES, - UPDATE_BILL_LINE, -} from "../../graphql/bill-lines.queries"; -import { QUERY_BILL_BY_PK, UPDATE_BILL } from "../../graphql/bills.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {DELETE_BILL_LINE, INSERT_NEW_BILL_LINES, UPDATE_BILL_LINE} from "../../graphql/bill-lines.queries"; +import {QUERY_BILL_BY_PK, UPDATE_BILL} from "../../graphql/bills.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import AlertComponent from "../alert/alert.component"; import BillFormContainer from "../bill-form/bill-form.container"; @@ -26,227 +22,226 @@ import JobDocumentsGallery from "../jobs-documents-gallery/jobs-documents-galler import JobsDocumentsLocalGallery from "../jobs-documents-local-gallery/jobs-documents-local-gallery.container"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import BillDetailEditReturn from "./bill-detail-edit-return.component"; +import {PageHeader} from "@ant-design/pro-layout"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setPartsOrderContext: (context) => - dispatch(setModalContext({ context: context, modal: "partsOrder" })), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + setPartsOrderContext: (context) => + dispatch(setModalContext({context: context, modal: "partsOrder"})), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillDetailEditcontainer); -export function BillDetailEditcontainer({ - setPartsOrderContext, - insertAuditTrail, - bodyshop, -}) { - const search = queryString.parse(useLocation().search); +export function BillDetailEditcontainer({setPartsOrderContext, insertAuditTrail, bodyshop,}) { + const search = queryString.parse(useLocation().search); - const { t } = useTranslation(); - const [form] = Form.useForm(); - const [visible, setVisible] = useState(false); - const [updateLoading, setUpdateLoading] = useState(false); - const [update_bill] = useMutation(UPDATE_BILL); - const [insertBillLine] = useMutation(INSERT_NEW_BILL_LINES); - const [updateBillLine] = useMutation(UPDATE_BILL_LINE); - const [deleteBillLine] = useMutation(DELETE_BILL_LINE); + const {t} = useTranslation(); + const [form] = Form.useForm(); + const [open, setOpen] = useState(false); + const [updateLoading, setUpdateLoading] = useState(false); + const [update_bill] = useMutation(UPDATE_BILL); + const [insertBillLine] = useMutation(INSERT_NEW_BILL_LINES); + const [updateBillLine] = useMutation(UPDATE_BILL_LINE); + const [deleteBillLine] = useMutation(DELETE_BILL_LINE); - const { loading, error, data, refetch } = useQuery(QUERY_BILL_BY_PK, { - variables: { billid: search.billid }, - skip: !!!search.billid, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const handleSave = () => { - //It's got a previously deducted bill line! - if ( - data.bills_by_pk.billlines.filter((b) => b.deductedfromlbr).length > 0 || - form.getFieldValue("billlines").filter((b) => b.deductedfromlbr).length > - 0 - ) - setVisible(true); - else { - form.submit(); - } - }; - - const handleFinish = async (values) => { - setUpdateLoading(true); - //let adjustmentsToInsert = {}; - - const { billlines, upload, ...bill } = values; - const updates = []; - updates.push( - update_bill({ - variables: { billId: search.billid, bill: bill }, - }) - ); - - billlines.forEach((l) => { - delete l.selected; + const {loading, error, data, refetch} = useQuery(QUERY_BILL_BY_PK, { + variables: {billid: search.billid}, + skip: !!!search.billid, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - //Find bill lines that were deleted. - const deletedJobLines = []; + // ... rest of the code remains the same - data.bills_by_pk.billlines.forEach((a) => { - const matchingRecord = billlines.find((b) => b.id === a.id); - if (!matchingRecord) { - deletedJobLines.push(a); - } - }); + const handleSave = () => { + //It's got a previously deducted bill line! + if ( + data.bills_by_pk.billlines.filter((b) => b.deductedfromlbr).length > 0 || + form.getFieldValue("billlines").filter((b) => b.deductedfromlbr).length > + 0 + ) + setOpen(true); + else { + form.submit(); + } + }; - deletedJobLines.forEach((d) => { - updates.push(deleteBillLine({ variables: { id: d.id } })); - }); + const handleFinish = async (values) => { + setUpdateLoading(true); + //let adjustmentsToInsert = {}; - billlines.forEach((billline) => { - const { deductedfromlbr, inventories, jobline, ...il } = billline; - delete il.__typename; - - if (il.id) { + const {billlines, upload, ...bill} = values; + const updates = []; updates.push( - updateBillLine({ - variables: { - billLineId: il.id, - billLine: { - ...il, - deductedfromlbr: deductedfromlbr, - joblineid: il.joblineid === "noline" ? null : il.joblineid, - }, - }, - }) + update_bill({ + variables: {billId: search.billid, bill: bill}, + }) ); - } else { - //It's a new line, have to insert it. - updates.push( - insertBillLine({ - variables: { - billLines: [ - { - ...il, - deductedfromlbr: deductedfromlbr, - billid: search.billid, - joblineid: il.joblineid === "noline" ? null : il.joblineid, - }, - ], - }, - }) - ); - } - }); - await Promise.all(updates); + billlines.forEach((l) => { + delete l.selected; + }); - insertAuditTrail({ - jobid: bill.jobid, - billid: search.billid, - operation: AuditTrailMapping.billupdated(bill.invoice_number), - }); + //Find bill lines that were deleted. + const deletedJobLines = []; - await refetch(); - form.setFieldsValue(transformData(data)); - form.resetFields(); - setVisible(false); - setUpdateLoading(false); - }; + data.bills_by_pk.billlines.forEach((a) => { + const matchingRecord = billlines.find((b) => b.id === a.id); + if (!matchingRecord) { + deletedJobLines.push(a); + } + }); - if (error) return ; - if (!search.billid) return <>; //
{t("bills.labels.noneselected")}
; + deletedJobLines.forEach((d) => { + updates.push(deleteBillLine({variables: {id: d.id}})); + }); - const exported = data && data.bills_by_pk && data.bills_by_pk.exported; + billlines.forEach((billline) => { + const {deductedfromlbr, inventories, jobline, ...il} = billline; + delete il.__typename; - return ( - <> - {loading && } - {data && ( + if (il.id) { + updates.push( + updateBillLine({ + variables: { + billLineId: il.id, + billLine: { + ...il, + deductedfromlbr: deductedfromlbr, + joblineid: il.joblineid === "noline" ? null : il.joblineid, + }, + }, + }) + ); + } else { + //It's a new line, have to insert it. + updates.push( + insertBillLine({ + variables: { + billLines: [ + { + ...il, + deductedfromlbr: deductedfromlbr, + billid: search.billid, + joblineid: il.joblineid === "noline" ? null : il.joblineid, + }, + ], + }, + }) + ); + } + }); + + await Promise.all(updates); + + insertAuditTrail({ + jobid: bill.jobid, + billid: search.billid, + operation: AuditTrailMapping.billupdated(bill.invoice_number), + }); + + await refetch(); + form.setFieldsValue(transformData(data)); + form.resetFields(); + setOpen(false); + setUpdateLoading(false); + }; + + if (error) return ; + if (!search.billid) return <>; //
{t("bills.labels.noneselected")}
; + + const exported = data && data.bills_by_pk && data.bills_by_pk.exported; + + return ( <> - - - - form.submit()} - onCancel={() => setVisible(false)} - okButtonProps={{ loading: updateLoading }} - title={t("bills.labels.editadjwarning")} - > - - - - - - } - /> -
- + {loading && } + {data && ( + <> + + + + form.submit()} + onCancel={() => setOpen(false)} + okButtonProps={{loading: updateLoading}} + title={t("bills.labels.editadjwarning")} + > + + + + + + } + /> + + - {bodyshop.uselocalmediaserver ? ( - - ) : ( - + {bodyshop.uselocalmediaserver ? ( + + ) : ( + + )} + + )} - - )} - - ); + ); } const transformData = (data) => { - return data - ? { - ...data.bills_by_pk, + return data + ? { + ...data.bills_by_pk, - billlines: data.bills_by_pk.billlines.map((i) => { - return { - ...i, - joblineid: !!i.joblineid ? i.joblineid : "noline", - applicable_taxes: { - federal: - (i.applicable_taxes && i.applicable_taxes.federal) || false, - state: (i.applicable_taxes && i.applicable_taxes.state) || false, - local: (i.applicable_taxes && i.applicable_taxes.local) || false, - }, - }; - }), - date: data.bills_by_pk ? moment(data.bills_by_pk.date) : null, - } - : {}; + billlines: data.bills_by_pk.billlines.map((i) => { + return { + ...i, + joblineid: !!i.joblineid ? i.joblineid : "noline", + applicable_taxes: { + federal: + (i.applicable_taxes && i.applicable_taxes.federal) || false, + state: (i.applicable_taxes && i.applicable_taxes.state) || false, + local: (i.applicable_taxes && i.applicable_taxes.local) || false, + }, + }; + }), + date: data.bills_by_pk ? dayjs(data.bills_by_pk.date) : null, + } + : {}; }; diff --git a/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx b/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx index 81571f8b0..6d9961ebf 100644 --- a/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx +++ b/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx @@ -1,185 +1,185 @@ -import { Button, Checkbox, Form, Modal } from "antd"; +import {Button, Checkbox, Form, Modal} from "antd"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setPartsOrderContext: (context) => - dispatch(setModalContext({ context: context, modal: "partsOrder" })), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + setPartsOrderContext: (context) => + dispatch(setModalContext({context: context, modal: "partsOrder"})), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillDetailEditReturn); export function BillDetailEditReturn({ - setPartsOrderContext, - insertAuditTrail, - bodyshop, - data, - disabled, -}) { - const search = queryString.parse(useLocation().search); - const history = useHistory(); - const { t } = useTranslation(); - const [form] = Form.useForm(); - const [visible, setVisible] = useState(false); + setPartsOrderContext, + insertAuditTrail, + bodyshop, + data, + disabled, + }) { + const search = queryString.parse(useLocation().search); + const history = useNavigate(); + const {t} = useTranslation(); + const [form] = Form.useForm(); + const [open, setOpen] = useState(false); - const handleFinish = ({ billlines }) => { - const selectedLines = billlines.filter((l) => l.selected).map((l) => l.id); + const handleFinish = ({billlines}) => { + const selectedLines = billlines.filter((l) => l.selected).map((l) => l.id); - setPartsOrderContext({ - actions: {}, - context: { - jobId: data.bills_by_pk.jobid, - vendorId: data.bills_by_pk.vendorid, - returnFromBill: data.bills_by_pk.id, - invoiceNumber: data.bills_by_pk.invoice_number, - linesToOrder: data.bills_by_pk.billlines - .filter((l) => selectedLines.includes(l.id)) - .map((i) => { - return { - line_desc: i.line_desc, - // db_price: i.actual_price, - act_price: i.actual_price, - cost: i.actual_cost, - quantity: i.quantity, - joblineid: i.joblineid, - oem_partno: i.jobline && i.jobline.oem_partno, - part_type: i.jobline && i.jobline.part_type, - }; - }), - isReturn: true, - }, - }); - delete search.billid; + setPartsOrderContext({ + actions: {}, + context: { + jobId: data.bills_by_pk.jobid, + vendorId: data.bills_by_pk.vendorid, + returnFromBill: data.bills_by_pk.id, + invoiceNumber: data.bills_by_pk.invoice_number, + linesToOrder: data.bills_by_pk.billlines + .filter((l) => selectedLines.includes(l.id)) + .map((i) => { + return { + line_desc: i.line_desc, + // db_price: i.actual_price, + act_price: i.actual_price, + cost: i.actual_cost, + quantity: i.quantity, + joblineid: i.joblineid, + oem_partno: i.jobline && i.jobline.oem_partno, + part_type: i.jobline && i.jobline.part_type, + }; + }), + isReturn: true, + }, + }); + delete search.billid; - history.push({ search: queryString.stringify(search) }); - setVisible(false); - }; - useEffect(() => { - if (visible === false) form.resetFields(); - }, [visible, form]); + history({search: queryString.stringify(search)}); + setOpen(false); + }; + useEffect(() => { + if (open === false) form.resetFields(); + }, [open, form]); - return ( - <> - setVisible(false)} - destroyOnClose - title={t("bills.actions.return")} - onOk={() => form.submit()} - > -
- - {(fields, { add, remove, move }) => { - return ( - - - - - - - - - - - - {fields.map((field, index) => ( - - - - - - - - ))} - -
- { - form.setFieldsValue({ - billlines: form - .getFieldsValue() - .billlines.map((b) => ({ - ...b, - selected: e.target.checked, - })), - }); - }} - /> - {t("billlines.fields.line_desc")}{t("billlines.fields.quantity")}{t("billlines.fields.actual_price")}{t("billlines.fields.actual_cost")}
- - - - - - - - - - - - - - - - - - - -
- ); - }} -
-
-
- - - ); + return ( + <> + setOpen(false)} + destroyOnClose + title={t("bills.actions.return")} + onOk={() => form.submit()} + > +
+ + {(fields, {add, remove, move}) => { + return ( + + + + + + + + + + + + {fields.map((field, index) => ( + + + + + + + + ))} + +
+ { + form.setFieldsValue({ + billlines: form + .getFieldsValue() + .billlines.map((b) => ({ + ...b, + selected: e.target.checked, + })), + }); + }} + /> + {t("billlines.fields.line_desc")}{t("billlines.fields.quantity")}{t("billlines.fields.actual_price")}{t("billlines.fields.actual_cost")}
+ + + + + + + + + + + + + + + + + + + +
+ ); + }} +
+
+
+ + + ); } diff --git a/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx b/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx index 4df0959c7..ab7e9bc20 100644 --- a/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx +++ b/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx @@ -1,40 +1,40 @@ -import { Drawer, Grid } from "antd"; +import {Drawer, Grid} from "antd"; import queryString from "query-string"; import React from "react"; -import { useHistory, useLocation } from "react-router-dom"; +import {useLocation, useNavigate} from "react-router-dom"; import BillDetailEditComponent from "./bill-detail-edit-component"; export default function BillDetailEditcontainer() { - const search = queryString.parse(useLocation().search); - const history = useHistory(); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const bpoints = { - xs: "100%", - sm: "100%", - md: "100%", - lg: "100%", - xl: "90%", - xxl: "90%", - }; - const drawerPercentage = selectedBreakpoint - ? bpoints[selectedBreakpoint[0]] - : "100%"; + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "100%", + xl: "90%", + xxl: "90%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; - return ( - { - delete search.billid; - history.push({ search: queryString.stringify(search) }); - }} - destroyOnClose - visible={search.billid} - > - - - ); + return ( + { + delete search.billid; + history({search: queryString.stringify(search)}); + }} + destroyOnClose + open={search.billid} + > + + + ); } diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx index 90a14a5d1..4b60b135e 100644 --- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx +++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx @@ -1,470 +1,466 @@ -import { useApolloClient, useMutation } from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Button, Checkbox, Form, Modal, Space, notification } from "antd"; +import {useApolloClient, useMutation} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Checkbox, Form, Modal, notification, Space} from "antd"; import _ from "lodash"; -import React, { useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_NEW_BILL } from "../../graphql/bills.queries"; -import { UPDATE_INVENTORY_LINES } from "../../graphql/inventory.queries"; -import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; -import { - QUERY_JOB_LBR_ADJUSTMENTS, - UPDATE_JOB, -} from "../../graphql/jobs.queries"; -import { MUTATION_MARK_RETURN_RECEIVED } from "../../graphql/parts-orders.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectBillEnterModal } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useEffect, useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_NEW_BILL} from "../../graphql/bills.queries"; +import {UPDATE_INVENTORY_LINES} from "../../graphql/inventory.queries"; +import {UPDATE_JOB_LINE} from "../../graphql/jobs-lines.queries"; +import {QUERY_JOB_LBR_ADJUSTMENTS, UPDATE_JOB,} from "../../graphql/jobs.queries"; +import {MUTATION_MARK_RETURN_RECEIVED} from "../../graphql/parts-orders.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectBillEnterModal} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import confirmDialog from "../../utils/asyncConfirm"; import useLocalStorage from "../../utils/useLocalStorage"; import BillFormContainer from "../bill-form/bill-form.container"; -import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility"; -import { handleUpload as handleLocalUpload } from "../documents-local-upload/documents-local-upload.utility"; -import { handleUpload } from "../documents-upload/documents-upload.utility"; +import {CalculateBillTotal} from "../bill-form/bill-form.totals.utility"; +import {handleUpload as handleLocalUpload} from "../documents-local-upload/documents-local-upload.utility"; +import {handleUpload} from "../documents-upload/documents-upload.utility"; const mapStateToProps = createStructuredSelector({ - billEnterModal: selectBillEnterModal, - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + billEnterModal: selectBillEnterModal, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("billEnter")), - insertAuditTrail: ({ jobid, billid, operation }) => - dispatch(insertAuditTrail({ jobid, billid, operation })), + toggleModalVisible: () => dispatch(toggleModalVisible("billEnter")), + insertAuditTrail: ({jobid, billid, operation}) => + dispatch(insertAuditTrail({jobid, billid, operation})), }); const Templates = TemplateList("job_special"); function BillEnterModalContainer({ - billEnterModal, - toggleModalVisible, - bodyshop, - currentUser, - insertAuditTrail, -}) { - const [form] = Form.useForm(); - const { t } = useTranslation(); - const [enterAgain, setEnterAgain] = useState(false); - const [insertBill] = useMutation(INSERT_NEW_BILL); - const [updateJobLines] = useMutation(UPDATE_JOB_LINE); - const [updatePartsOrderLines] = useMutation(MUTATION_MARK_RETURN_RECEIVED); - const [updateInventoryLines] = useMutation(UPDATE_INVENTORY_LINES); - const [loading, setLoading] = useState(false); - const client = useApolloClient(); - const [generateLabel, setGenerateLabel] = useLocalStorage( - "enter_bill_generate_label", - false - ); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const formValues = useMemo(() => { - return { - ...billEnterModal.context.bill, - //Added as a part of IO-2436 for capturing parts price changes. - billlines: billEnterModal.context?.bill?.billlines?.map((line) => ({ - ...line, - original_actual_price: line.actual_price, - })), - jobid: - (billEnterModal.context.job && billEnterModal.context.job.id) || null, - federal_tax_rate: - (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.federal_tax_rate) || - 0, - state_tax_rate: - (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.state_tax_rate) || - 0, - local_tax_rate: - (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.local_tax_rate) || - 0, - }; - }, [billEnterModal, bodyshop]); - - const handleFinish = async (values) => { - let totals = CalculateBillTotal(values); - if (totals.discrepancy.getAmount() !== 0) { - if (!(await confirmDialog(t("bills.labels.savewithdiscrepancy")))) { - return; - } - } - - setLoading(true); - const { - upload, - location, - outstanding_returns, - inventory, - ...remainingValues - } = values; - - let adjustmentsToInsert = {}; - let payrollAdjustmentsToInsert = []; - - const r1 = await insertBill({ - variables: { - bill: [ - { - ...remainingValues, - billlines: { - data: - remainingValues.billlines && - remainingValues.billlines.map((i) => { - const { - deductedfromlbr, - lbr_adjustment, - location: lineLocation, - part_type, - create_ppc, - original_actual_price, - ...restI - } = i; - - if (Enhanced_Payroll.treatment === "on") { - if ( - deductedfromlbr && - true //payroll is on - ) { - payrollAdjustmentsToInsert.push({ - id: i.joblineid, - convertedtolbr: true, - convertedtolbr_data: { - mod_lb_hrs: lbr_adjustment.mod_lb_hrs * -1, - mod_lbr_ty: lbr_adjustment.mod_lbr_ty, - }, - }); - } - } else { - if (deductedfromlbr) { - adjustmentsToInsert[lbr_adjustment.mod_lbr_ty] = - (adjustmentsToInsert[lbr_adjustment.mod_lbr_ty] || 0) - - restI.actual_price / lbr_adjustment.rate; - } - } - - return { - ...restI, - deductedfromlbr: deductedfromlbr, - lbr_adjustment, - joblineid: i.joblineid === "noline" ? null : i.joblineid, - applicable_taxes: { - federal: - (i.applicable_taxes && i.applicable_taxes.federal) || - false, - state: - (i.applicable_taxes && i.applicable_taxes.state) || - false, - local: - (i.applicable_taxes && i.applicable_taxes.local) || - false, - }, - }; - }), - }, - }, - ], - }, - refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID", "GET_JOB_BY_PK"], - }); - - await Promise.all( - payrollAdjustmentsToInsert.map((li) => { - return updateJobLines({ - variables: { - lineId: li.id, - line: { - convertedtolbr: li.convertedtolbr, - convertedtolbr_data: li.convertedtolbr_data, - }, - }, - }); - }) + billEnterModal, + toggleModalVisible, + bodyshop, + currentUser, + insertAuditTrail, + }) { + const [form] = Form.useForm(); + const {t} = useTranslation(); + const [enterAgain, setEnterAgain] = useState(false); + const [insertBill] = useMutation(INSERT_NEW_BILL); + const [updateJobLines] = useMutation(UPDATE_JOB_LINE); + const [updatePartsOrderLines] = useMutation(MUTATION_MARK_RETURN_RECEIVED); + const [updateInventoryLines] = useMutation(UPDATE_INVENTORY_LINES); + const [loading, setLoading] = useState(false); + const client = useApolloClient(); + const [generateLabel, setGenerateLabel] = useLocalStorage( + "enter_bill_generate_label", + false ); - const adjKeys = Object.keys(adjustmentsToInsert); - if (adjKeys.length > 0) { - //Query the adjustments, merge, and update them. - const existingAdjustments = await client.query({ - query: QUERY_JOB_LBR_ADJUSTMENTS, - variables: { - id: values.jobid, - }, - }); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); - const newAdjustments = _.cloneDeep( - existingAdjustments.data.jobs_by_pk.lbr_adjustments - ); + const formValues = useMemo(() => { + return { + ...billEnterModal.context.bill, + //Added as a part of IO-2436 for capturing parts price changes. + billlines: billEnterModal.context?.bill?.billlines?.map((line) => ({ + ...line, + original_actual_price: line.actual_price, + })), + jobid: + (billEnterModal.context.job && billEnterModal.context.job.id) || null, + federal_tax_rate: + (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.federal_tax_rate) || + 0, + state_tax_rate: + (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.state_tax_rate) || + 0, + local_tax_rate: + (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.local_tax_rate) || + 0, + }; + }, [billEnterModal, bodyshop]); - adjKeys.forEach((key) => { - newAdjustments[key] = - (newAdjustments[key] || 0) + adjustmentsToInsert[key]; + const handleFinish = async (values) => { + let totals = CalculateBillTotal(values); + if (totals.discrepancy.getAmount() !== 0) { + if (!(await confirmDialog(t("bills.labels.savewithdiscrepancy")))) { + return; + } + } + + setLoading(true); + const { + upload, + location, + outstanding_returns, + inventory, + ...remainingValues + } = values; + + let adjustmentsToInsert = {}; + let payrollAdjustmentsToInsert = []; + + const r1 = await insertBill({ + variables: { + bill: [ + { + ...remainingValues, + billlines: { + data: + remainingValues.billlines && + remainingValues.billlines.map((i) => { + const { + deductedfromlbr, + lbr_adjustment, + location: lineLocation, + part_type, + create_ppc, + original_actual_price, + ...restI + } = i; + + if (Enhanced_Payroll.treatment === "on") { + if ( + deductedfromlbr && + true //payroll is on + ) { + payrollAdjustmentsToInsert.push({ + id: i.joblineid, + convertedtolbr: true, + convertedtolbr_data: { + mod_lb_hrs: lbr_adjustment.mod_lb_hrs * -1, + mod_lbr_ty: lbr_adjustment.mod_lbr_ty, + }, + }); + } + } else { + if (deductedfromlbr) { + adjustmentsToInsert[lbr_adjustment.mod_lbr_ty] = + (adjustmentsToInsert[lbr_adjustment.mod_lbr_ty] || 0) - + restI.actual_price / lbr_adjustment.rate; + } + } + + return { + ...restI, + deductedfromlbr: deductedfromlbr, + lbr_adjustment, + joblineid: i.joblineid === "noline" ? null : i.joblineid, + applicable_taxes: { + federal: + (i.applicable_taxes && i.applicable_taxes.federal) || + false, + state: + (i.applicable_taxes && i.applicable_taxes.state) || + false, + local: + (i.applicable_taxes && i.applicable_taxes.local) || + false, + }, + }; + }), + }, + }, + ], + }, + refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID", "GET_JOB_BY_PK"], + }); + + await Promise.all( + payrollAdjustmentsToInsert.map((li) => { + return updateJobLines({ + variables: { + lineId: li.id, + line: { + convertedtolbr: li.convertedtolbr, + convertedtolbr_data: li.convertedtolbr_data, + }, + }, + }); + }) + ); + + const adjKeys = Object.keys(adjustmentsToInsert); + if (adjKeys.length > 0) { + //Query the adjustments, merge, and update them. + const existingAdjustments = await client.query({ + query: QUERY_JOB_LBR_ADJUSTMENTS, + variables: { + id: values.jobid, + }, + }); + + const newAdjustments = _.cloneDeep( + existingAdjustments.data.jobs_by_pk.lbr_adjustments + ); + + adjKeys.forEach((key) => { + newAdjustments[key] = + (newAdjustments[key] || 0) + adjustmentsToInsert[key]; + + insertAuditTrail({ + jobid: values.jobid, + operation: AuditTrailMapping.jobmodifylbradj({ + mod_lbr_ty: key, + hours: adjustmentsToInsert[key].toFixed(1), + }), + }); + }); + + const jobUpdate = client.mutate({ + mutation: UPDATE_JOB, + variables: { + jobId: values.jobid, + job: {lbr_adjustments: newAdjustments}, + }, + }); + if (!!jobUpdate.errors) { + notification["error"]({ + message: t("jobs.errors.saving", { + message: JSON.stringify(jobUpdate.errors), + }), + }); + return; + } + } + + const markPolReceived = + outstanding_returns && + outstanding_returns.filter((o) => o.cm_received === true); + + if (markPolReceived && markPolReceived.length > 0) { + const r2 = await updatePartsOrderLines({ + variables: {partsLineIds: markPolReceived.map((p) => p.id)}, + }); + if (!!r2.errors) { + setLoading(false); + setEnterAgain(false); + notification["error"]({ + message: t("parts_orders.errors.updating", { + message: JSON.stringify(r2.errors), + }), + }); + } + } + + if (!!r1.errors) { + setLoading(false); + setEnterAgain(false); + notification["error"]({ + message: t("bills.errors.creating", { + message: JSON.stringify(r1.errors), + }), + }); + } + + const billId = r1.data.insert_bills.returning[0].id; + const markInventoryConsumed = + inventory && inventory.filter((i) => i.consumefrominventory); + + if (markInventoryConsumed && markInventoryConsumed.length > 0) { + const r2 = await updateInventoryLines({ + variables: { + InventoryIds: markInventoryConsumed.map((p) => p.id), + consumedbybillid: billId, + }, + }); + if (!!r2.errors) { + setLoading(false); + setEnterAgain(false); + notification["error"]({ + message: t("inventory.errors.updating", { + message: JSON.stringify(r2.errors), + }), + }); + } + } + //If it's not a credit memo, update the statuses. + + if (!values.is_credit_memo) { + await Promise.all( + remainingValues.billlines + .filter((il) => il.joblineid !== "noline") + .map((li) => { + return updateJobLines({ + variables: { + lineId: li.joblineid, + line: { + location: li.location || location, + status: + bodyshop.md_order_statuses.default_received || "Received*", + //Added parts price changes. + ...(li.create_ppc && + li.original_actual_price !== li.actual_price + ? { + act_price_before_ppc: li.original_actual_price, + act_price: li.actual_price, + } + : {}), + }, + }, + }); + }) + ); + } + + ///////////////////////// + if (upload && upload.length > 0) { + //insert Each of the documents? + + if (bodyshop.uselocalmediaserver) { + upload.forEach((u) => { + handleLocalUpload({ + ev: {file: u.originFileObj}, + context: { + jobid: values.jobid, + invoice_number: remainingValues.invoice_number, + vendorid: remainingValues.vendorid, + }, + }); + }); + } else { + upload.forEach((u) => { + handleUpload( + {file: u.originFileObj}, + { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: values.jobid, + billId: billId, + tagsArray: null, + callback: null, + } + ); + }); + } + } + /////////////////////////// + setLoading(false); + notification["success"]({ + message: t("bills.successes.created"), + }); + + if (generateLabel) { + GenerateDocument( + { + name: Templates.parts_invoice_label_single.key, + variables: { + id: billId, + }, + }, + {}, + "p" + ); + } + + if (billEnterModal.actions.refetch) billEnterModal.actions.refetch(); insertAuditTrail({ - jobid: values.jobid, - operation: AuditTrailMapping.jobmodifylbradj({ - mod_lbr_ty: key, - hours: adjustmentsToInsert[key].toFixed(1), - }), + jobid: values.jobid, + billid: billId, + operation: AuditTrailMapping.billposted( + r1.data.insert_bills.returning[0].invoice_number + ), }); - }); - const jobUpdate = client.mutate({ - mutation: UPDATE_JOB, - variables: { - jobId: values.jobid, - job: { lbr_adjustments: newAdjustments }, - }, - }); - if (!!jobUpdate.errors) { - notification["error"]({ - message: t("jobs.errors.saving", { - message: JSON.stringify(jobUpdate.errors), - }), - }); - return; - } - } - - const markPolReceived = - outstanding_returns && - outstanding_returns.filter((o) => o.cm_received === true); - - if (markPolReceived && markPolReceived.length > 0) { - const r2 = await updatePartsOrderLines({ - variables: { partsLineIds: markPolReceived.map((p) => p.id) }, - }); - if (!!r2.errors) { - setLoading(false); - setEnterAgain(false); - notification["error"]({ - message: t("parts_orders.errors.updating", { - message: JSON.stringify(r2.errors), - }), - }); - } - } - - if (!!r1.errors) { - setLoading(false); - setEnterAgain(false); - notification["error"]({ - message: t("bills.errors.creating", { - message: JSON.stringify(r1.errors), - }), - }); - } - - const billId = r1.data.insert_bills.returning[0].id; - const markInventoryConsumed = - inventory && inventory.filter((i) => i.consumefrominventory); - - if (markInventoryConsumed && markInventoryConsumed.length > 0) { - const r2 = await updateInventoryLines({ - variables: { - InventoryIds: markInventoryConsumed.map((p) => p.id), - consumedbybillid: billId, - }, - }); - if (!!r2.errors) { - setLoading(false); - setEnterAgain(false); - notification["error"]({ - message: t("inventory.errors.updating", { - message: JSON.stringify(r2.errors), - }), - }); - } - } - //If it's not a credit memo, update the statuses. - - if (!values.is_credit_memo) { - await Promise.all( - remainingValues.billlines - .filter((il) => il.joblineid !== "noline") - .map((li) => { - return updateJobLines({ - variables: { - lineId: li.joblineid, - line: { - location: li.location || location, - status: - bodyshop.md_order_statuses.default_received || "Received*", - //Added parts price changes. - ...(li.create_ppc && - li.original_actual_price !== li.actual_price - ? { - act_price_before_ppc: li.original_actual_price, - act_price: li.actual_price, - } - : {}), - }, - }, + if (enterAgain) { + // form.resetFields(); + form.setFieldsValue({ + ...formValues, + billlines: [], }); - }) - ); - } + form.resetFields(); + } else { + toggleModalVisible(); + } + setEnterAgain(false); + }; - ///////////////////////// - if (upload && upload.length > 0) { - //insert Each of the documents? + const handleCancel = () => { + const r = window.confirm(t("general.labels.cancel")); + if (r === true) { + toggleModalVisible(); + } + }; - if (bodyshop.uselocalmediaserver) { - upload.forEach((u) => { - handleLocalUpload({ - ev: { file: u.originFileObj }, - context: { - jobid: values.jobid, - invoice_number: remainingValues.invoice_number, - vendorid: remainingValues.vendorid, - }, - }); - }); - } else { - upload.forEach((u) => { - handleUpload( - { file: u.originFileObj }, - { - bodyshop: bodyshop, - uploaded_by: currentUser.email, - jobId: values.jobid, - billId: billId, - tagsArray: null, - callback: null, + useEffect(() => { + if (enterAgain) form.submit(); + }, [enterAgain, form]); + + useEffect(() => { + if (billEnterModal.open) { + form.setFieldsValue(formValues); + } else { + form.resetFields(); + } + }, [billEnterModal.open, form, formValues]); + + return ( + form.submit()} + onCancel={handleCancel} + afterClose={() => { + form.resetFields(); + setLoading(false); + }} + footer={ + + setGenerateLabel(e.target.checked)} + > + {t("bills.labels.generatepartslabel")} + + + + {billEnterModal.context && billEnterModal.context.id ? null : ( + + )} + } - ); - }); - } - } - /////////////////////////// - setLoading(false); - notification["success"]({ - message: t("bills.successes.created"), - }); - - if (generateLabel) { - GenerateDocument( - { - name: Templates.parts_invoice_label_single.key, - variables: { - id: billId, - }, - }, - {}, - "p" - ); - } - - if (billEnterModal.actions.refetch) billEnterModal.actions.refetch(); - - insertAuditTrail({ - jobid: values.jobid, - billid: billId, - operation: AuditTrailMapping.billposted( - r1.data.insert_bills.returning[0].invoice_number - ), - }); - - if (enterAgain) { - // form.resetFields(); - form.setFieldsValue({ - ...formValues, - billlines: [], - }); - form.resetFields(); - } else { - toggleModalVisible(); - } - setEnterAgain(false); - }; - - const handleCancel = () => { - const r = window.confirm(t("general.labels.cancel")); - if (r === true) { - toggleModalVisible(); - } - }; - - useEffect(() => { - if (enterAgain) form.submit(); - }, [enterAgain, form]); - - useEffect(() => { - if (billEnterModal.visible) { - form.setFieldsValue(formValues); - } else { - form.resetFields(); - } - }, [billEnterModal.visible, form, formValues]); - - return ( - form.submit()} - onCancel={handleCancel} - afterClose={() => { - form.resetFields(); - setLoading(false); - }} - footer={ - - setGenerateLabel(e.target.checked)} - > - {t("bills.labels.generatepartslabel")} - - - - {billEnterModal.context && billEnterModal.context.id ? null : ( - - )} - - } - destroyOnClose - > - { - setEnterAgain(false); - }} - > - - - - ); + + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillEnterModalContainer); diff --git a/client/src/components/bill-form-lines-extended/bill-form-lines-extended.component.jsx b/client/src/components/bill-form-lines-extended/bill-form-lines-extended.component.jsx index ad356cae0..ef54f443c 100644 --- a/client/src/components/bill-form-lines-extended/bill-form-lines-extended.component.jsx +++ b/client/src/components/bill-form-lines-extended/bill-form-lines-extended.component.jsx @@ -1,135 +1,136 @@ -import { Form, Input, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Form, Input, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {alphaSort} from "../../utils/sorters"; import BillFormItemsExtendedFormItem from "./bill-form-lines.extended.formitem.component"; + export default function BillFormLinesExtended({ - lineData, - discount, - form, - responsibilityCenters, - disabled, -}) { - const [search, setSearch] = useState(""); - const { t } = useTranslation(); - const columns = [ - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - width: "10%", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - }, - { - title: t("joblines.fields.oem_partno"), - dataIndex: "oem_partno", - key: "oem_partno", - width: "10%", - sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), - }, - { - title: t("joblines.fields.part_type"), - dataIndex: "part_type", - key: "part_type", - width: "10%", - filters: [ + lineData, + discount, + form, + responsibilityCenters, + disabled, + }) { + const [search, setSearch] = useState(""); + const {t} = useTranslation(); + const columns = [ { - text: t("jobs.labels.partsfilter"), - value: ["PAN", "PAP", "PAL", "PAA", "PAS", "PASL"], + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + width: "10%", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), }, { - text: t("joblines.fields.part_types.PAN"), - value: ["PAN", "PAP"], + title: t("joblines.fields.oem_partno"), + dataIndex: "oem_partno", + key: "oem_partno", + width: "10%", + sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), }, { - text: t("joblines.fields.part_types.PAL"), - value: ["PAL"], + title: t("joblines.fields.part_type"), + dataIndex: "part_type", + key: "part_type", + width: "10%", + filters: [ + { + text: t("jobs.labels.partsfilter"), + value: ["PAN", "PAP", "PAL", "PAA", "PAS", "PASL"], + }, + { + text: t("joblines.fields.part_types.PAN"), + value: ["PAN", "PAP"], + }, + { + text: t("joblines.fields.part_types.PAL"), + value: ["PAL"], + }, + { + text: t("joblines.fields.part_types.PAA"), + value: ["PAA"], + }, + { + text: t("joblines.fields.part_types.PAS"), + value: ["PAS", "PASL"], + }, + ], + onFilter: (value, record) => value.includes(record.part_type), + render: (text, record) => + record.part_type + ? t(`joblines.fields.part_types.${record.part_type}`) + : null, }, - { - text: t("joblines.fields.part_types.PAA"), - value: ["PAA"], - }, - { - text: t("joblines.fields.part_types.PAS"), - value: ["PAS", "PASL"], - }, - ], - onFilter: (value, record) => value.includes(record.part_type), - render: (text, record) => - record.part_type - ? t(`joblines.fields.part_types.${record.part_type}`) - : null, - }, - { - title: t("joblines.fields.act_price"), - dataIndex: "act_price", - key: "act_price", - width: "10%", - sorter: (a, b) => a.act_price - b.act_price, - shouldCellUpdate: false, - render: (text, record) => ( - <> - - {record.db_ref === "900510" || record.db_ref === "900511" - ? record.prt_dsmk_m - : record.act_price} - - {record.part_qty ? `(x ${record.part_qty})` : null} - {record.prt_dsmk_p && record.prt_dsmk_p !== 0 ? ( - {`(${record.prt_dsmk_p}%)`} - ) : ( - <> - )} - - ), - }, - { - title: t("billlines.fields.posting"), - dataIndex: "posting", - key: "posting", + { + title: t("joblines.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + width: "10%", + sorter: (a, b) => a.act_price - b.act_price, + shouldCellUpdate: false, + render: (text, record) => ( + <> + + {record.db_ref === "900510" || record.db_ref === "900511" + ? record.prt_dsmk_m + : record.act_price} + + {record.part_qty ? `(x ${record.part_qty})` : null} + {record.prt_dsmk_p && record.prt_dsmk_p !== 0 ? ( + {`(${record.prt_dsmk_p}%)`} + ) : ( + <> + )} + + ), + }, + { + title: t("billlines.fields.posting"), + dataIndex: "posting", + key: "posting", - render: (text, record, index) => ( - - + render: (text, record, index) => ( + + + + ), + }, + ]; + + const data = + search === "" + ? lineData + : lineData.filter( + (l) => + (l.line_desc && + l.line_desc.toLowerCase().includes(search.toLowerCase())) || + (l.oem_partno && + l.oem_partno.toLowerCase().includes(search.toLowerCase())) || + (l.act_price && + l.act_price.toString().startsWith(search.toString())) + ); + + return ( + + + setSearch(e.target.value)} allowClear/> + - ), - }, - ]; - - const data = - search === "" - ? lineData - : lineData.filter( - (l) => - (l.line_desc && - l.line_desc.toLowerCase().includes(search.toLowerCase())) || - (l.oem_partno && - l.oem_partno.toLowerCase().includes(search.toLowerCase())) || - (l.act_price && - l.act_price.toString().startsWith(search.toString())) - ); - - return ( - - - setSearch(e.target.value)} allowClear /> -
- - ); + ); } diff --git a/client/src/components/bill-form-lines-extended/bill-form-lines.extended.formitem.component.jsx b/client/src/components/bill-form-lines-extended/bill-form-lines.extended.formitem.component.jsx index 32824e50e..2761a20e1 100644 --- a/client/src/components/bill-form-lines-extended/bill-form-lines.extended.formitem.component.jsx +++ b/client/src/components/bill-form-lines-extended/bill-form-lines.extended.formitem.component.jsx @@ -1,288 +1,284 @@ import React from "react"; -import { - PlusCircleFilled, - MinusCircleFilled, - WarningOutlined, -} from "@ant-design/icons"; -import { Form, Button, InputNumber, Input, Select, Switch, Space } from "antd"; -import { useTranslation } from "react-i18next"; +import {MinusCircleFilled, PlusCircleFilled, WarningOutlined,} from "@ant-design/icons"; +import {Button, Form, Input, InputNumber, Select, Space, Switch} from "antd"; +import {useTranslation} from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import CiecaSelect from "../../utils/Ciecaselect"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillFormItemsExtendedFormItem); export function BillFormItemsExtendedFormItem({ - value, - bodyshop, - form, - record, - index, - disabled, - responsibilityCenters, - discount, -}) { - // const { billlineskeys } = form.getFieldsValue("billlineskeys"); + value, + bodyshop, + form, + record, + index, + disabled, + responsibilityCenters, + discount, + }) { + // const { billlineskeys } = form.getFieldsValue("billlineskeys"); + + const {t} = useTranslation(); + if (!value) + return ( + + ); - const { t } = useTranslation(); - if (!value) return ( - + if (lineDiscount - discount === 0) return
; + return ; + }} + + + + + + + + + + + + {() => { + if ( + form.getFieldsValue("billlineskeys").billlineskeys[record.id] + .deductedfromlbr + ) + return ( +
+ + + + + + +
+ ); + return <>; + }} +
+ + + + + + + + + + + + + ); - - return ( - - - - - - - - - { - const { billlineskeys } = form.getFieldsValue("billlineskeys"); - form.setFieldsValue({ - billlineskeys: { - ...billlineskeys, - [record.id]: { - ...billlineskeys[billlineskeys], - actual_cost: !!billlineskeys[billlineskeys].actual_cost - ? billlineskeys[billlineskeys].actual_cost - : Math.round( - (parseFloat(e.target.value) * (1 - discount) + - Number.EPSILON) * - 100 - ) / 100, - }, - }, - }); - }} - /> - - - - - - {() => { - const line = value; - if (!!!line) return null; - const lineDiscount = ( - 1 - - Math.round((line.actual_cost / line.actual_price) * 100) / 100 - ).toPrecision(2); - - if (lineDiscount - discount === 0) return
; - return ; - }} - - - - - - - - - - - - {() => { - if ( - form.getFieldsValue("billlineskeys").billlineskeys[record.id] - .deductedfromlbr - ) - return ( -
- - - - - - -
- ); - return <>; - }} -
- - - - - - - - - - - - - - ); } diff --git a/client/src/components/bill-form/bill-form.component.jsx b/client/src/components/bill-form/bill-form.component.jsx index 7f6374984..20d24be41 100644 --- a/client/src/components/bill-form/bill-form.component.jsx +++ b/client/src/components/bill-form/bill-form.component.jsx @@ -1,26 +1,16 @@ -import Icon, { UploadOutlined } from "@ant-design/icons"; -import { useApolloClient } from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Alert, - Divider, - Form, - Input, - Select, - Space, - Statistic, - Switch, - Upload, -} from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { MdOpenInNew } from "react-icons/md"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { CHECK_BILL_INVOICE_NUMBER } from "../../graphql/bills.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import Icon, {UploadOutlined} from "@ant-design/icons"; +import {useApolloClient} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Alert, Divider, Form, Input, Select, Space, Statistic, Switch, Upload,} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {MdOpenInNew} from "react-icons/md"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {CHECK_BILL_INVOICE_NUMBER} from "../../graphql/bills.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import BillFormLinesExtended from "../bill-form-lines-extended/bill-form-lines-extended.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; @@ -30,522 +20,515 @@ import JobSearchSelect from "../job-search-select/job-search-select.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; import BillFormLines from "./bill-form.lines.component"; -import { CalculateBillTotal } from "./bill-form.totals.utility"; +import {CalculateBillTotal} from "./bill-form.totals.utility"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); export function BillFormComponent({ - bodyshop, - disabled, - form, - vendorAutoCompleteOptions, - lineData, - responsibilityCenters, - loadLines, - billEdit, - disableInvNumber, - job, - loadOutstandingReturns, - loadInventory, - preferredMake, -}) { - const { t } = useTranslation(); - const client = useApolloClient(); - const [discount, setDiscount] = useState(0); - const { Extended_Bill_Posting } = useTreatments( - ["Extended_Bill_Posting"], - {}, - bodyshop.imexshopid - ); - const { ClosingPeriod } = useTreatments( - ["ClosingPeriod"], - {}, - bodyshop.imexshopid - ); + bodyshop, + disabled, + form, + vendorAutoCompleteOptions, + lineData, + responsibilityCenters, + loadLines, + billEdit, + disableInvNumber, + job, + loadOutstandingReturns, + loadInventory, + preferredMake + }) { - const handleVendorSelect = (props, opt) => { - setDiscount(opt.discount); + const {t} = useTranslation(); + const client = useApolloClient(); + const [discount, setDiscount] = useState(0); - opt && - !billEdit && - loadOutstandingReturns({ - variables: { - jobId: form.getFieldValue("jobid"), - vendorId: opt.value, - }, - }); - }; + const {treatments: {Extended_Bill_Posting, ClosingPeriod}} = useSplitTreatments({ + attributes: {}, + names: ["Extended_Bill_Posting", "ClosingPeriod"], + splitKey: bodyshop.imexshopid, + }); - // const handleFederalTaxExemptSwitchToggle = (checked) => { - // // Early gate - // if (!checked) return; - // const values = form.getFieldsValue("billlines"); - // // Gate bill lines - // if (!values?.billlines?.length) return; - // const billlines = values.billlines.map((b) => { - // b.applicable_taxes.federal = false; - // return b; - // }); - // form.setFieldsValue({ billlines }); - // }; + const handleVendorSelect = (props, opt) => { + setDiscount(opt.discount); - useEffect(() => { - if (job) form.validateFields(["is_credit_memo"]); - }, [job, form]); - - useEffect(() => { - const vendorId = form.getFieldValue("vendorid"); - if (vendorId && vendorAutoCompleteOptions) { - const matchingVendors = vendorAutoCompleteOptions.filter( - (v) => v.id === vendorId - ); - if (matchingVendors.length === 1) { - setDiscount(matchingVendors[0].discount); - } - } - const jobId = form.getFieldValue("jobid"); - if (jobId) { - loadLines({ variables: { id: jobId } }); - if (form.getFieldValue("is_credit_memo") && vendorId && !billEdit) { + opt && + !billEdit && loadOutstandingReturns({ - variables: { - jobId: jobId, - vendorId: vendorId, - }, + variables: { + jobId: form.getFieldValue("jobid"), + vendorId: opt.value, + }, }); - } - } + }; - if (vendorId === bodyshop.inhousevendorid && !billEdit) { - loadInventory(); - } - }, [ - form, - billEdit, - loadOutstandingReturns, - loadInventory, - setDiscount, - vendorAutoCompleteOptions, - loadLines, - bodyshop.inhousevendorid, - ]); + // const handleFederalTaxExemptSwitchToggle = (checked) => { + // // Early gate + // if (!checked) return; + // const values = form.getFieldsValue("billlines"); + // // Gate bill lines + // if (!values?.billlines?.length) return; - return ( -
- - - - - - - { - if (form.getFieldValue("jobid") !== null) { - loadLines({ variables: { id: form.getFieldValue("jobid") } }); - if (form.getFieldValue("vendorid") !== null) { - loadOutstandingReturns({ - variables: { - jobId: form.getFieldValue("jobid"), - vendorId: form.getFieldValue("vendorid"), - }, - }); - } - } - }} - /> - - ({ - validator(rule, value) { - if ( - value && - !getFieldValue(["isinhouse"]) && - value === bodyshop.inhousevendorid - ) { - return Promise.reject(t("bills.validation.manualinhouse")); - } - return Promise.resolve(); - }, - }), - ]} - > - - - - {job && - job.ious && - job.ious.length > 0 && - job.ious.map((iou) => ( - - {t("bills.labels.iouexists")} - - - {iou.ro_number} - - - - + // const billlines = values.billlines.map((b) => { + // b.applicable_taxes.federal = false; + // return b; + // }); + // form.setFieldsValue({ billlines }); + // }; + + useEffect(() => { + if (job) form.validateFields(["is_credit_memo"]); + }, [job, form]); + + useEffect(() => { + const vendorId = form.getFieldValue("vendorid"); + if (vendorId && vendorAutoCompleteOptions) { + const matchingVendors = vendorAutoCompleteOptions.filter( + (v) => v.id === vendorId + ); + if (matchingVendors.length === 1) { + setDiscount(matchingVendors[0].discount); } - /> - ))} - - ({ - async validator(rule, value) { - const vendorid = getFieldValue("vendorid"); - if (vendorid && value) { - const response = await client.query({ - query: CHECK_BILL_INVOICE_NUMBER, + } + const jobId = form.getFieldValue("jobid"); + if (jobId) { + loadLines({variables: {id: jobId}}); + if (form.getFieldValue("is_credit_memo") && vendorId && !billEdit) { + loadOutstandingReturns({ variables: { - invoice_number: value, - vendorid: vendorid, + jobId: jobId, + vendorId: vendorId, }, - }); - - if (response.data.bills_aggregate.aggregate.count === 0) { - return Promise.resolve(); - } else if ( - response.data.bills_aggregate.nodes.length === 1 && - response.data.bills_aggregate.nodes[0].id === - form.getFieldValue("id") - ) { - return Promise.resolve(); - } - return Promise.reject( - t("bills.validation.unique_invoice_number") - ); - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - ({ - validator(rule, value) { - if ( - ClosingPeriod.treatment === "on" && - bodyshop.accountingconfig.ClosingPeriod - ) { - if ( - moment(value) - .startOf("day") - .isSameOrAfter( - moment( - bodyshop.accountingconfig.ClosingPeriod[0] - ).startOf("day") - ) && - moment(value) - .startOf("day") - .isSameOrBefore( - moment( - bodyshop.accountingconfig.ClosingPeriod[1] - ).endOf("day") - ) - ) { - return Promise.resolve(); - } else { - return Promise.reject(t("bills.validation.closingperiod")); - } - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - ({ - validator(rule, value) { - if ( - value === true && - getFieldValue("jobid") && - getFieldValue("vendorid") - ) { - //Removed as this would cause an additional reload when validating the form on submit and clear the values. - // loadOutstandingReturns({ - // variables: { - // jobId: form.getFieldValue("jobid"), - // vendorId: form.getFieldValue("vendorid"), - // }, - // }); - } - - if ( - !bodyshop.bill_allow_post_to_closed && - job && - (job.status === bodyshop.md_ro_statuses.default_invoiced || - job.status === bodyshop.md_ro_statuses.default_exported || - job.status === bodyshop.md_ro_statuses.default_void) && - (value === false || !value) - ) { - return Promise.reject(t("bills.labels.onlycmforinvoiced")); - } - - return Promise.resolve(); - }, - }), - ]} - > - - - - - - {!billEdit && ( - - - - )} - - - { - // - // - // + }); + } } - - - - { - // - // - // + + if (vendorId === bodyshop.inhousevendorid && !billEdit) { + loadInventory(); } - { - //Removed as a part of the merge to Rome Online. Federal tax not applicable. - // bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? ( - // - // - // - // ) : null - } - - {() => { - const values = form.getFieldsValue([ - "billlines", - "total", - "federal_tax_rate", - "state_tax_rate", - "local_tax_rate", - ]); - let totals; - if ( - !!values.total && - !!values.billlines && - values.billlines.length > 0 - ) - totals = CalculateBillTotal(values); - if (!!totals) - return ( -
- - - { - // - } - - { - // - } - - - - - {form.getFieldValue("is_credit_memo") ? ( - - ) : null} -
- ); - return null; - }} -
-
- {t("bills.labels.bill_lines")} + }, [ + form, + billEdit, + loadOutstandingReturns, + loadInventory, + setDiscount, + vendorAutoCompleteOptions, + loadLines, + bodyshop.inhousevendorid, + ]); - {Extended_Bill_Posting.treatment === "on" ? ( - - ) : ( - - )} + return ( +
+ + + + + + + { + if (form.getFieldValue("jobid") !== null) { + loadLines({variables: {id: form.getFieldValue("jobid")}}); + if (form.getFieldValue("vendorid") !== null) { + loadOutstandingReturns({ + variables: { + jobId: form.getFieldValue("jobid"), + vendorId: form.getFieldValue("vendorid"), + }, + }); + } + } + }} + /> + + ({ + validator(rule, value) { + if ( + value && + !getFieldValue(["isinhouse"]) && + value === bodyshop.inhousevendorid + ) { + return Promise.reject(t("bills.validation.manualinhouse")); + } + return Promise.resolve(); + }, + }), + ]} + > + + + + {job && + job.ious && + job.ious.length > 0 && + job.ious.map((iou) => ( + + {t("bills.labels.iouexists")} + + + {iou.ro_number} + + + + + } + /> + ))} + + ({ + async validator(rule, value) { + const vendorid = getFieldValue("vendorid"); + if (vendorid && value) { + const response = await client.query({ + query: CHECK_BILL_INVOICE_NUMBER, + variables: { + invoice_number: value, + vendorid: vendorid, + }, + }); - { - if (Array.isArray(e)) { - return e; - } - return e && e.fileList; - }} - > - false} - listType="picture" - > - <> -

- -

-

- Click or drag files to this area to upload. -

- -
-
-
- ); + if (response.data.bills_aggregate.aggregate.count === 0) { + return Promise.resolve(); + } else if ( + response.data.bills_aggregate.nodes.length === 1 && + response.data.bills_aggregate.nodes[0].id === + form.getFieldValue("id") + ) { + return Promise.resolve(); + } + return Promise.reject( + t("bills.validation.unique_invoice_number") + ); + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + ({ + validator(rule, value) { + if ( + ClosingPeriod.treatment === "on" && + bodyshop.accountingconfig.ClosingPeriod + ) { + if ( + dayjs(value) + .startOf("day") + .isSameOrAfter( + dayjs( + bodyshop.accountingconfig.ClosingPeriod[0] + ).startOf("day") + ) && + dayjs(value) + .startOf("day") + .isSameOrBefore( + dayjs( + bodyshop.accountingconfig.ClosingPeriod[1] + ).endOf("day") + ) + ) { + return Promise.resolve(); + } else { + return Promise.reject(t("bills.validation.closingperiod")); + } + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + ({ + validator(rule, value) { + if ( + value === true && + getFieldValue("jobid") && + getFieldValue("vendorid") + ) { + //Removed as this would cause an additional reload when validating the form on submit and clear the values. + // loadOutstandingReturns({ + // variables: { + // jobId: form.getFieldValue("jobid"), + // vendorId: form.getFieldValue("vendorid"), + // }, + // }); + } + + if ( + !bodyshop.bill_allow_post_to_closed && + job && + (job.status === bodyshop.md_ro_statuses.default_invoiced || + job.status === bodyshop.md_ro_statuses.default_exported || + job.status === bodyshop.md_ro_statuses.default_void) && + (value === false || !value) + ) { + return Promise.reject(t("bills.labels.onlycmforinvoiced")); + } + + return Promise.resolve(); + }, + }), + ]} + > + + + + + + {!billEdit && ( + + + + )} + + + { + // + // + // + } + + + + {/**/} + {/* */} + {/**/} + {/* {bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? (*/} + {/* */} + {/* */} + {/* */} + {/* ) : null}*/} + + {() => { + const values = form.getFieldsValue([ + "billlines", + "total", + "federal_tax_rate", + "state_tax_rate", + "local_tax_rate", + ]); + let totals; + if ( + !!values.total && + !!values.billlines && + values.billlines.length > 0 + ) + totals = CalculateBillTotal(values); + if (!!totals) + return ( +
+ + + { + // + } + + { + // + } + + + + + {form.getFieldValue("is_credit_memo") ? ( + + ) : null} +
+ ); + return null; + }} +
+
+ {t("bills.labels.bill_lines")} + + {Extended_Bill_Posting.treatment === "on" ? ( + + ) : ( + + )} + + { + if (Array.isArray(e)) { + return e; + } + return e && e.fileList; + }} + > + false} + listType="picture" + > + <> +

+ +

+

+ Click or drag files to this area to upload. +

+ +
+
+
+ ); } export default connect(mapStateToProps, mapDispatchToProps)(BillFormComponent); diff --git a/client/src/components/bill-form/bill-form.container.jsx b/client/src/components/bill-form/bill-form.container.jsx index d77e0d29c..67b3c9ab3 100644 --- a/client/src/components/bill-form/bill-form.container.jsx +++ b/client/src/components/bill-form/bill-form.container.jsx @@ -1,82 +1,83 @@ -import { useLazyQuery, useQuery } from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useLazyQuery, useQuery} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries"; -import { GET_JOB_LINES_TO_ENTER_BILL } from "../../graphql/jobs-lines.queries"; -import { QUERY_UNRECEIVED_LINES } from "../../graphql/parts-orders.queries"; -import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_OUTSTANDING_INVENTORY} from "../../graphql/inventory.queries"; +import {GET_JOB_LINES_TO_ENTER_BILL} from "../../graphql/jobs-lines.queries"; +import {QUERY_UNRECEIVED_LINES} from "../../graphql/parts-orders.queries"; +import {SEARCH_VENDOR_AUTOCOMPLETE} from "../../graphql/vendors.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import BillCmdReturnsTableComponent from "../bill-cm-returns-table/bill-cm-returns-table.component"; import BillInventoryTable from "../bill-inventory-table/bill-inventory-table.component"; import BillFormComponent from "./bill-form.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export function BillFormContainer({ - bodyshop, - form, - billEdit, - disabled, - disableInvNumber, -}) { - const { Simple_Inventory } = useTreatments( - ["Simple_Inventory"], - {}, - bodyshop && bodyshop.imexshopid - ); + bodyshop, + form, + billEdit, + disabled, + disableInvNumber, + }) { + const {treatments: {Simple_Inventory}} = useSplitTreatments({ + attributes: {}, + names: ["Simple_Inventory"], + splitKey: bodyshop && bodyshop.imexshopid, + }); - const { data: VendorAutoCompleteData } = useQuery( - SEARCH_VENDOR_AUTOCOMPLETE, - { fetchPolicy: "network-only", nextFetchPolicy: "network-only" } - ); + const {data: VendorAutoCompleteData} = useQuery( + SEARCH_VENDOR_AUTOCOMPLETE, + {fetchPolicy: "network-only", nextFetchPolicy: "network-only"} + ); - const [loadLines, { data: lineData }] = useLazyQuery( - GET_JOB_LINES_TO_ENTER_BILL - ); + const [loadLines, {data: lineData}] = useLazyQuery( + GET_JOB_LINES_TO_ENTER_BILL + ); - const [loadOutstandingReturns, { loading: returnLoading, data: returnData }] = - useLazyQuery(QUERY_UNRECEIVED_LINES); - const [loadInventory, { loading: inventoryLoading, data: inventoryData }] = - useLazyQuery(QUERY_OUTSTANDING_INVENTORY); + const [loadOutstandingReturns, {loading: returnLoading, data: returnData}] = + useLazyQuery(QUERY_UNRECEIVED_LINES); + const [loadInventory, {loading: inventoryLoading, data: inventoryData}] = + useLazyQuery(QUERY_OUTSTANDING_INVENTORY); - return ( - <> - - {!billEdit && ( - - )} - {Simple_Inventory.treatment === "on" && ( - - )} - - ); + return ( + <> + + {!billEdit && ( + + )} + {Simple_Inventory.treatment === "on" && ( + + )} + + ); } + export default connect(mapStateToProps, null)(BillFormContainer); diff --git a/client/src/components/bill-form/bill-form.lines.component.jsx b/client/src/components/bill-form/bill-form.lines.component.jsx index 771b5888a..9d4c1f8de 100644 --- a/client/src/components/bill-form/bill-form.lines.component.jsx +++ b/client/src/components/bill-form/bill-form.lines.component.jsx @@ -1,752 +1,737 @@ -import { DeleteFilled, DollarCircleFilled } from "@ant-design/icons"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Button, - Checkbox, - Form, - Input, - InputNumber, - Select, - Space, - Switch, - Table, - Tooltip, -} from "antd"; +import {DeleteFilled, DollarCircleFilled} from "@ant-design/icons"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Checkbox, Form, Input, InputNumber, Select, Space, Switch, Table, Tooltip,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CiecaSelect from "../../utils/Ciecaselect"; import BillLineSearchSelect from "../bill-line-search-select/bill-line-search-select.component"; import BilllineAddInventory from "../billline-add-inventory/billline-add-inventory.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function BillEnterModalLinesComponent({ - bodyshop, - disabled, - lineData, - discount, - form, - responsibilityCenters, - billEdit, - billid, -}) { - const { t } = useTranslation(); - const { setFieldsValue, getFieldsValue, getFieldValue } = form; - const { Simple_Inventory } = useTreatments( - ["Simple_Inventory"], - {}, - bodyshop && bodyshop.imexshopid - ); + bodyshop, + disabled, + lineData, + discount, + form, + responsibilityCenters, + billEdit, + billid, + }) { + const {t} = useTranslation(); + const {setFieldsValue, getFieldsValue, getFieldValue} = form; - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - - const columns = (remove) => { - return [ - { - title: t("billlines.fields.jobline"), - dataIndex: "joblineid", - editable: true, - width: "20rem", - formItemProps: (field) => { - return { - key: `${field.index}joblinename`, - name: [field.name, "joblineid"], - label: t("billlines.fields.jobline"), - rules: [ - { - required: true, - //message: t("general.validation.required"), - }, - ], - }; - }, - wrapper: (props) => ( - - prev.is_credit_memo !== cur.is_credit_memo - } - > - {() => { - return props.children; - }} - - ), - formInput: (record, index) => ( - { - setFieldsValue({ - billlines: getFieldsValue(["billlines"]).billlines.map( - (item, idx) => { - if (idx === index) { - return { - ...item, - line_desc: opt.line_desc, - quantity: opt.part_qty || 1, - actual_price: opt.cost, - original_actual_price: opt.cost, - cost_center: opt.part_type - ? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid - ? opt.part_type !== "PAE" - ? opt.part_type - : null - : responsibilityCenters.defaults && - (responsibilityCenters.defaults.costs[ - opt.part_type - ] || - null) - : null, - }; - } - return item; - } - ), - }); - }} - /> - ), - }, - { - title: t("billlines.fields.line_desc"), - dataIndex: "line_desc", - editable: true, - - formItemProps: (field) => { - return { - key: `${field.index}line_desc`, - name: [field.name, "line_desc"], - label: t("billlines.fields.line_desc"), - rules: [ - { - required: true, - //message: t("general.validation.required"), - }, - ], - }; - }, - formInput: (record, index) => , - }, - { - title: t("billlines.fields.quantity"), - dataIndex: "quantity", - editable: true, - width: "4rem", - formItemProps: (field) => { - return { - key: `${field.index}quantity`, - name: [field.name, "quantity"], - label: t("billlines.fields.quantity"), - rules: [ - { - required: true, - //message: t("general.validation.required"), - }, - ({ getFieldValue }) => ({ - validator(rule, value) { - if ( - value && - getFieldValue("billlines")[field.fieldKey]?.inventories - ?.length > value - ) { - return Promise.reject( - t("bills.validation.inventoryquantity", { - number: - getFieldValue("billlines")[field.fieldKey] - ?.inventories?.length, - }) - ); - } - return Promise.resolve(); - }, - }), - ], - }; - }, - formInput: (record, index) => ( - - ), - }, - { - title: t("billlines.fields.actual_price"), - dataIndex: "actual_price", - width: "8rem", - editable: true, - formItemProps: (field) => { - return { - key: `${field.index}actual_price`, - name: [field.name, "actual_price"], - label: t("billlines.fields.actual_price"), - rules: [ - { - required: true, - //message: t("general.validation.required"), - }, - ], - }; - }, - formInput: (record, index) => ( - { - setFieldsValue({ - billlines: getFieldsValue("billlines").billlines.map( - (item, idx) => { - if (idx === index) { - return { - ...item, - actual_cost: !!item.actual_cost - ? item.actual_cost - : Math.round( - (parseFloat(e.target.value) * (1 - discount) + - Number.EPSILON) * - 100 - ) / 100, - }; - } - return item; - } - ), - }); - }} - /> - ), - additional: (record, index) => ( - - {() => { - const billLine = getFieldValue(["billlines", record.name]); - const jobLine = lineData.find( - (line) => line.id === billLine?.joblineid - ); - - if ( - !billEdit && - billLine && - jobLine && - billLine?.actual_price !== jobLine?.act_price - ) { - return ( - - - - - {t("joblines.fields.create_ppc")} - - ); - } else { - return null; - } - }} - - ), - }, - { - title: t("billlines.fields.actual_cost"), - dataIndex: "actual_cost", - editable: true, - width: "8rem", - - formItemProps: (field) => { - return { - key: `${field.index}actual_cost`, - name: [field.name, "actual_cost"], - label: t("billlines.fields.actual_cost"), - rules: [ - { - required: true, - //message: t("general.validation.required"), - }, - ], - }; - }, - formInput: (record, index) => ( - - {() => { - const line = getFieldsValue(["billlines"]).billlines[index]; - if (!!!line) return null; - let lineDiscount = 1 - line.actual_cost / line.actual_price; - if (isNaN(lineDiscount)) lineDiscount = 0; - return ( - - 0.005 - ? lineDiscount > discount - ? "orange" - : "red" - : "green", - }} - /> - - ); - }} - - } - /> - ), - // additional: (record, index) => ( - // - // {() => { - // const line = getFieldsValue(["billlines"]).billlines[index]; - // if (!!!line) return null; - // const lineDiscount = ( - // 1 - - // Math.round((line.actual_cost / line.actual_price) * 100) / 100 - // ).toPrecision(2); - - // return ( - // - // - // - // ); - // }} - // - // ), - }, - { - title: t("billlines.fields.cost_center"), - dataIndex: "cost_center", - editable: true, - - formItemProps: (field) => { - return { - key: `${field.index}cost_center`, - name: [field.name, "cost_center"], - label: t("billlines.fields.cost_center"), - valuePropName: "value", - rules: [ - { - required: true, - //message: t("general.validation.required"), - }, - ], - }; - }, - formInput: (record, index) => ( - - ), - }, - ...(billEdit - ? [] - : [ - { - title: t("billlines.fields.location"), - dataIndex: "location", - editable: true, - label: t("billlines.fields.location"), - formItemProps: (field) => { - return { - key: `${field.index}location`, - name: [field.name, "location"], - }; - }, - formInput: (record, index) => ( - - ), - }, - ]), - { - title: t("billlines.labels.deductedfromlbr"), - dataIndex: "deductedfromlbr", - editable: true, - formItemProps: (field) => { - return { - valuePropName: "checked", - key: `${field.index}deductedfromlbr`, - name: [field.name, "deductedfromlbr"], - }; - }, - formInput: (record, index) => , - additional: (record, index) => ( - - {() => { - const price = getFieldValue([ - "billlines", - record.name, - "actual_price", - ]); - - const adjustmentRate = getFieldValue([ - "billlines", - record.name, - "lbr_adjustment", - "rate", - ]); - - const billline = getFieldValue(["billlines", record.name]); - - const jobline = lineData.find( - (line) => line.id === billline?.joblineid - ); - - const employeeTeamName = bodyshop.employee_teams.find( - (team) => team.id === jobline?.assigned_team - ); - - if (getFieldValue(["billlines", record.name, "deductedfromlbr"])) - return ( -
- - {t("joblines.fields.assigned_team", { - name: employeeTeamName?.name, - })} - {`${jobline.mod_lb_hrs} units/${t( - `joblines.fields.lbr_types.${jobline.mod_lbr_ty}` - )}`} - - - - - {Enhanced_Payroll.treatment === "on" ? ( - - - - ) : ( - - - - )} - - - {price && - adjustmentRate && - `${(price / adjustmentRate).toFixed(1)} hrs`} - -
- ); - return <>; - }} -
- ), - }, - // { - // title: t("billlines.fields.federal_tax_applicable"), - // dataIndex: "applicable_taxes.federal", - // editable: true, - - // formItemProps: (field) => { - // return { - // key: `${field.index}fedtax`, - // valuePropName: "checked", - // // initialValue: true, - // name: [field.name, "applicable_taxes", "federal"], - // }; - // }, - // formInput: (record, index) => , - // }, - { - title: t("billlines.fields.state_tax_applicable"), - dataIndex: "applicable_taxes.state", - editable: true, - - formItemProps: (field) => { - return { - key: `${field.index}statetax`, - valuePropName: "checked", - name: [field.name, "applicable_taxes", "state"], - }; - }, - formInput: (record, index) => , - }, - // { - // title: t("billlines.fields.local_tax_applicable"), - // dataIndex: "applicable_taxes.local", - // editable: true, - - // formItemProps: (field) => { - // return { - // key: `${field.index}localtax`, - // valuePropName: "checked", - // name: [field.name, "applicable_taxes", "local"], - // }; - // }, - // formInput: (record, index) => , - // }, - { - title: t("general.labels.actions"), - - dataIndex: "actions", - render: (text, record) => ( - - {() => ( - - - {Simple_Inventory.treatment === "on" && ( - - )} - - )} - - ), - }, - ]; - }; - - const mergedColumns = (remove) => - columns(remove).map((col) => { - if (!col.editable) return col; - return { - ...col, - onCell: (record) => ({ - record, - formItemProps: col.formItemProps, - formInput: col.formInput, - additional: col.additional, - dataIndex: col.dataIndex, - title: col.title, - }), - }; + const {treatments: {Simple_Inventory, Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Simple_Inventory", "Enhanced_Payroll"], + splitKey: bodyshop && bodyshop.imexshopid, }); - return ( - { - if (!billlines || billlines.length < 1) { - return Promise.reject( - new Error(t("billlines.validation.atleastone")) - ); - } - }, - }, - ]} - > - {(fields, { add, remove, move }) => { - return ( - <> -
{ + return [ + { + title: t("billlines.fields.jobline"), + dataIndex: "joblineid", + editable: true, + width: "20rem", + formItemProps: (field) => { + return { + key: `${field.index}joblinename`, + name: [field.name, "joblineid"], + label: t("billlines.fields.jobline"), + rules: [ + { + required: true, + //message: t("general.validation.required"), + }, + ], + }; }, - }} - size="small" - bordered - dataSource={fields} - columns={mergedColumns(remove)} - scroll={{ x: true }} - pagination={false} - rowClassName="editable-row" - /> - - - - - ); - }} - - ); + wrapper: (props) => ( + + prev.is_credit_memo !== cur.is_credit_memo + } + > + {() => { + return props.children; + }} + + ), + formInput: (record, index) => ( + { + setFieldsValue({ + billlines: getFieldsValue(["billlines"]).billlines.map( + (item, idx) => { + if (idx === index) { + return { + ...item, + line_desc: opt.line_desc, + quantity: opt.part_qty || 1, + actual_price: opt.cost, + original_actual_price: opt.cost, + cost_center: opt.part_type + ? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid + ? opt.part_type !== "PAE" + ? opt.part_type + : null + : responsibilityCenters.defaults && + (responsibilityCenters.defaults.costs[ + opt.part_type + ] || + null) + : null, + }; + } + return item; + } + ), + }); + }} + /> + ), + }, + { + title: t("billlines.fields.line_desc"), + dataIndex: "line_desc", + editable: true, + + formItemProps: (field) => { + return { + key: `${field.index}line_desc`, + name: [field.name, "line_desc"], + label: t("billlines.fields.line_desc"), + rules: [ + { + required: true, + //message: t("general.validation.required"), + }, + ], + }; + }, + formInput: (record, index) => , + }, + { + title: t("billlines.fields.quantity"), + dataIndex: "quantity", + editable: true, + width: "4rem", + formItemProps: (field) => { + return { + key: `${field.index}quantity`, + name: [field.name, "quantity"], + label: t("billlines.fields.quantity"), + rules: [ + { + required: true, + //message: t("general.validation.required"), + }, + ({getFieldValue}) => ({ + validator(rule, value) { + if ( + value && + getFieldValue("billlines")[field.fieldKey]?.inventories + ?.length > value + ) { + return Promise.reject( + t("bills.validation.inventoryquantity", { + number: + getFieldValue("billlines")[field.fieldKey] + ?.inventories?.length, + }) + ); + } + return Promise.resolve(); + }, + }), + ], + }; + }, + formInput: (record, index) => ( + + ), + }, + { + title: t("billlines.fields.actual_price"), + dataIndex: "actual_price", + width: "8rem", + editable: true, + formItemProps: (field) => { + return { + key: `${field.index}actual_price`, + name: [field.name, "actual_price"], + label: t("billlines.fields.actual_price"), + rules: [ + { + required: true, + //message: t("general.validation.required"), + }, + ], + }; + }, + formInput: (record, index) => ( + { + setFieldsValue({ + billlines: getFieldsValue("billlines").billlines.map( + (item, idx) => { + if (idx === index) { + return { + ...item, + actual_cost: !!item.actual_cost + ? item.actual_cost + : Math.round( + (parseFloat(e.target.value) * (1 - discount) + + Number.EPSILON) * + 100 + ) / 100, + }; + } + return item; + } + ), + }); + }} + /> + ), + additional: (record, index) => ( + + {() => { + const billLine = getFieldValue(["billlines", record.name]); + const jobLine = lineData.find( + (line) => line.id === billLine?.joblineid + ); + + if ( + !billEdit && + billLine && + jobLine && + billLine?.actual_price !== jobLine?.act_price + ) { + return ( + + + + + {t("joblines.fields.create_ppc")} + + ); + } else { + return null; + } + }} + + ), + }, + { + title: t("billlines.fields.actual_cost"), + dataIndex: "actual_cost", + editable: true, + width: "8rem", + + formItemProps: (field) => { + return { + key: `${field.index}actual_cost`, + name: [field.name, "actual_cost"], + label: t("billlines.fields.actual_cost"), + rules: [ + { + required: true, + //message: t("general.validation.required"), + }, + ], + }; + }, + formInput: (record, index) => ( + + {() => { + const line = getFieldsValue(["billlines"]).billlines[index]; + if (!!!line) return null; + let lineDiscount = 1 - line.actual_cost / line.actual_price; + if (isNaN(lineDiscount)) lineDiscount = 0; + return ( + + 0.005 + ? lineDiscount > discount + ? "orange" + : "red" + : "green", + }} + /> + + ); + }} + + } + /> + ), + // additional: (record, index) => ( + // + // {() => { + // const line = getFieldsValue(["billlines"]).billlines[index]; + // if (!!!line) return null; + // const lineDiscount = ( + // 1 - + // Math.round((line.actual_cost / line.actual_price) * 100) / 100 + // ).toPrecision(2); + + // return ( + // + // + // + // ); + // }} + // + // ), + }, + { + title: t("billlines.fields.cost_center"), + dataIndex: "cost_center", + editable: true, + + formItemProps: (field) => { + return { + key: `${field.index}cost_center`, + name: [field.name, "cost_center"], + label: t("billlines.fields.cost_center"), + valuePropName: "value", + rules: [ + { + required: true, + //message: t("general.validation.required"), + }, + ], + }; + }, + formInput: (record, index) => ( + + ), + }, + ...(billEdit + ? [] + : [ + { + title: t("billlines.fields.location"), + dataIndex: "location", + editable: true, + label: t("billlines.fields.location"), + formItemProps: (field) => { + return { + key: `${field.index}location`, + name: [field.name, "location"], + }; + }, + formInput: (record, index) => ( + + ), + }, + ]), + { + title: t("billlines.labels.deductedfromlbr"), + dataIndex: "deductedfromlbr", + editable: true, + formItemProps: (field) => { + return { + valuePropName: "checked", + key: `${field.index}deductedfromlbr`, + name: [field.name, "deductedfromlbr"], + }; + }, + formInput: (record, index) => , + additional: (record, index) => ( + + {() => { + const price = getFieldValue([ + "billlines", + record.name, + "actual_price", + ]); + + const adjustmentRate = getFieldValue([ + "billlines", + record.name, + "lbr_adjustment", + "rate", + ]); + + const billline = getFieldValue(["billlines", record.name]); + + const jobline = lineData.find( + (line) => line.id === billline?.joblineid + ); + + const employeeTeamName = bodyshop.employee_teams.find( + (team) => team.id === jobline?.assigned_team + ); + + if (getFieldValue(["billlines", record.name, "deductedfromlbr"])) + return ( +
+ + {t("joblines.fields.assigned_team", { + name: employeeTeamName?.name, + })} + {`${jobline.mod_lb_hrs} units/${t( + `joblines.fields.lbr_types.${jobline.mod_lbr_ty}` + )}`} + + + + + {Enhanced_Payroll.treatment === "on" ? ( + + + + ) : ( + + + + )} + + + {price && + adjustmentRate && + `${(price / adjustmentRate).toFixed(1)} hrs`} + +
+ ); + return <>; + }} +
+ ), + }, + // { + // title: t("billlines.fields.federal_tax_applicable"), + // dataIndex: "applicable_taxes.federal", + // editable: true, + + // formItemProps: (field) => { + // return { + // key: `${field.index}fedtax`, + // valuePropName: "checked", + // // initialValue: true, + // name: [field.name, "applicable_taxes", "federal"], + // }; + // }, + // formInput: (record, index) => , + // }, + { + title: t("billlines.fields.state_tax_applicable"), + dataIndex: "applicable_taxes.state", + editable: true, + + formItemProps: (field) => { + return { + key: `${field.index}statetax`, + valuePropName: "checked", + name: [field.name, "applicable_taxes", "state"], + }; + }, + formInput: (record, index) => , + }, + // { + // title: t("billlines.fields.local_tax_applicable"), + // dataIndex: "applicable_taxes.local", + // editable: true, + + // formItemProps: (field) => { + // return { + // key: `${field.index}localtax`, + // valuePropName: "checked", + // name: [field.name, "applicable_taxes", "local"], + // }; + // }, + // formInput: (record, index) => , + // }, + { + title: t("general.labels.actions"), + + dataIndex: "actions", + render: (text, record) => ( + + {() => ( + + + {Simple_Inventory.treatment === "on" && ( + + )} + + )} + + ), + }, + ]; + }; + + const mergedColumns = (remove) => + columns(remove).map((col) => { + if (!col.editable) return col; + return { + ...col, + onCell: (record) => ({ + record, + formItemProps: col.formItemProps, + formInput: col.formInput, + additional: col.additional, + dataIndex: col.dataIndex, + title: col.title, + }), + }; + }); + + return ( + { + if (!billlines || billlines.length < 1) { + return Promise.reject( + new Error(t("billlines.validation.atleastone")) + ); + } + }, + }, + ]} + > + {(fields, {add, remove, move}) => { + return ( + <> +
+ + + + + ); + }} + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillEnterModalLinesComponent); const EditableCell = ({ - dataIndex, - title, - inputType, - record, - index, - children, - formInput, - formItemProps, - additional, - wrapper, - ...restProps -}) => { - if (additional) + dataIndex, + title, + inputType, + record, + index, + children, + formInput, + formItemProps, + additional, + wrapper, + ...restProps + }) => { + if (additional) + return ( + + ); + if (wrapper) + return ( + + + + ); return ( - - ); - if (wrapper) - return ( - - ); - return ( - - ); }; diff --git a/client/src/components/bill-form/bill-form.totals.utility.js b/client/src/components/bill-form/bill-form.totals.utility.js index fdd71b710..eb5c67517 100644 --- a/client/src/components/bill-form/bill-form.totals.utility.js +++ b/client/src/components/bill-form/bill-form.totals.utility.js @@ -1,47 +1,47 @@ import Dinero from "dinero.js"; export const CalculateBillTotal = (invoice) => { - const { total, billlines, federal_tax_rate, local_tax_rate, state_tax_rate } = - invoice; + const {total, billlines, federal_tax_rate, local_tax_rate, state_tax_rate} = + invoice; - //TODO Determine why this recalculates so many times. - let subtotal = Dinero({ amount: 0 }); - let federalTax = Dinero({ amount: 0 }); - let stateTax = Dinero({ amount: 0 }); - let localTax = Dinero({ amount: 0 }); + //TODO Determine why this recalculates so many times. + let subtotal = Dinero({amount: 0}); + let federalTax = Dinero({amount: 0}); + let stateTax = Dinero({amount: 0}); + let localTax = Dinero({amount: 0}); - if (!!!billlines) return null; + if (!!!billlines) return null; - billlines.forEach((i) => { - if (!!i) { - const itemTotal = Dinero({ - amount: Math.round((i.actual_cost || 0) * 100), - }).multiply(i.quantity || 1); + billlines.forEach((i) => { + if (!!i) { + const itemTotal = Dinero({ + amount: Math.round((i.actual_cost || 0) * 100), + }).multiply(i.quantity || 1); - subtotal = subtotal.add(itemTotal); - if (i.applicable_taxes?.federal) { - federalTax = federalTax.add( - itemTotal.percentage(federal_tax_rate || 0) - ); - } - if (i.applicable_taxes?.state) - stateTax = stateTax.add(itemTotal.percentage(state_tax_rate || 0)); - if (i.applicable_taxes?.local) - localTax = localTax.add(itemTotal.percentage(local_tax_rate || 0)); - } - }); + subtotal = subtotal.add(itemTotal); + if (i.applicable_taxes?.federal) { + federalTax = federalTax.add( + itemTotal.percentage(federal_tax_rate || 0) + ); + } + if (i.applicable_taxes?.state) + stateTax = stateTax.add(itemTotal.percentage(state_tax_rate || 0)); + if (i.applicable_taxes?.local) + localTax = localTax.add(itemTotal.percentage(local_tax_rate || 0)); + } + }); - const invoiceTotal = Dinero({ amount: Math.round((total || 0) * 100) }); - const enteredTotal = subtotal.add(federalTax).add(stateTax).add(localTax); - const discrepancy = enteredTotal.subtract(invoiceTotal); + const invoiceTotal = Dinero({amount: Math.round((total || 0) * 100)}); + const enteredTotal = subtotal.add(federalTax).add(stateTax).add(localTax); + const discrepancy = enteredTotal.subtract(invoiceTotal); - return { - subtotal, - federalTax, - stateTax, - localTax, - enteredTotal, - invoiceTotal, - discrepancy, - }; + return { + subtotal, + federalTax, + stateTax, + localTax, + enteredTotal, + invoiceTotal, + discrepancy, + }; }; diff --git a/client/src/components/bill-inventory-table/bill-inventory-table.component.jsx b/client/src/components/bill-inventory-table/bill-inventory-table.component.jsx index 30f35aa1f..a9cab74b9 100644 --- a/client/src/components/bill-inventory-table/bill-inventory-table.component.jsx +++ b/client/src/components/bill-inventory-table/bill-inventory-table.component.jsx @@ -1,173 +1,173 @@ -import { Checkbox, Form, Skeleton, Typography } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; +import {Checkbox, Form, Skeleton, Typography} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component"; import "./bill-inventory-table.styles.scss"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { selectBillEnterModal } from "../../redux/modals/modals.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {selectBillEnterModal} from "../../redux/modals/modals.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - billEnterModal: selectBillEnterModal, + bodyshop: selectBodyshop, + billEnterModal: selectBillEnterModal, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(BillInventoryTable); export function BillInventoryTable({ - billEnterModal, - bodyshop, - form, - billEdit, - inventoryLoading, - inventoryData, -}) { - const { t } = useTranslation(); + billEnterModal, + bodyshop, + form, + billEdit, + inventoryLoading, + inventoryData, + }) { + const {t} = useTranslation(); - useEffect(() => { - if (inventoryData && inventoryData.inventory) { - form.setFieldsValue({ - inventory: billEnterModal.context.consumeinventoryid - ? inventoryData.inventory.map((i) => { - if (i.id === billEnterModal.context.consumeinventoryid) - i.consumefrominventory = true; - return i; - }) - : inventoryData.inventory, - }); - } - }, [inventoryData, form, billEnterModal.context.consumeinventoryid]); - - return ( - prev.vendorid !== cur.vendorid} - noStyle - > - {() => { - const is_inhouse = - form.getFieldValue("vendorid") === bodyshop.inhousevendorid; - - if (!is_inhouse || billEdit) { - return null; + useEffect(() => { + if (inventoryData && inventoryData.inventory) { + form.setFieldsValue({ + inventory: billEnterModal.context.consumeinventoryid + ? inventoryData.inventory.map((i) => { + if (i.id === billEnterModal.context.consumeinventoryid) + i.consumefrominventory = true; + return i; + }) + : inventoryData.inventory, + }); } + }, [inventoryData, form, billEnterModal.context.consumeinventoryid]); - if (inventoryLoading) return ; + return ( + prev.vendorid !== cur.vendorid} + noStyle + > + {() => { + const is_inhouse = + form.getFieldValue("vendorid") === bodyshop.inhousevendorid; - return ( - - {(fields, { add, remove, move }) => { - return ( - <> - - {t("inventory.labels.inventory")} - -
+
+ + {(formInput && formInput(record, record.name)) || children} + + {additional && additional(record, record.name)} +
+
+ + {(formInput && formInput(record, record.name)) || children} + + -
- - {(formInput && formInput(record, record.name)) || children} - - {additional && additional(record, record.name)} -
-
- - {(formInput && formInput(record, record.name)) || children} - + + {(formInput && formInput(record, record.name)) || children} + - - {(formInput && formInput(record, record.name)) || children} - -
- - - - - - - - - - - - - {fields.map((field, index) => ( - - + if (!is_inhouse || billEdit) { + return null; + } - - - - - + if (inventoryLoading) return ; - - - ))} - -
{t("billlines.fields.line_desc")}{t("vendors.fields.name")}{t("billlines.fields.quantity")}{t("billlines.fields.actual_price")}{t("billlines.fields.actual_cost")}{t("inventory.fields.comment")}{t("inventory.actions.consumefrominventory")}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - ); + return ( + + {(fields, {add, remove, move}) => { + return ( + <> + + {t("inventory.labels.inventory")} + + + + + + + + + + + + + + + {fields.map((field, index) => ( + + + + + + + + + + + + ))} + +
{t("billlines.fields.line_desc")}{t("vendors.fields.name")}{t("billlines.fields.quantity")}{t("billlines.fields.actual_price")}{t("billlines.fields.actual_cost")}{t("inventory.fields.comment")}{t("inventory.actions.consumefrominventory")}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + ); + }} +
+ ); }} - - ); - }} -
- ); +
+ ); } diff --git a/client/src/components/bill-inventory-table/bill-inventory-table.styles.scss b/client/src/components/bill-inventory-table/bill-inventory-table.styles.scss index 67bc0543b..9a47de1dc 100644 --- a/client/src/components/bill-inventory-table/bill-inventory-table.styles.scss +++ b/client/src/components/bill-inventory-table/bill-inventory-table.styles.scss @@ -1,19 +1,19 @@ .bill-inventory-table { - table-layout: fixed; - width: 100%; + table-layout: fixed; + width: 100%; - th, - td { - padding: 8px; - text-align: left; - border-bottom: 1px solid #ddd; + th, + td { + padding: 8px; + text-align: left; + border-bottom: 1px solid #ddd; - .ant-form-item { - margin-bottom: 0px !important; - } + .ant-form-item { + margin-bottom: 0px !important; } + } - tr:hover { - background-color: #f5f5f5; - } + tr:hover { + background-color: #f5f5f5; + } } \ No newline at end of file diff --git a/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx b/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx index aace2a52a..0607c3b22 100644 --- a/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx +++ b/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx @@ -1,83 +1,87 @@ -import { Select } from "antd"; -import React, { forwardRef } from "react"; -import { useTranslation } from "react-i18next"; +import {Select} from "antd"; +import React, {forwardRef} from "react"; +import {useTranslation} from "react-i18next"; //To be used as a form element only. -const { Option } = Select; +const {Option} = Select; const BillLineSearchSelect = ( - { options, disabled, allowRemoved, ...restProps }, - ref + {options, disabled, allowRemoved, ...restProps}, + ref ) => { - const { t } = useTranslation(); + const {t} = useTranslation(); - return ( - { + return ( + (option.line_desc && + option.line_desc + .toLowerCase() + .includes(inputValue.toLowerCase())) || + (option.oem_partno && + option.oem_partno + .toLowerCase() + .includes(inputValue.toLowerCase())) || + (option.alt_partno && + option.alt_partno + .toLowerCase() + .includes(inputValue.toLowerCase())) || + (option.act_price && + option.act_price.toString().startsWith(inputValue.toString())) + ); + }} + notFoundContent={"Removed."} + {...restProps} + > + + {t("billlines.labels.other")} + + {options + ? options.map((item) => ( + - )) - : null} - - ); + + )) + : null} + + ); }; export default forwardRef(BillLineSearchSelect); diff --git a/client/src/components/bill-mark-exported-button/bill-mark-exported-button.component.jsx b/client/src/components/bill-mark-exported-button/bill-mark-exported-button.component.jsx index cd9d0b3e0..a014bf775 100644 --- a/client/src/components/bill-mark-exported-button/bill-mark-exported-button.component.jsx +++ b/client/src/components/bill-mark-exported-button/bill-mark-exported-button.component.jsx @@ -1,101 +1,97 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import { gql } from "@apollo/client"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {gql, useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectAuthLevel, selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {HasRbacAccess} from "../rbac-wrapper/rbac-wrapper.component"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectAuthLevel, - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - authLevel: selectAuthLevel, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + authLevel: selectAuthLevel, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillMarkExportedButton); export function BillMarkExportedButton({ - currentUser, - bodyshop, - authLevel, - bill, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + currentUser, + bodyshop, + authLevel, + bill, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const [updateBill] = useMutation(gql` - mutation UPDATE_BILL($billId: uuid!) { - update_bills(where: { id: { _eq: $billId } }, _set: { exported: true }) { - returning { - id - exported - exported_at + const [updateBill] = useMutation(gql` + mutation UPDATE_BILL($billId: uuid!) { + update_bills(where: { id: { _eq: $billId } }, _set: { exported: true }) { + returning { + id + exported + exported_at + } + } } - } - } - `); + `); - const handleUpdate = async () => { - setLoading(true); - const result = await updateBill({ - variables: { billId: bill.id }, + const handleUpdate = async () => { + setLoading(true); + const result = await updateBill({ + variables: {billId: bill.id}, + }); + + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + billid: bill.id, + successful: true, + message: JSON.stringify([t("general.labels.markedexported")]), + useremail: currentUser.email, + }, + ], + }, + }); + + if (!result.errors) { + notification["success"]({ + message: t("bills.successes.markexported"), + }); + } else { + notification["error"]({ + message: t("bills.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + //Get the owner details, populate it all back into the job. + }; + + const hasAccess = HasRbacAccess({ + bodyshop, + authLevel, + action: "bills:reexport", }); - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - billid: bill.id, - successful: true, - message: JSON.stringify([t("general.labels.markedexported")]), - useremail: currentUser.email, - }, - ], - }, - }); + if (hasAccess) + return ( + + ); - if (!result.errors) { - notification["success"]({ - message: t("bills.successes.markexported"), - }); - } else { - notification["error"]({ - message: t("bills.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - //Get the owner details, populate it all back into the job. - }; - - const hasAccess = HasRbacAccess({ - bodyshop, - authLevel, - action: "bills:reexport", - }); - - if (hasAccess) - return ( - - ); - - return <>; + return <>; } diff --git a/client/src/components/bill-print-button/bill-print-button.component.jsx b/client/src/components/bill-print-button/bill-print-button.component.jsx index 46e7d2f72..dd3bac20e 100644 --- a/client/src/components/bill-print-button/bill-print-button.component.jsx +++ b/client/src/components/bill-print-button/bill-print-button.component.jsx @@ -1,38 +1,38 @@ -import { Button, Space } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {Button, Space} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; -export default function BillPrintButton({ billid }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const Templates = TemplateList("job_special"); +export default function BillPrintButton({billid}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const Templates = TemplateList("job_special"); - const submitHandler = async () => { - setLoading(true); - try { - await GenerateDocument( - { - name: Templates.parts_invoice_label_single.key, - variables: { - id: billid, - }, - }, - {}, - "p" - ); - } catch (e) { - console.warn("Warning: Error generating a document."); - } - setLoading(false); - }; + const submitHandler = async () => { + setLoading(true); + try { + await GenerateDocument( + { + name: Templates.parts_invoice_label_single.key, + variables: { + id: billid, + }, + }, + {}, + "p" + ); + } catch (e) { + console.warn("Warning: Error generating a document."); + } + setLoading(false); + }; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/bill-reexport-button/bill-reexport-button.component.jsx b/client/src/components/bill-reexport-button/bill-reexport-button.component.jsx index 8ed0f3724..3f5ab32b8 100644 --- a/client/src/components/bill-reexport-button/bill-reexport-button.component.jsx +++ b/client/src/components/bill-reexport-button/bill-reexport-button.component.jsx @@ -1,82 +1,79 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import { gql } from "@apollo/client"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {gql, useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectAuthLevel, selectBodyshop,} from "../../redux/user/user.selectors"; +import {HasRbacAccess} from "../rbac-wrapper/rbac-wrapper.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectAuthLevel, - selectBodyshop, -} from "../../redux/user/user.selectors"; -import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - authLevel: selectAuthLevel, + bodyshop: selectBodyshop, + authLevel: selectAuthLevel, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillMarkForReexportButton); -export function BillMarkForReexportButton({ bodyshop, authLevel, bill }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); +export function BillMarkForReexportButton({bodyshop, authLevel, bill}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); - const [updateBill] = useMutation(gql` - mutation UPDATE_BILL($billId: uuid!) { - update_bills(where: { id: { _eq: $billId } }, _set: { exported: false }) { - returning { - id - exported - exported_at + const [updateBill] = useMutation(gql` + mutation UPDATE_BILL($billId: uuid!) { + update_bills(where: { id: { _eq: $billId } }, _set: { exported: false }) { + returning { + id + exported + exported_at + } + } } - } - } - `); + `); - const handleUpdate = async () => { - setLoading(true); - const result = await updateBill({ - variables: { billId: bill.id }, + const handleUpdate = async () => { + setLoading(true); + const result = await updateBill({ + variables: {billId: bill.id}, + }); + + if (!result.errors) { + notification["success"]({ + message: t("bills.successes.reexport"), + }); + } else { + notification["error"]({ + message: t("bills.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + //Get the owner details, populate it all back into the job. + }; + + const hasAccess = HasRbacAccess({ + bodyshop, + authLevel, + action: "bills:reexport", }); - if (!result.errors) { - notification["success"]({ - message: t("bills.successes.reexport"), - }); - } else { - notification["error"]({ - message: t("bills.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - //Get the owner details, populate it all back into the job. - }; + if (hasAccess) + return ( + + ); - const hasAccess = HasRbacAccess({ - bodyshop, - authLevel, - action: "bills:reexport", - }); - - if (hasAccess) - return ( - - ); - - return <>; + return <>; } diff --git a/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx b/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx index 1fea48f5b..5b35bd196 100644 --- a/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx +++ b/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx @@ -1,155 +1,151 @@ -import { FileAddFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, notification, Tooltip } from "antd"; -import { t } from "i18next"; -import moment from "moment"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_INVENTORY_AND_CREDIT } from "../../graphql/inventory.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility"; +import {FileAddFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, notification, Tooltip} from "antd"; +import {t} from "i18next"; +import dayjs from "./../../utils/day"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_INVENTORY_AND_CREDIT} from "../../graphql/inventory.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {CalculateBillTotal} from "../bill-form/bill-form.totals.utility"; import queryString from "query-string"; -import { useLocation } from "react-router-dom"; +import {useLocation} from "react-router-dom"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BilllineAddInventory); export function BilllineAddInventory({ - currentUser, - bodyshop, - billline, - disabled, - jobid, -}) { - const [loading, setLoading] = useState(false); - const { billid } = queryString.parse(useLocation().search); + currentUser, + bodyshop, + billline, + disabled, + jobid, + }) { + const [loading, setLoading] = useState(false); + const {billid} = queryString.parse(useLocation().search); + const [insertInventoryLine] = useMutation(INSERT_INVENTORY_AND_CREDIT); - const [insertInventoryLine] = useMutation(INSERT_INVENTORY_AND_CREDIT); + const addToInventory = async () => { + setLoading(true); - const addToInventory = async () => { - setLoading(true); + //Check to make sure there are no existing items already in the inventory. - //Check to make sure there are no existing items already in the inventory. + const cm = { + vendorid: bodyshop.inhousevendorid, + invoice_number: "ih", + jobid: jobid, + isinhouse: true, + is_credit_memo: true, + date: dayjs().format("YYYY-MM-DD"), + federal_tax_rate: bodyshop.bill_tax_rates.federal_tax_rate, + state_tax_rate: bodyshop.bill_tax_rates.state_tax_rate, + local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate, + total: 0, + billlines: [ + { + actual_price: billline.actual_price, + actual_cost: billline.actual_cost, + quantity: billline.quantity, + line_desc: billline.line_desc, + cost_center: billline.cost_center, + deductedfromlbr: billline.deductedfromlbr, + applicable_taxes: { + local: billline.applicable_taxes.local, + state: billline.applicable_taxes.state, + federal: billline.applicable_taxes.federal, + }, + }, + ], + }; - const cm = { - vendorid: bodyshop.inhousevendorid, - invoice_number: "ih", - jobid: jobid, - isinhouse: true, - is_credit_memo: true, - date: moment().format("YYYY-MM-DD"), - federal_tax_rate: bodyshop.bill_tax_rates.federal_tax_rate, - state_tax_rate: bodyshop.bill_tax_rates.state_tax_rate, - local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate, - total: 0, - billlines: [ - { - actual_price: billline.actual_price, - actual_cost: billline.actual_cost, - quantity: billline.quantity, - line_desc: billline.line_desc, - cost_center: billline.cost_center, - deductedfromlbr: billline.deductedfromlbr, - applicable_taxes: { - local: billline.applicable_taxes.local, - state: billline.applicable_taxes.state, - federal: billline.applicable_taxes.federal, - }, - }, - ], + cm.total = CalculateBillTotal(cm).enteredTotal.getAmount() / 100; + + const insertResult = await insertInventoryLine({ + variables: { + joblineId: + billline.joblineid === "noline" ? billline.id : billline.joblineid, //This will return null as there will be no jobline that has the id of the bill line. + //Unfortunately, we can't send null as the GQL syntax validation fails. + joblineStatus: bodyshop.md_order_statuses.default_returned, + inv: { + shopid: bodyshop.id, + billlineid: billline.id, + actual_price: billline.actual_price, + actual_cost: billline.actual_cost, + quantity: billline.quantity, + line_desc: billline.line_desc, + }, + cm: {...cm, billlines: {data: cm.billlines}}, //Fix structure for apollo insert. + pol: { + returnfrombill: billid, + vendorid: bodyshop.inhousevendorid, + deliver_by: dayjs().format("YYYY-MM-DD"), + parts_order_lines: { + data: [ + { + line_desc: billline.line_desc, + + act_price: billline.actual_price, + cost: billline.actual_cost, + quantity: billline.quantity, + job_line_id: + billline.joblineid === "noline" ? null : billline.joblineid, + part_type: billline.jobline && billline.jobline.part_type, + cm_received: true, + }, + ], + }, + order_date: "2022-06-01", + orderedby: currentUser.email, + jobid: jobid, + user_email: currentUser.email, + return: true, + status: "Ordered", + }, + }, + refetchQueries: ["QUERY_BILL_BY_PK"], + }); + + if (!insertResult.errors) { + notification.open({ + type: "success", + message: t("inventory.successes.inserted"), + }); + } else { + notification.open({ + type: "error", + message: t("inventory.errors.inserting", { + error: JSON.stringify(insertResult.errors), + }), + }); + } + + setLoading(false); }; - cm.total = CalculateBillTotal(cm).enteredTotal.getAmount() / 100; - - const insertResult = await insertInventoryLine({ - variables: { - joblineId: - billline.joblineid === "noline" ? billline.id : billline.joblineid, //This will return null as there will be no jobline that has the id of the bill line. - //Unfortunately, we can't send null as the GQL syntax validation fails. - joblineStatus: bodyshop.md_order_statuses.default_returned, - inv: { - shopid: bodyshop.id, - billlineid: billline.id, - actual_price: billline.actual_price, - actual_cost: billline.actual_cost, - quantity: billline.quantity, - line_desc: billline.line_desc, - }, - cm: { ...cm, billlines: { data: cm.billlines } }, //Fix structure for apollo insert. - pol: { - returnfrombill: billid, - vendorid: bodyshop.inhousevendorid, - deliver_by: moment().format("YYYY-MM-DD"), - parts_order_lines: { - data: [ - { - line_desc: billline.line_desc, - - act_price: billline.actual_price, - cost: billline.actual_cost, - quantity: billline.quantity, - job_line_id: - billline.joblineid === "noline" ? null : billline.joblineid, - part_type: billline.jobline && billline.jobline.part_type, - cm_received: true, - }, - ], - }, - order_date: "2022-06-01", - orderedby: currentUser.email, - jobid: jobid, - user_email: currentUser.email, - return: true, - status: "Ordered", - }, - }, - refetchQueries: ["QUERY_BILL_BY_PK"], - }); - - if (!insertResult.errors) { - notification.open({ - type: "success", - message: t("inventory.successes.inserted"), - }); - } else { - notification.open({ - type: "error", - message: t("inventory.errors.inserting", { - error: JSON.stringify(insertResult.errors), - }), - }); - } - - setLoading(false); - }; - - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/bills-list-table/bills-list-table.component.jsx b/client/src/components/bills-list-table/bills-list-table.component.jsx index 9dea48f71..5f0237260 100644 --- a/client/src/components/bills-list-table/bills-list-table.component.jsx +++ b/client/src/components/bills-list-table/bills-list-table.component.jsx @@ -1,235 +1,236 @@ -import { EditFilled, SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Checkbox, Input, Space, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {EditFilled, SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Checkbox, Input, Space, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter } from "../../utils/DateFormatter"; -import { alphaSort, dateSort } from "../../utils/sorters"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {DateFormatter} from "../../utils/DateFormatter"; +import {alphaSort, dateSort} from "../../utils/sorters"; +import {TemplateList} from "../../utils/TemplateConstants"; import BillDeleteButton from "../bill-delete-button/bill-delete-button.component"; import BillDetailEditReturnComponent from "../bill-detail-edit/bill-detail-edit-return.component"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, - bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setPartsOrderContext: (context) => - dispatch(setModalContext({ context: context, modal: "partsOrder" })), - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), - setReconciliationContext: (context) => - dispatch(setModalContext({ context: context, modal: "reconciliation" })), + setPartsOrderContext: (context) => + dispatch(setModalContext({context: context, modal: "partsOrder"})), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), + setReconciliationContext: (context) => + dispatch(setModalContext({context: context, modal: "reconciliation"})), }); export function BillsListTableComponent({ - bodyshop, - jobRO, - job, - billsQuery, - handleOnRowClick, - setPartsOrderContext, - setBillEnterContext, - setReconciliationContext, -}) { - const { t } = useTranslation(); + bodyshop, + jobRO, + job, + billsQuery, + handleOnRowClick, + setPartsOrderContext, + setBillEnterContext, + setReconciliationContext, + }) { + const {t} = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - // const search = queryString.parse(useLocation().search); - // const selectedBill = search.billid; - const [searchText, setSearchText] = useState(""); + const [state, setState] = useState({ + sortedInfo: {}, + }); + // const search = queryString.parse(useLocation().search); + // const selectedBill = search.billid; + const [searchText, setSearchText] = useState(""); - const Templates = TemplateList("bill"); - const bills = billsQuery.data ? billsQuery.data.bills : []; - const { refetch } = billsQuery; - const recordActions = (record, showView = false) => ( - - {showView && ( - - )} - - - - {record.isinhouse && ( - - )} - - ); - const columns = [ - { - title: t("bills.fields.vendorname"), - dataIndex: "vendorname", - key: "vendorname", - sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), - sortOrder: - state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, - render: (text, record) => {record.vendor.name}, - }, - { - title: t("bills.fields.invoice_number"), - dataIndex: "invoice_number", - key: "invoice_number", - sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), - sortOrder: - state.sortedInfo.columnKey === "invoice_number" && - state.sortedInfo.order, - }, - { - title: t("bills.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => dateSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("bills.fields.total"), - dataIndex: "total", - key: "total", - sorter: (a, b) => a.total - b.total, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => ( - {record.total} - ), - }, - { - title: t("bills.fields.is_credit_memo"), - dataIndex: "is_credit_memo", - key: "is_credit_memo", - sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, - sortOrder: - state.sortedInfo.columnKey === "is_credit_memo" && - state.sortedInfo.order, - render: (text, record) => , - }, - { - title: t("bills.fields.exported"), - dataIndex: "exported", - key: "exported", - sorter: (a, b) => a.exported - b.exported, - sortOrder: - state.sortedInfo.columnKey === "exported" && state.sortedInfo.order, - render: (text, record) => , - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => recordActions(record, true), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const filteredBills = bills - ? searchText === "" - ? bills - : bills.filter( - (b) => - (b.invoice_number || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (b.vendor.name || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (b.total || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : []; - - return ( - ( - - {job && job.converted ? ( - <> - - - - ) : null} + {showView && ( + + )} + + - { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> + {record.isinhouse && ( + + )} - } - > - - - ); + ); + const columns = [ + { + title: t("bills.fields.vendorname"), + dataIndex: "vendorname", + key: "vendorname", + sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), + sortOrder: + state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + render: (text, record) => {record.vendor.name}, + }, + { + title: t("bills.fields.invoice_number"), + dataIndex: "invoice_number", + key: "invoice_number", + sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), + sortOrder: + state.sortedInfo.columnKey === "invoice_number" && + state.sortedInfo.order, + }, + { + title: t("bills.fields.date"), + dataIndex: "date", + key: "date", + sorter: (a, b) => dateSort(a.date, b.date), + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("bills.fields.total"), + dataIndex: "total", + key: "total", + sorter: (a, b) => a.total - b.total, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => ( + {record.total} + ), + }, + { + title: t("bills.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => , + }, + { + title: t("bills.fields.exported"), + dataIndex: "exported", + key: "exported", + sorter: (a, b) => a.exported - b.exported, + sortOrder: + state.sortedInfo.columnKey === "exported" && state.sortedInfo.order, + render: (text, record) => , + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => recordActions(record, true), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + const filteredBills = bills + ? searchText === "" + ? bills + : bills.filter( + (b) => + (b.invoice_number || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (b.vendor.name || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (b.total || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; + + return ( + + + {job && job.converted ? ( + <> + + + + ) : null} + + { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> + + } + > +
+ + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillsListTableComponent); diff --git a/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx b/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx index 417c719dd..e6cf58cb9 100644 --- a/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx +++ b/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx @@ -1,121 +1,121 @@ -import React, { useState } from "react"; -import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries"; -import { useQuery } from "@apollo/client"; +import React, {useState} from "react"; +import {QUERY_ALL_VENDORS} from "../../graphql/vendors.queries"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; -import { useHistory, useLocation } from "react-router-dom"; -import { Table, Input } from "antd"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../utils/sorters"; +import {useLocation, useNavigate} from "react-router-dom"; +import {Input, Table} from "antd"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../utils/sorters"; import AlertComponent from "../alert/alert.component"; export default function BillsVendorsList() { - const search = queryString.parse(useLocation().search); - const history = useHistory(); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); - const { loading, error, data } = useQuery(QUERY_ALL_VENDORS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data} = useQuery(QUERY_ALL_VENDORS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - search: "", - }); + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("vendors.fields.name"), - dataIndex: "name", - key: "name", - sorter: (a, b) => alphaSort(a.name, b.name), - sortOrder: - state.sortedInfo.columnKey === "name" && state.sortedInfo.order, - }, - { - title: t("vendors.fields.cost_center"), - dataIndex: "cost_center", - key: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, - }, - { - title: t("vendors.fields.city"), - dataIndex: "city", - key: "city", - }, - ]; - - const handleOnRowClick = (record) => { - if (record) { - delete search.billid; - if (record.id) { - search.vendorid = record.id; - history.push({ search: queryString.stringify(search) }); - } - } else { - delete search.vendorid; - history.push({ search: queryString.stringify(search) }); - } - }; - - const handleSearch = (e) => { - setState({ ...state, search: e.target.value }); - }; - - if (error) return ; - - const dataSource = state.search - ? data.vendors.filter( - (v) => - (v.name || "").toLowerCase().includes(state.search.toLowerCase()) || - (v.cost_center || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (v.city || "").toLowerCase().includes(state.search.toLowerCase()) - ) - : (data && data.vendors) || []; - - return ( -
{ - return ( -
- -
- ); - }} - dataSource={dataSource} - pagination={{ position: "top" }} - columns={columns} - rowKey="id" - onChange={handleTableChange} - rowSelection={{ - onSelect: (record) => { - handleOnRowClick(record); + const columns = [ + { + title: t("vendors.fields.name"), + dataIndex: "name", + key: "name", + sorter: (a, b) => alphaSort(a.name, b.name), + sortOrder: + state.sortedInfo.columnKey === "name" && state.sortedInfo.order, }, - selectedRowKeys: [search.vendorid], - type: "radio", - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, // click row - }; - }} - /> - ); + { + title: t("vendors.fields.cost_center"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + }, + { + title: t("vendors.fields.city"), + dataIndex: "city", + key: "city", + }, + ]; + + const handleOnRowClick = (record) => { + if (record) { + delete search.billid; + if (record.id) { + search.vendorid = record.id; + history.push({search: queryString.stringify(search)}); + } + } else { + delete search.vendorid; + history.push({search: queryString.stringify(search)}); + } + }; + + const handleSearch = (e) => { + setState({...state, search: e.target.value}); + }; + + if (error) return ; + + const dataSource = state.search + ? data.vendors.filter( + (v) => + (v.name || "").toLowerCase().includes(state.search.toLowerCase()) || + (v.cost_center || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.city || "").toLowerCase().includes(state.search.toLowerCase()) + ) + : (data && data.vendors) || []; + + return ( +
{ + return ( +
+ +
+ ); + }} + dataSource={dataSource} + pagination={{position: "top"}} + columns={columns} + rowKey="id" + onChange={handleTableChange} + rowSelection={{ + onSelect: (record) => { + handleOnRowClick(record); + }, + selectedRowKeys: [search.vendorid], + type: "radio", + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, // click row + }; + }} + /> + ); } diff --git a/client/src/components/breadcrumbs/breadcrumbs.component.jsx b/client/src/components/breadcrumbs/breadcrumbs.component.jsx index ba2619c4e..360eb480d 100644 --- a/client/src/components/breadcrumbs/breadcrumbs.component.jsx +++ b/client/src/components/breadcrumbs/breadcrumbs.component.jsx @@ -1,54 +1,64 @@ -import { HomeFilled } from "@ant-design/icons"; -import { Breadcrumb, Row, Col } from "antd"; +import {HomeFilled} from "@ant-design/icons"; +import {Breadcrumb, Col, Row} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectBreadcrumbs } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectBreadcrumbs} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import GlobalSearch from "../global-search/global-search.component"; import GlobalSearchOs from "../global-search/global-search-os.component"; import "./breadcrumbs.styles.scss"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - breadcrumbs: selectBreadcrumbs, - bodyshop: selectBodyshop, + breadcrumbs: selectBreadcrumbs, + bodyshop: selectBodyshop, }); -export function BreadCrumbs({ breadcrumbs, bodyshop }) { - const { OpenSearch } = useTreatments( - ["OpenSearch"], - {}, - bodyshop && bodyshop.imexshopid - ); +export function BreadCrumbs({breadcrumbs, bodyshop}) { - return ( - - - - - - {" "} - {(bodyshop && bodyshop.shopname && `(${bodyshop.shopname})`) || - ""} - - - {breadcrumbs.map((item) => - item.link ? ( - - {item.label} - - ) : ( - {item.label} - ) - )} - - - - {OpenSearch.treatment === "on" ? : } - - - ); + const {treatments: {OpenSearch}} = useSplitTreatments({ + attributes: {}, + names: ["OpenSearch"], + splitKey: bodyshop && bodyshop.imexshopid, + }); + // TODO - Client Update - Technically key is not doing anything here + return ( + + + + {" "} + {(bodyshop && bodyshop.shopname && `(${bodyshop.shopname})`) || + ""} + + ), + }, + ...breadcrumbs.map((item) => + item.link + ? { + key: item.label, + title: {item.label}, + } + : { + key: item.label, + title: item.label, + } + ), + ]} + /> + + + {OpenSearch.treatment === "on" ? : } + + + ); } + export default connect(mapStateToProps, null)(BreadCrumbs); diff --git a/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx index 872d2aec3..04a49ca36 100644 --- a/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx +++ b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx @@ -1,99 +1,99 @@ -import { Button, Form, Modal } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectCaBcEtfTableConvert } from "../../redux/modals/modals.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {Button, Form, Modal} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectCaBcEtfTableConvert} from "../../redux/modals/modals.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import CaBcEtfTableModalComponent from "./ca-bc-etf-table.modal.component"; const mapStateToProps = createStructuredSelector({ - caBcEtfTableModal: selectCaBcEtfTableConvert, + caBcEtfTableModal: selectCaBcEtfTableConvert, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => - dispatch(toggleModalVisible("ca_bc_eftTableConvert")), + toggleModalVisible: () => + dispatch(toggleModalVisible("ca_bc_eftTableConvert")), }); export function ContractsFindModalContainer({ - caBcEtfTableModal, - toggleModalVisible, -}) { - const { t } = useTranslation(); + caBcEtfTableModal, + toggleModalVisible, + }) { + const {t} = useTranslation(); - const { visible } = caBcEtfTableModal; - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const EtfTemplate = TemplateList("special").ca_bc_etf_table; + const {open} = caBcEtfTableModal; + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const EtfTemplate = TemplateList("special").ca_bc_etf_table; - const handleFinish = async (values) => { - logImEXEvent("ca_bc_etf_table_parse"); - setLoading(true); - const claimNumbers = []; - values.table.split("\n").forEach((row, idx, arr) => { - const { 1: claim, 2: shortclaim, 4: amount } = row.split("\t"); - if (!claim || !shortclaim) return; - const trimmedShortClaim = shortclaim.trim(); - // const trimmedClaim = claim.trim(); - if (amount.slice(-1) === "-") { - } + const handleFinish = async (values) => { + logImEXEvent("ca_bc_etf_table_parse"); + setLoading(true); + const claimNumbers = []; + values.table.split("\n").forEach((row, idx, arr) => { + const {1: claim, 2: shortclaim, 4: amount} = row.split("\t"); + if (!claim || !shortclaim) return; + const trimmedShortClaim = shortclaim.trim(); + // const trimmedClaim = claim.trim(); + if (amount.slice(-1) === "-") { + } - claimNumbers.push({ - claim: trimmedShortClaim, - amount: amount.slice(-1) === "-" ? parseFloat(amount) * -1 : amount, - }); - }); + claimNumbers.push({ + claim: trimmedShortClaim, + amount: amount.slice(-1) === "-" ? parseFloat(amount) * -1 : amount, + }); + }); - await GenerateDocument( - { - name: EtfTemplate.key, - variables: { - claimNumbers: `%(${claimNumbers.map((c) => c.claim).join("|")})%`, - claimdata: claimNumbers, - }, - }, - {}, - values.sendby === "email" ? "e" : "p" + await GenerateDocument( + { + name: EtfTemplate.key, + variables: { + claimNumbers: `%(${claimNumbers.map((c) => c.claim).join("|")})%`, + claimdata: claimNumbers, + }, + }, + {}, + values.sendby === "email" ? "e" : "p" + ); + setLoading(false); + }; + + useEffect(() => { + if (open) { + form.resetFields(); + } + }, [open, form]); + + return ( + toggleModalVisible()} + onOk={() => toggleModalVisible()} + destroyOnClose + forceRender + > +
+ + + +
); - setLoading(false); - }; - - useEffect(() => { - if (visible) { - form.resetFields(); - } - }, [visible, form]); - - return ( - toggleModalVisible()} - onOk={() => toggleModalVisible()} - destroyOnClose - forceRender - > -
- - - -
- ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ContractsFindModalContainer); diff --git a/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx index 6c7eee52b..67659eaa6 100644 --- a/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx +++ b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx @@ -1,42 +1,42 @@ -import { Form, Input, Radio } from "antd"; +import {Form, Input, Radio} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export default connect(mapStateToProps, null)(PartsReceiveModalComponent); -export function PartsReceiveModalComponent({ bodyshop, form }) { - const { t } = useTranslation(); +export function PartsReceiveModalComponent({bodyshop, form}) { + const {t} = useTranslation(); - return ( -
- - - - - - {t("general.labels.email")} - {t("general.labels.print")} - - -
- ); + return ( +
+ + + + + + {t("general.labels.email")} + {t("general.labels.print")} + + +
+ ); } diff --git a/client/src/components/ca-bc-pvrt-calculator/ca-bc-pvrt-calculator.component.jsx b/client/src/components/ca-bc-pvrt-calculator/ca-bc-pvrt-calculator.component.jsx index 0a1476ee5..1cb2f3385 100644 --- a/client/src/components/ca-bc-pvrt-calculator/ca-bc-pvrt-calculator.component.jsx +++ b/client/src/components/ca-bc-pvrt-calculator/ca-bc-pvrt-calculator.component.jsx @@ -1,49 +1,50 @@ -import React, { useState } from "react"; -import { Button, Form, InputNumber, Popover } from "antd"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { useTranslation } from "react-i18next"; -import { CalculatorFilled } from "@ant-design/icons"; -export default function CABCpvrtCalculator({ disabled, form }) { - const [visibility, setVisibility] = useState(false); +import React, {useState} from "react"; +import {Button, Form, InputNumber, Popover} from "antd"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {CalculatorFilled} from "@ant-design/icons"; - const { t } = useTranslation(); +export default function CABCpvrtCalculator({disabled, form}) { + const [visibility, setVisibility] = useState(false); - const handleFinish = async (values) => { - logImEXEvent("job_ca_bc_pvrt_calculate"); - form.setFieldsValue({ - ca_bc_pvrt: ((values.rate || 0) * (values.days || 0)).toFixed(2), - }); - form.setFields([{ name: "ca_bc_pvrt", touched: true }]); - setVisibility(false); - }; + const {t} = useTranslation(); - const popContent = ( -
-
- - - - - - - - - -
- ); + const handleFinish = async (values) => { + logImEXEvent("job_ca_bc_pvrt_calculate"); + form.setFieldsValue({ + ca_bc_pvrt: ((values.rate || 0) * (values.days || 0)).toFixed(2), + }); + form.setFields([{name: "ca_bc_pvrt", touched: true}]); + setVisibility(false); + }; - return ( - - - - ); + const popContent = ( +
+
+ + + + + + + + + +
+ ); + + return ( + + + + ); } diff --git a/client/src/components/card-payment-modal/card-payment-modal.component..jsx b/client/src/components/card-payment-modal/card-payment-modal.component..jsx index 071e2a758..3674211a8 100644 --- a/client/src/components/card-payment-modal/card-payment-modal.component..jsx +++ b/client/src/components/card-payment-modal/card-payment-modal.component..jsx @@ -1,374 +1,360 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useLazyQuery, useMutation } from "@apollo/client"; -import { - Button, - Card, - Col, - Form, - Input, - Row, - Space, - Spin, - Statistic, - notification, -} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {useLazyQuery, useMutation} from "@apollo/client"; +import {Button, Card, Col, Form, Input, notification, Row, Space, Spin, Statistic,} from "antd"; import axios from "axios"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - INSERT_PAYMENT_RESPONSE, - QUERY_RO_AND_OWNER_BY_JOB_PKS, -} from "../../graphql/payment_response.queries"; -import { INSERT_NEW_PAYMENT } from "../../graphql/payments.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectCardPayment } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_PAYMENT_RESPONSE, QUERY_RO_AND_OWNER_BY_JOB_PKS,} from "../../graphql/payment_response.queries"; +import {INSERT_NEW_PAYMENT} from "../../graphql/payments.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectCardPayment} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import CurrencyFormItemComponent from "../form-items-formatted/currency-form-item.component"; import JobSearchSelectComponent from "../job-search-select/job-search-select.component"; const mapStateToProps = createStructuredSelector({ - cardPaymentModal: selectCardPayment, - bodyshop: selectBodyshop, + cardPaymentModal: selectCardPayment, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), - toggleModalVisible: () => dispatch(toggleModalVisible("cardPayment")), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), + toggleModalVisible: () => dispatch(toggleModalVisible("cardPayment")), }); const CardPaymentModalComponent = ({ - bodyshop, - cardPaymentModal, - toggleModalVisible, - insertAuditTrail, -}) => { - const { context } = cardPaymentModal; + bodyshop, + cardPaymentModal, + toggleModalVisible, + insertAuditTrail, + }) => { + const {context} = cardPaymentModal; - const [form] = Form.useForm(); + const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); - const [insertPaymentResponse] = useMutation(INSERT_PAYMENT_RESPONSE); - const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); + const [insertPaymentResponse] = useMutation(INSERT_PAYMENT_RESPONSE); + const {t} = useTranslation(); - const [, { data, refetch, queryLoading }] = useLazyQuery( - QUERY_RO_AND_OWNER_BY_JOB_PKS, - { - variables: { jobids: [context.jobid] }, - skip: true, - } - ); + const [, {data, refetch, queryLoading}] = useLazyQuery( + QUERY_RO_AND_OWNER_BY_JOB_PKS, + { + variables: {jobids: [context.jobid]}, + skip: true, + } + ); - console.log("🚀 ~ file: card-payment-modal.component..jsx:61 ~ data:", data); - //Initialize the intellipay window. - const SetIntellipayCallbackFunctions = () => { - console.log("*** Set IntelliPay callback functions."); - window.intellipay.runOnClose(() => { - //window.intellipay.initialize(); - }); + console.log("🚀 ~ file: card-payment-modal.component..jsx:61 ~ data:", data); + //Initialize the intellipay window. + const SetIntellipayCallbackFunctions = () => { + console.log("*** Set IntelliPay callback functions."); + window.intellipay.runOnClose(() => { + //window.intellipay.initialize(); + }); - window.intellipay.runOnApproval(async function (response) { - console.warn("*** Running On Approval Script ***"); - form.setFieldValue("paymentResponse", response); - form.submit(); - }); + window.intellipay.runOnApproval(async function (response) { + console.warn("*** Running On Approval Script ***"); + form.setFieldValue("paymentResponse", response); + form.submit(); + }); - window.intellipay.runOnNonApproval(async function (response) { - // Mutate unsuccessful payment + window.intellipay.runOnNonApproval(async function (response) { + // Mutate unsuccessful payment - const { payments } = form.getFieldsValue(); + const {payments} = form.getFieldsValue(); - await insertPaymentResponse({ - variables: { - paymentResponse: payments.map((payment) => ({ - amount: payment.amount, - bodyshopid: bodyshop.id, - jobid: payment.jobid, - declinereason: response.declinereason, - ext_paymentid: response.paymentid.toString(), - successful: false, - response, - })), - }, - }); - - payments.forEach((payment) => - insertAuditTrail({ - jobid: payment.jobid, - operation: AuditTrailMapping.failedpayment(), - }) - ); - }); - }; - - const handleFinish = async (values) => { - try { - await insertPayment({ - variables: { - paymentInput: values.payments.map((payment) => ({ - amount: payment.amount, - transactionid: (values.paymentResponse.paymentid || "").toString(), - payer: t("payments.labels.customer"), - type: values.paymentResponse.cardbrand, - jobid: payment.jobid, - date: moment(Date.now()), - payment_responses: { - data: [ - { - amount: payment.amount, - bodyshopid: bodyshop.id, - - jobid: payment.jobid, - declinereason: values.paymentResponse.declinereason, - ext_paymentid: values.paymentResponse.paymentid.toString(), - successful: true, - response: values.paymentResponse, + await insertPaymentResponse({ + variables: { + paymentResponse: payments.map((payment) => ({ + amount: payment.amount, + bodyshopid: bodyshop.id, + jobid: payment.jobid, + declinereason: response.declinereason, + ext_paymentid: response.paymentid.toString(), + successful: false, + response, + })), }, - ], - }, - })), - }, - refetchQueries: ["GET_JOB_BY_PK"], - }); - toggleModalVisible(); - } catch (error) { - console.error(error); - notification.open({ - type: "error", - message: t("payments.errors.inserting", { error: error.message }), - }); - } finally { - setLoading(false); - } - }; + }); - const handleIntelliPayCharge = async () => { - setLoading(true); + payments.forEach((payment) => + insertAuditTrail({ + jobid: payment.jobid, + operation: AuditTrailMapping.failedpayment(), + }) + ); + }); + }; - //Validate - try { - await form.validateFields(); - } catch (error) { - setLoading(false); - return; - } + const handleFinish = async (values) => { + try { + await insertPayment({ + variables: { + paymentInput: values.payments.map((payment) => ({ + amount: payment.amount, + transactionid: (values.paymentResponse.paymentid || "").toString(), + payer: t("payments.labels.customer"), + type: values.paymentResponse.cardbrand, + jobid: payment.jobid, + date: dayjs(Date.now()), + payment_responses: { + data: [ + { + amount: payment.amount, + bodyshopid: bodyshop.id, - try { - const response = await axios.post("/intellipay/lightbox_credentials", { - bodyshop, - refresh: !!window.intellipay, - }); + jobid: payment.jobid, + declinereason: values.paymentResponse.declinereason, + ext_paymentid: values.paymentResponse.paymentid.toString(), + successful: true, + response: values.paymentResponse, + }, + ], + }, + })), + }, + refetchQueries: ["GET_JOB_BY_PK"], + }); + toggleModalVisible(); + } catch (error) { + console.error(error); + notification.open({ + type: "error", + message: t("payments.errors.inserting", {error: error.message}), + }); + } finally { + setLoading(false); + } + }; - if (window.intellipay) { - // eslint-disable-next-line no-eval - eval(response.data); - SetIntellipayCallbackFunctions(); - window.intellipay.autoOpen(); - } else { - var rg = document.createRange(); - let node = rg.createContextualFragment(response.data); - document.documentElement.appendChild(node); - SetIntellipayCallbackFunctions(); - window.intellipay.isAutoOpen = true; - window.intellipay.initialize(); - } - } catch (error) { - notification.open({ - type: "error", - message: t("job_payments.notifications.error.openingip"), - }); - setLoading(false); - } - }; + const handleIntelliPayCharge = async () => { + setLoading(true); - return ( - - -
- - {(fields, { add, remove, move }) => { - return ( -
- {fields.map((field, index) => ( - - -
- - - - - - - - - - - { - remove(field.name); - }} - /> - - - - ))} - - + + + + + + + + + + + { + remove(field.name); + }} + /> + + + + ))} + + + + + ); + }} + + + + prevValues.payments?.map((p) => p?.jobid).join() !== + curValues.payments?.map((p) => p?.jobid).join() + } > - {t("general.actions.add")} - - - - ); - }} - + {() => { + console.log("Updating the owner info section."); + //If all of the job ids have been fileld in, then query and update the IP field. + const {payments} = form.getFieldsValue(); + if ( + payments?.length > 0 && + payments?.filter((p) => p?.jobid).length === payments?.length + ) { + console.log("**Calling refetch."); + refetch({jobids: payments.map((p) => p.jobid)}); + } + console.log( + "Acc info", + data, + payments && data && data.jobs.length > 0 + ? data.jobs.map((j) => j.ro_number).join(", ") + : null + ); + return ( + <> + 0 + ? data.jobs.map((j) => j.ro_number).join(", ") + : null + } + hidden + /> + 0 + ? data.jobs.filter((j) => j.ownr_ea)[0]?.ownr_ea + : null + } + hidden + /> + + ); + }} + + + prevValues.payments?.map((p) => p?.amount).join() !== + curValues.payments?.map((p) => p?.amount).join() + } + > + {() => { + const {payments} = form.getFieldsValue(); + const totalAmountToCharge = payments?.reduce((acc, val) => { + return acc + (val?.amount || 0); + }, 0); - - prevValues.payments?.map((p) => p?.jobid).join() !== - curValues.payments?.map((p) => p?.jobid).join() - } - > - {() => { - console.log("Updating the owner info section."); - //If all of the job ids have been fileld in, then query and update the IP field. - const { payments } = form.getFieldsValue(); - if ( - payments?.length > 0 && - payments?.filter((p) => p?.jobid).length === payments?.length - ) { - console.log("**Calling refetch."); - refetch({ jobids: payments.map((p) => p.jobid) }); - } - console.log( - "Acc info", - data, - payments && data && data.jobs.length > 0 - ? data.jobs.map((j) => j.ro_number).join(", ") - : null - ); - return ( - <> - 0 - ? data.jobs.map((j) => j.ro_number).join(", ") - : null - } - hidden - /> - 0 - ? data.jobs.filter((j) => j.ownr_ea)[0]?.ownr_ea - : null - } - hidden - /> - - ); - }} - - - prevValues.payments?.map((p) => p?.amount).join() !== - curValues.payments?.map((p) => p?.amount).join() - } - > - {() => { - const { payments } = form.getFieldsValue(); - const totalAmountToCharge = payments?.reduce((acc, val) => { - return acc + (val?.amount || 0); - }, 0); + return ( + + + + + + ); + }} + - return ( - - - - - - ); - }} - - - {/* Lightbox payment response when it is completed */} - - - - - ); + {/* Lightbox payment response when it is completed */} + + + + + ); }; export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(CardPaymentModalComponent); diff --git a/client/src/components/card-payment-modal/card-payment-modal.container..jsx b/client/src/components/card-payment-modal/card-payment-modal.container..jsx index f33b7bc9e..4984ddce5 100644 --- a/client/src/components/card-payment-modal/card-payment-modal.container..jsx +++ b/client/src/components/card-payment-modal/card-payment-modal.container..jsx @@ -1,57 +1,57 @@ -import { Button, Modal } from "antd"; +import {Button, Modal} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectCardPayment } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectCardPayment} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CardPaymentModalComponent from "./card-payment-modal.component."; const mapStateToProps = createStructuredSelector({ - cardPaymentModal: selectCardPayment, - bodyshop: selectBodyshop, + cardPaymentModal: selectCardPayment, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("cardPayment")), + toggleModalVisible: () => dispatch(toggleModalVisible("cardPayment")), }); function CardPaymentModalContainer({ - cardPaymentModal, - toggleModalVisible, - bodyshop, -}) { - const { visible } = cardPaymentModal; - const { t } = useTranslation(); + cardPaymentModal, + toggleModalVisible, + bodyshop, + }) { + const {open} = cardPaymentModal; + const {t} = useTranslation(); - const handleCancel = () => { - toggleModalVisible(); - }; + const handleCancel = () => { + toggleModalVisible(); + }; - const handleOK = () => { - toggleModalVisible(); - }; + const handleOK = () => { + toggleModalVisible(); + }; - return ( - - {t("job_payments.buttons.goback")} - , - ]} - width="80%" - destroyOnClose - > - - - ); + return ( + + {t("job_payments.buttons.goback")} + , + ]} + width="80%" + destroyOnClose + > + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(CardPaymentModalContainer); diff --git a/client/src/components/chat-affix/chat-affix.container.jsx b/client/src/components/chat-affix/chat-affix.container.jsx index 55fab18bd..6ae5b97c4 100644 --- a/client/src/components/chat-affix/chat-affix.container.jsx +++ b/client/src/components/chat-affix/chat-affix.container.jsx @@ -1,106 +1,98 @@ -import { useApolloClient } from "@apollo/client"; -import { getToken, onMessage } from "@firebase/messaging"; -import { Button, notification, Space } from "antd"; +import {useApolloClient} from "@apollo/client"; +import {getToken, onMessage} from "@firebase/messaging"; +import {Button, notification, Space} from "antd"; import axios from "axios"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { messaging, requestForToken } from "../../firebase/firebase.utils"; -import { selectChatVisible } from "../../redux/messaging/messaging.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {messaging, requestForToken} from "../../firebase/firebase.utils"; import FcmHandler from "../../utils/fcm-handler"; import ChatPopupComponent from "../chat-popup/chat-popup.component"; import "./chat-affix.styles.scss"; -const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - chatVisible: selectChatVisible, -}); +export function ChatAffixContainer({bodyshop, chatVisible}) { + const {t} = useTranslation(); + const client = useApolloClient(); + useEffect(() => { + if (!bodyshop || !bodyshop.messagingservicesid) return; -export function ChatAffixContainer({ bodyshop, chatVisible }) { - const { t } = useTranslation(); - const client = useApolloClient(); - useEffect(() => { - if (!bodyshop || !bodyshop.messagingservicesid) return; + async function SubscribeToTopic() { + try { + const r = await axios.post("/notifications/subscribe", { + fcm_tokens: await getToken(messaging, { + vapidKey: process.env.REACT_APP_FIREBASE_PUBLIC_VAPID_KEY, + }), + type: "messaging", + imexshopid: bodyshop.imexshopid, + }); + console.log("FCM Topic Subscription", r.data); + } catch (error) { + console.log( + "Error attempting to subscribe to messaging topic: ", + error + ); + notification.open({ + type: "warning", + message: t("general.errors.fcm"), + btn: ( + + + + + ), + }); + } + } - async function SubscribeToTopic() { - try { - const r = await axios.post("/notifications/subscribe", { - fcm_tokens: await getToken(messaging, { - vapidKey: process.env.REACT_APP_FIREBASE_PUBLIC_VAPID_KEY, - }), - type: "messaging", - imexshopid: bodyshop.imexshopid, - }); - console.log("FCM Topic Subscription", r.data); - } catch (error) { - console.log( - "Error attempting to subscribe to messaging topic: ", - error - ); - notification.open({ - type: "warning", - message: t("general.errors.fcm"), - btn: ( - - - - - ), - }); - } - } + useEffect(() => { + function handleMessage(payload) { + FcmHandler({ + client, + payload: (payload && payload.data && payload.data.data) || payload.data, + }); + } - SubscribeToTopic(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [bodyshop]); + let stopMessageListener, channel; + try { + stopMessageListener = onMessage(messaging, handleMessage); + channel = new BroadcastChannel("imex-sw-messages"); + channel.addEventListener("message", handleMessage); + } catch (error) { + console.log("Unable to set event listeners."); + } + return () => { + stopMessageListener && stopMessageListener(); + channel && channel.removeEventListener("message", handleMessage); + }; + }, [client]); - useEffect(() => { - function handleMessage(payload) { - FcmHandler({ - client, - payload: (payload && payload.data && payload.data.data) || payload.data, - }); - } - let stopMessageListenr, channel; - try { - stopMessageListenr = onMessage(messaging, handleMessage); - channel = new BroadcastChannel("imex-sw-messages"); - channel.addEventListener("message", handleMessage); - } catch (error) { - console.log("Unable to set event listeners."); - } - return () => { - stopMessageListenr && stopMessageListenr(); - channel && channel.removeEventListener("message", handleMessage); - }; - }, [client]); + if (!bodyshop || !bodyshop.messagingservicesid) return <>; - if (!bodyshop || !bodyshop.messagingservicesid) return <>; - - return ( -
- {bodyshop && bodyshop.messagingservicesid ? : null} -
- ); + return ( +
+ {bodyshop && bodyshop.messagingservicesid ? : null} +
+ ); } -export default connect(mapStateToProps, null)(ChatAffixContainer); + +export default ChatAffixContainer; \ No newline at end of file diff --git a/client/src/components/chat-archive-button/chat-archive-button.component.jsx b/client/src/components/chat-archive-button/chat-archive-button.component.jsx index 4ad5ac0db..d7233d2cf 100644 --- a/client/src/components/chat-archive-button/chat-archive-button.component.jsx +++ b/client/src/components/chat-archive-button/chat-archive-button.component.jsx @@ -1,29 +1,29 @@ -import { useMutation } from "@apollo/client"; -import { Button } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { TOGGLE_CONVERSATION_ARCHIVE } from "../../graphql/conversations.queries"; +import {useMutation} from "@apollo/client"; +import {Button} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {TOGGLE_CONVERSATION_ARCHIVE} from "../../graphql/conversations.queries"; -export default function ChatArchiveButton({ conversation }) { - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const [updateConversation] = useMutation(TOGGLE_CONVERSATION_ARCHIVE); - const handleToggleArchive = async () => { - setLoading(true); +export default function ChatArchiveButton({conversation}) { + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const [updateConversation] = useMutation(TOGGLE_CONVERSATION_ARCHIVE); + const handleToggleArchive = async () => { + setLoading(true); - await updateConversation({ - variables: { id: conversation.id, archived: !conversation.archived }, - refetchQueries: ["CONVERSATION_LIST_QUERY"], - }); + await updateConversation({ + variables: {id: conversation.id, archived: !conversation.archived}, + refetchQueries: ["CONVERSATION_LIST_QUERY"], + }); - setLoading(false); - }; + setLoading(false); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx b/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx index 0642884c1..d498949cf 100644 --- a/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx +++ b/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx @@ -1,120 +1,122 @@ -import { Badge, List, Tag } from "antd"; +import {Badge, Card, List, Space, Tag} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { - AutoSizer, - CellMeasurer, - CellMeasurerCache, - List as VirtualizedList, -} from "react-virtualized"; -import { createStructuredSelector } from "reselect"; -import { setSelectedConversation } from "../../redux/messaging/messaging.actions"; -import { selectSelectedConversation } from "../../redux/messaging/messaging.selectors"; -import { TimeAgoFormatter } from "../../utils/DateFormatter"; +import {connect} from "react-redux"; +import {AutoSizer, CellMeasurer, CellMeasurerCache, List as VirtualizedList,} from "react-virtualized"; +import {createStructuredSelector} from "reselect"; +import {setSelectedConversation} from "../../redux/messaging/messaging.actions"; +import {selectSelectedConversation} from "../../redux/messaging/messaging.selectors"; +import {TimeAgoFormatter} from "../../utils/DateFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter"; -import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; - +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; +import _ from "lodash"; import "./chat-conversation-list.styles.scss"; const mapStateToProps = createStructuredSelector({ - selectedConversation: selectSelectedConversation, + selectedConversation: selectSelectedConversation, }); const mapDispatchToProps = (dispatch) => ({ - setSelectedConversation: (conversationId) => - dispatch(setSelectedConversation(conversationId)), + setSelectedConversation: (conversationId) => + dispatch(setSelectedConversation(conversationId)), }); function ChatConversationListComponent({ - conversationList, - selectedConversation, - setSelectedConversation, - loadMoreConversations, -}) { - const cache = new CellMeasurerCache({ - fixedWidth: true, - defaultHeight: 60, - }); + conversationList, + selectedConversation, + setSelectedConversation, + loadMoreConversations, + }) { + const cache = new CellMeasurerCache({ + fixedWidth: true, + defaultHeight: 60, + }); - const rowRenderer = ({ index, key, style, parent }) => { - const item = conversationList[index]; + const rowRenderer = ({index, key, style, parent}) => { + const item = conversationList[index]; + const cardContentRight = + {item.updated_at}; + const cardContentLeft = item.job_conversations.length > 0 + ? item.job_conversations.map((j, idx) => ( + {j.job.ro_number} + )) + : null; + + const names = <>{_.uniq(item.job_conversations.map((j, idx) => + OwnerNameDisplayFunction(j.job) + ))} + + const cardTitle = <> + {item.label && {item.label}} + {item.job_conversations.length > 0 ? ( + + {names} + + ) : ( + + {item.phone_num} + + )} + + const cardExtra = + + const getCardStyle = () => + item.id === selectedConversation + ? {backgroundColor: 'rgba(128, 128, 128, 0.2)'} + : {backgroundColor: index % 2 === 0 ? '#f0f2f5' : '#ffffff'}; + + return ( + + setSelectedConversation(item.id)} + style={style} + className={`chat-list-item + ${ + item.id === selectedConversation + ? "chat-list-selected-conversation" + : null + }`} + > + +
+ {cardContentLeft} +
+
{cardContentRight}
+
+
+
+ ); + }; return ( - - setSelectedConversation(item.id)} - className={`chat-list-item ${ - item.id === selectedConversation - ? "chat-list-selected-conversation" - : null - }`} - style={style} - > -
- {item.label &&
{item.label}
} - {item.job_conversations.length > 0 ? ( -
- {item.job_conversations.map((j, idx) => ( -
- -
- ))} -
- ) : ( - {item.phone_num} - )} -
-
-
- {item.job_conversations.length > 0 - ? item.job_conversations.map((j, idx) => ( - - {j.job.ro_number} - - )) - : null} -
- {item.updated_at} -
- -
-
+
+ + {({height, width}) => ( + { + if (scrollTop + clientHeight === scrollHeight) { + loadMoreConversations(); + } + }} + /> + )} + +
); - }; - - return ( -
- - {({ height, width }) => ( - { - if (scrollTop + clientHeight === scrollHeight) { - loadMoreConversations(); - } - }} - /> - )} - -
- ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ChatConversationListComponent); diff --git a/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss b/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss index 20cf8f4ef..2922799a2 100644 --- a/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss +++ b/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss @@ -1,27 +1,16 @@ -.chat-list-selected-conversation { - background-color: rgba(128, 128, 128, 0.2); -} .chat-list-container { - flex: 1; overflow: hidden; height: 100%; border: 1px solid gainsboro; } .chat-list-item { - display: flex; - flex-direction: row; + .ant-card-head { + border: none; + } + &:hover { cursor: pointer; color: #ff7a00; } - .chat-name { - flex: 1; - display: inline; - } - .ro-number-tag { - align-self: baseline; - } - padding: 12px 24px; - border-bottom: 1px solid gainsboro; } diff --git a/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx b/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx index a7eb66c4f..bdeb99ae2 100644 --- a/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx +++ b/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx @@ -1,56 +1,56 @@ -import { useMutation } from "@apollo/client"; -import { Tag } from "antd"; +import {useMutation} from "@apollo/client"; +import {Tag} from "antd"; import React from "react"; -import { Link } from "react-router-dom"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { REMOVE_CONVERSATION_TAG } from "../../graphql/job-conversations.queries"; +import {Link} from "react-router-dom"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {REMOVE_CONVERSATION_TAG} from "../../graphql/job-conversations.queries"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; -export default function ChatConversationTitleTags({ jobConversations }) { - const [removeJobConversation] = useMutation(REMOVE_CONVERSATION_TAG); +export default function ChatConversationTitleTags({jobConversations}) { + const [removeJobConversation] = useMutation(REMOVE_CONVERSATION_TAG); - const handleRemoveTag = (jobId) => { - const convId = jobConversations[0].conversationid; - if (!!convId) { - removeJobConversation({ - variables: { - conversationId: convId, - jobId: jobId, - }, - update(cache) { - cache.modify({ - id: cache.identify({ id: convId, __typename: "conversations" }), - fields: { - job_conversations(ex) { - return ex.filter((e) => e.jobid !== jobId); - }, - }, - }); - }, - }); - logImEXEvent("messaging_remove_job_tag", { - conversationId: convId, - jobId: jobId, - }); - } - }; + const handleRemoveTag = (jobId) => { + const convId = jobConversations[0].conversationid; + if (!!convId) { + removeJobConversation({ + variables: { + conversationId: convId, + jobId: jobId, + }, + update(cache) { + cache.modify({ + id: cache.identify({id: convId, __typename: "conversations"}), + fields: { + job_conversations(ex) { + return ex.filter((e) => e.jobid !== jobId); + }, + }, + }); + }, + }); + logImEXEvent("messaging_remove_job_tag", { + conversationId: convId, + jobId: jobId, + }); + } + }; - return ( -
- {jobConversations.map((item) => ( - handleRemoveTag(item.job.id)} - > - - {`${item.job.ro_number || "?"} | `} - - - - ))} -
- ); + return ( +
+ {jobConversations.map((item) => ( + handleRemoveTag(item.job.id)} + > + + {`${item.job.ro_number || "?"} | `} + + + + ))} +
+ ); } diff --git a/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx b/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx index 110ea2ea3..bdc1a35a3 100644 --- a/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx +++ b/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx @@ -1,4 +1,4 @@ -import { Space } from "antd"; +import {Space} from "antd"; import React from "react"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; import ChatArchiveButton from "../chat-archive-button/chat-archive-button.component"; @@ -7,21 +7,21 @@ import ChatLabelComponent from "../chat-label/chat-label.component"; import ChatPrintButton from "../chat-print-button/chat-print-button.component"; import ChatTagRoContainer from "../chat-tag-ro/chat-tag-ro.container"; -export default function ChatConversationTitle({ conversation }) { - return ( - - - {conversation && conversation.phone_num} - - - - - - - - ); +export default function ChatConversationTitle({conversation}) { + return ( + + + {conversation && conversation.phone_num} + + + + + + + + ); } diff --git a/client/src/components/chat-conversation/chat-conversation.component.jsx b/client/src/components/chat-conversation/chat-conversation.component.jsx index eddb943f8..7e11bef10 100644 --- a/client/src/components/chat-conversation/chat-conversation.component.jsx +++ b/client/src/components/chat-conversation/chat-conversation.component.jsx @@ -7,25 +7,25 @@ import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component.jsx" import "./chat-conversation.styles.scss"; export default function ChatConversationComponent({ - subState, - conversation, - messages, - handleMarkConversationAsRead, -}) { - const [loading, error] = subState; + subState, + conversation, + messages, + handleMarkConversationAsRead, + }) { + const [loading, error] = subState; - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - return ( -
- - - -
- ); + return ( +
+ + + +
+ ); } diff --git a/client/src/components/chat-conversation/chat-conversation.container.jsx b/client/src/components/chat-conversation/chat-conversation.container.jsx index 7461fde6e..d989fe514 100644 --- a/client/src/components/chat-conversation/chat-conversation.container.jsx +++ b/client/src/components/chat-conversation/chat-conversation.container.jsx @@ -1,89 +1,87 @@ -import { useMutation, useQuery, useSubscription } from "@apollo/client"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - CONVERSATION_SUBSCRIPTION_BY_PK, - GET_CONVERSATION_DETAILS, -} from "../../graphql/conversations.queries"; -import { MARK_MESSAGES_AS_READ_BY_CONVERSATION } from "../../graphql/messages.queries"; -import { selectSelectedConversation } from "../../redux/messaging/messaging.selectors"; +import {useMutation, useQuery, useSubscription} from "@apollo/client"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {CONVERSATION_SUBSCRIPTION_BY_PK, GET_CONVERSATION_DETAILS,} from "../../graphql/conversations.queries"; +import {MARK_MESSAGES_AS_READ_BY_CONVERSATION} from "../../graphql/messages.queries"; +import {selectSelectedConversation} from "../../redux/messaging/messaging.selectors"; import ChatConversationComponent from "./chat-conversation.component"; import axios from "axios"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - selectedConversation: selectSelectedConversation, - bodyshop: selectBodyshop, + selectedConversation: selectSelectedConversation, + bodyshop: selectBodyshop, }); export default connect(mapStateToProps, null)(ChatConversationContainer); -export function ChatConversationContainer({ bodyshop, selectedConversation }) { - const { - loading: convoLoading, - error: convoError, - data: convoData, - } = useQuery(GET_CONVERSATION_DETAILS, { - variables: { conversationId: selectedConversation }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +export function ChatConversationContainer({bodyshop, selectedConversation}) { + const { + loading: convoLoading, + error: convoError, + data: convoData, + } = useQuery(GET_CONVERSATION_DETAILS, { + variables: {conversationId: selectedConversation}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const { loading, error, data } = useSubscription( - CONVERSATION_SUBSCRIPTION_BY_PK, - { - variables: { conversationId: selectedConversation }, - } - ); + const {loading, error, data} = useSubscription( + CONVERSATION_SUBSCRIPTION_BY_PK, + { + variables: {conversationId: selectedConversation}, + } + ); - const [markingAsReadInProgress, setMarkingAsReadInProgress] = useState(false); + const [markingAsReadInProgress, setMarkingAsReadInProgress] = useState(false); - const [markConversationRead] = useMutation( - MARK_MESSAGES_AS_READ_BY_CONVERSATION, - { - variables: { conversationId: selectedConversation }, - refetchQueries: ["UNREAD_CONVERSATION_COUNT"], - update(cache) { - cache.modify({ - id: cache.identify({ - __typename: "conversations", - id: selectedConversation, - }), - fields: { - messages_aggregate(cached) { - return { aggregate: { count: 0 } }; + const [markConversationRead] = useMutation( + MARK_MESSAGES_AS_READ_BY_CONVERSATION, + { + variables: {conversationId: selectedConversation}, + refetchQueries: ["UNREAD_CONVERSATION_COUNT"], + update(cache) { + cache.modify({ + id: cache.identify({ + __typename: "conversations", + id: selectedConversation, + }), + fields: { + messages_aggregate(cached) { + return {aggregate: {count: 0}}; + }, + }, + }); }, - }, - }); - }, - } - ); + } + ); - const unreadCount = - data && - data.messages && - data.messages.reduce((acc, val) => { - return !val.read && !val.isoutbound ? acc + 1 : acc; - }, 0); + const unreadCount = + data && + data.messages && + data.messages.reduce((acc, val) => { + return !val.read && !val.isoutbound ? acc + 1 : acc; + }, 0); - const handleMarkConversationAsRead = async () => { - if (unreadCount > 0 && !!selectedConversation && !markingAsReadInProgress) { - setMarkingAsReadInProgress(true); - await markConversationRead({}); - await axios.post("/sms/markConversationRead", { - conversationid: selectedConversation, - imexshopid: bodyshop.imexshopid, - }); - setMarkingAsReadInProgress(false); - } - }; + const handleMarkConversationAsRead = async () => { + if (unreadCount > 0 && !!selectedConversation && !markingAsReadInProgress) { + setMarkingAsReadInProgress(true); + await markConversationRead({}); + await axios.post("/sms/markConversationRead", { + conversationid: selectedConversation, + imexshopid: bodyshop.imexshopid, + }); + setMarkingAsReadInProgress(false); + } + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/chat-label/chat-label.component.jsx b/client/src/components/chat-label/chat-label.component.jsx index 6a9b51a7f..95cb1af4f 100644 --- a/client/src/components/chat-label/chat-label.component.jsx +++ b/client/src/components/chat-label/chat-label.component.jsx @@ -1,67 +1,68 @@ -import { PlusOutlined } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Input, notification, Spin, Tag, Tooltip } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_CONVERSATION_LABEL } from "../../graphql/conversations.queries"; -export default function ChatLabel({ conversation }) { - const [loading, setLoading] = useState(false); - const [editing, setEditing] = useState(false); - const [value, setValue] = useState(conversation.label); +import {PlusOutlined} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Input, notification, Spin, Tag, Tooltip} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_CONVERSATION_LABEL} from "../../graphql/conversations.queries"; - const { t } = useTranslation(); - const [updateLabel] = useMutation(UPDATE_CONVERSATION_LABEL); +export default function ChatLabel({conversation}) { + const [loading, setLoading] = useState(false); + const [editing, setEditing] = useState(false); + const [value, setValue] = useState(conversation.label); - const handleSave = async () => { - setLoading(true); - try { - const response = await updateLabel({ - variables: { id: conversation.id, label: value }, - }); - if (response.errors) { - notification["error"]({ - message: t("messages.errors.updatinglabel", { - error: JSON.stringify(response.errors), - }), - }); - } else { - setEditing(false); - } - } catch (error) { - notification["error"]({ - message: t("messages.errors.updatinglabel", { - error: JSON.stringify(error), - }), - }); - } finally { - setLoading(false); + const {t} = useTranslation(); + const [updateLabel] = useMutation(UPDATE_CONVERSATION_LABEL); + + const handleSave = async () => { + setLoading(true); + try { + const response = await updateLabel({ + variables: {id: conversation.id, label: value}, + }); + if (response.errors) { + notification["error"]({ + message: t("messages.errors.updatinglabel", { + error: JSON.stringify(response.errors), + }), + }); + } else { + setEditing(false); + } + } catch (error) { + notification["error"]({ + message: t("messages.errors.updatinglabel", { + error: JSON.stringify(error), + }), + }); + } finally { + setLoading(false); + } + }; + if (editing) { + return ( +
+ setValue(e.target.value)} + onBlur={handleSave} + allowClear + /> + {loading && } +
+ ); + } else { + return conversation.label && conversation.label.trim() !== "" ? ( + setEditing(true)}> + {conversation.label} + + ) : ( + + setEditing(true)} + /> + + ); } - }; - if (editing) { - return ( -
- setValue(e.target.value)} - onBlur={handleSave} - allowClear - /> - {loading && } -
- ); - } else { - return conversation.label && conversation.label.trim() !== "" ? ( - setEditing(true)}> - {conversation.label} - - ) : ( - - setEditing(true)} - /> - - ); - } } diff --git a/client/src/components/chat-media-selector/chat-media-selector.component.jsx b/client/src/components/chat-media-selector/chat-media-selector.component.jsx index eea2824de..c2f32883f 100644 --- a/client/src/components/chat-media-selector/chat-media-selector.component.jsx +++ b/client/src/components/chat-media-selector/chat-media-selector.component.jsx @@ -1,99 +1,100 @@ -import { PictureFilled } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Badge, Popover } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {PictureFilled} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Badge, Popover} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {GET_DOCUMENTS_BY_JOB} from "../../graphql/documents.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component"; -import JobDocumentsLocalGalleryExternal from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component"; +import JobDocumentsLocalGalleryExternal + from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ChatMediaSelector); export function ChatMediaSelector({ - bodyshop, - selectedMedia, - setSelectedMedia, - conversation, -}) { - const { t } = useTranslation(); - const [visible, setVisible] = useState(false); + bodyshop, + selectedMedia, + setSelectedMedia, + conversation, + }) { + const {t} = useTranslation(); + const [open, setOpen] = useState(false); - const { loading, error, data } = useQuery(GET_DOCUMENTS_BY_JOB, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - jobId: - conversation.job_conversations[0] && - conversation.job_conversations[0].jobid, - }, + const {loading, error, data} = useQuery(GET_DOCUMENTS_BY_JOB, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + jobId: + conversation.job_conversations[0] && + conversation.job_conversations[0].jobid, + }, - skip: - !visible || - !conversation.job_conversations || - conversation.job_conversations.length === 0, - }); + skip: + !open || + !conversation.job_conversations || + conversation.job_conversations.length === 0, + }); - const handleVisibleChange = (visible) => { - setVisible(visible); - }; + const handleVisibleChange = (change) => { + setOpen(change); + }; - useEffect(() => { - setSelectedMedia([]); - }, [setSelectedMedia, conversation]); + useEffect(() => { + setSelectedMedia([]); + }, [setSelectedMedia, conversation]); - const content = ( -
- {loading && } - {error && } - {selectedMedia.filter((s) => s.isSelected).length >= 10 ? ( -
{t("messaging.labels.maxtenimages")}
- ) : null} - {!bodyshop.uselocalmediaserver && data && ( - - )} - {bodyshop.uselocalmediaserver && visible && ( - - )} -
- ); + const content = ( +
+ {loading && } + {error && } + {selectedMedia.filter((s) => s.isSelected).length >= 10 ? ( +
{t("messaging.labels.maxtenimages")}
+ ) : null} + {!bodyshop.uselocalmediaserver && data && ( + + )} + {bodyshop.uselocalmediaserver && open && ( + + )} +
+ ); - return ( - {t("messaging.errors.noattachedjobs")} - ) : ( - content - ) - } - title={t("messaging.labels.selectmedia")} - trigger="click" - visible={visible} - onVisibleChange={handleVisibleChange} - > - s.isSelected).length}> - - - - ); + return ( + {t("messaging.errors.noattachedjobs")} + ) : ( + content + ) + } + title={t("messaging.labels.selectmedia")} + trigger="click" + open={open} + onOpenChange={handleVisibleChange} + > + s.isSelected).length}> + + + + ); } diff --git a/client/src/components/chat-messages-list/chat-message-list.component.jsx b/client/src/components/chat-messages-list/chat-message-list.component.jsx index d6460a89d..e32580900 100644 --- a/client/src/components/chat-messages-list/chat-message-list.component.jsx +++ b/client/src/components/chat-messages-list/chat-message-list.component.jsx @@ -1,118 +1,113 @@ import Icon from "@ant-design/icons"; -import { Tooltip } from "antd"; +import {Tooltip} from "antd"; import i18n from "i18next"; -import moment from "moment"; -import React, { useEffect, useRef } from "react"; -import { MdDone, MdDoneAll } from "react-icons/md"; -import { - AutoSizer, - CellMeasurer, - CellMeasurerCache, - List, -} from "react-virtualized"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import dayjs from "../../utils/day"; +import React, {useEffect, useRef} from "react"; +import {MdDone, MdDoneAll} from "react-icons/md"; +import {AutoSizer, CellMeasurer, CellMeasurerCache, List,} from "react-virtualized"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import "./chat-message-list.styles.scss"; -export default function ChatMessageListComponent({ messages }) { - const virtualizedListRef = useRef(null); +export default function ChatMessageListComponent({messages}) { + const virtualizedListRef = useRef(null); - const _cache = new CellMeasurerCache({ - fixedWidth: true, - // minHeight: 50, - defaultHeight: 100, - }); + const _cache = new CellMeasurerCache({ + fixedWidth: true, + // minHeight: 50, + defaultHeight: 100, + }); - const scrollToBottom = (renderedrows) => { - //console.log("Scrolling to", messages.length); - // !!virtualizedListRef.current && - // virtualizedListRef.current.scrollToRow(messages.length); - // Outstanding isue on virtualization: https://github.com/bvaughn/react-virtualized/issues/1179 - //Scrolling does not work on this version of React. - }; + const scrollToBottom = (renderedrows) => { + //console.log("Scrolling to", messages.length); + // !!virtualizedListRef.current && + // virtualizedListRef.current.scrollToRow(messages.length); + // Outstanding isue on virtualization: https://github.com/bvaughn/react-virtualized/issues/1179 + //Scrolling does not work on this version of React. + }; - useEffect(scrollToBottom, [messages]); + useEffect(scrollToBottom, [messages]); + + const _rowRenderer = ({index, key, parent, style}) => { + return ( + + {({measure, registerChild}) => ( +
+
+ {MessageRender(messages[index])} + {StatusRender(messages[index].status)} +
+ {messages[index].isoutbound && ( +
+ {i18n.t("messaging.labels.sentby", { + by: messages[index].userid, + time: dayjs(messages[index].created_at).format( + "MM/DD/YYYY @ hh:mm a" + ), + })} +
+ )} +
+ )} +
+ ); + }; - const _rowRenderer = ({ index, key, parent, style }) => { return ( - - {({ measure, registerChild }) => ( -
-
- {MessageRender(messages[index])} - {StatusRender(messages[index].status)} -
- {messages[index].isoutbound && ( -
- {i18n.t("messaging.labels.sentby", { - by: messages[index].userid, - time: moment(messages[index].created_at).format( - "MM/DD/YYYY @ hh:mm a" - ), - })} -
- )} -
- )} -
+
+ + {({height, width}) => ( + + )} + +
); - }; - - return ( -
- - {({ height, width }) => ( - - )} - -
- ); } const MessageRender = (message) => { - return ( - -
- {message.image_path && - message.image_path.map((i, idx) => ( -
- - Received - + return ( + +
+ {message.image_path && + message.image_path.map((i, idx) => ( +
+ + Received + +
+ ))} +
{message.text}
- ))} -
{message.text}
-
- - ); + + ); }; const StatusRender = (status) => { - switch (status) { - case "sent": - return ; - case "delivered": - return ; - default: - return null; - } + switch (status) { + case "sent": + return ; + case "delivered": + return ; + default: + return null; + } }; diff --git a/client/src/components/chat-messages-list/chat-message-list.styles.scss b/client/src/components/chat-messages-list/chat-message-list.styles.scss index 19cfe1451..d576fa7b6 100644 --- a/client/src/components/chat-messages-list/chat-message-list.styles.scss +++ b/client/src/components/chat-messages-list/chat-message-list.styles.scss @@ -44,6 +44,7 @@ .yours { align-items: flex-start; } + .msgmargin { margin-top: 0.1rem; margin-bottom: 0.1rem; @@ -66,6 +67,7 @@ background: #eee; border-bottom-right-radius: 15px; } + .yours .message.last:after { content: ""; position: absolute; diff --git a/client/src/components/chat-new-conversation/chat-new-conversation.component.jsx b/client/src/components/chat-new-conversation/chat-new-conversation.component.jsx index c5d641266..61480c310 100644 --- a/client/src/components/chat-new-conversation/chat-new-conversation.component.jsx +++ b/client/src/components/chat-new-conversation/chat-new-conversation.component.jsx @@ -1,57 +1,55 @@ -import { PlusCircleFilled } from "@ant-design/icons"; -import { Button, Form, Popover } from "antd"; +import {PlusCircleFilled} from "@ant-design/icons"; +import {Button, Form, Popover} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { openChatByPhone } from "../../redux/messaging/messaging.actions"; -import PhoneFormItem, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {openChatByPhone} from "../../redux/messaging/messaging.actions"; +import PhoneFormItem, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), }); -export function ChatNewConversation({ openChatByPhone }) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const handleFinish = (values) => { - openChatByPhone({ phone_num: values.phoneNumber }); - form.resetFields(); - }; +export function ChatNewConversation({openChatByPhone}) { + const {t} = useTranslation(); + const [form] = Form.useForm(); + const handleFinish = (values) => { + openChatByPhone({phone_num: values.phoneNumber}); + form.resetFields(); + }; - const popContent = ( -
-
- - PhoneItemFormatterValidation(getFieldValue, "phoneNumber"), - ]} - > - - - - -
- ); + const popContent = ( +
+
+ + PhoneItemFormatterValidation(getFieldValue, "phoneNumber"), + ]} + > + + + + +
+ ); - return ( - - - - ); + return ( + + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ChatNewConversation); diff --git a/client/src/components/chat-open-button/chat-open-button.component.jsx b/client/src/components/chat-open-button/chat-open-button.component.jsx index 71c037002..539c5ec36 100644 --- a/client/src/components/chat-open-button/chat-open-button.component.jsx +++ b/client/src/components/chat-open-button/chat-open-button.component.jsx @@ -1,52 +1,54 @@ -import { notification } from "antd"; +import {notification} from "antd"; import parsePhoneNumber from "libphonenumber-js"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { openChatByPhone } from "../../redux/messaging/messaging.actions"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {openChatByPhone} from "../../redux/messaging/messaging.actions"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { searchingForConversation } from "../../redux/messaging/messaging.selectors"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {searchingForConversation} from "../../redux/messaging/messaging.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - searchingForConversation: searchingForConversation, + bodyshop: selectBodyshop, + searchingForConversation: searchingForConversation, }); const mapDispatchToProps = (dispatch) => ({ - openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), }); export function ChatOpenButton({ - bodyshop, - searchingForConversation, - phone, - jobid, - openChatByPhone, -}) { - const { t } = useTranslation(); - if (!phone) return <>; + bodyshop, + searchingForConversation, + phone, + jobid, + openChatByPhone, + }) { + const {t} = useTranslation(); + if (!phone) return <>; - if (!bodyshop.messagingservicesid) - return {phone}; + if (!bodyshop.messagingservicesid) + return {phone}; - return ( - { - e.stopPropagation(); - const p = parsePhoneNumber(phone, "CA"); - if (searchingForConversation) return; //This is to prevent finding the same thing twice. - if (p && p.isValid()) { - openChatByPhone({ phone_num: p.formatInternational(), jobid: jobid }); - } else { - notification["error"]({ message: t("messaging.error.invalidphone") }); - } - }} - > - {phone} - - ); + return ( + { + e.stopPropagation(); + const p = parsePhoneNumber(phone, "CA"); + if (searchingForConversation) return; //This is to prevent finding the same thing twice. + if (p && p.isValid()) { + openChatByPhone({phone_num: p.formatInternational(), jobid: jobid}); + } else { + notification["error"]({message: t("messaging.error.invalidphone")}); + } + }} + > + {phone} + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ChatOpenButton); diff --git a/client/src/components/chat-popup/chat-popup.component.jsx b/client/src/components/chat-popup/chat-popup.component.jsx index 57ef96e4c..052193b1e 100644 --- a/client/src/components/chat-popup/chat-popup.component.jsx +++ b/client/src/components/chat-popup/chat-popup.component.jsx @@ -1,24 +1,13 @@ -import { - InfoCircleOutlined, - MessageOutlined, - ShrinkOutlined, - SyncOutlined, -} from "@ant-design/icons"; -import { useLazyQuery, useQuery } from "@apollo/client"; -import { Badge, Card, Col, Row, Space, Tag, Tooltip, Typography } from "antd"; -import React, { useCallback, useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - CONVERSATION_LIST_QUERY, - UNREAD_CONVERSATION_COUNT, -} from "../../graphql/conversations.queries"; -import { toggleChatVisible } from "../../redux/messaging/messaging.actions"; -import { - selectChatVisible, - selectSelectedConversation, -} from "../../redux/messaging/messaging.selectors"; +import {InfoCircleOutlined, MessageOutlined, ShrinkOutlined, SyncOutlined,} from "@ant-design/icons"; +import {useLazyQuery, useQuery} from "@apollo/client"; +import {Badge, Card, Col, Row, Space, Tag, Tooltip, Typography} from "antd"; +import React, {useCallback, useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {CONVERSATION_LIST_QUERY, UNREAD_CONVERSATION_COUNT,} from "../../graphql/conversations.queries"; +import {toggleChatVisible} from "../../redux/messaging/messaging.actions"; +import {selectChatVisible, selectSelectedConversation,} from "../../redux/messaging/messaging.selectors"; import ChatConversationListComponent from "../chat-conversation-list/chat-conversation-list.component"; import ChatConversationContainer from "../chat-conversation/chat-conversation.container"; import ChatNewConversation from "../chat-new-conversation/chat-new-conversation.component"; @@ -26,118 +15,119 @@ import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import "./chat-popup.styles.scss"; const mapStateToProps = createStructuredSelector({ - selectedConversation: selectSelectedConversation, - chatVisible: selectChatVisible, + selectedConversation: selectSelectedConversation, + chatVisible: selectChatVisible, }); const mapDispatchToProps = (dispatch) => ({ - toggleChatVisible: () => dispatch(toggleChatVisible()), + toggleChatVisible: () => dispatch(toggleChatVisible()), }); export function ChatPopupComponent({ - chatVisible, - selectedConversation, - toggleChatVisible, -}) { - const { t } = useTranslation(); - const [pollInterval, setpollInterval] = useState(0); + chatVisible, + selectedConversation, + toggleChatVisible, + }) { + const {t} = useTranslation(); + const [pollInterval, setpollInterval] = useState(0); - const { data: unreadData } = useQuery(UNREAD_CONVERSATION_COUNT, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - ...(pollInterval > 0 ? { pollInterval } : {}), - }); - - const [getConversations, { loading, data, refetch, fetchMore }] = - useLazyQuery(CONVERSATION_LIST_QUERY, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: !chatVisible, - ...(pollInterval > 0 ? { pollInterval } : {}), + const {data: unreadData} = useQuery(UNREAD_CONVERSATION_COUNT, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + ...(pollInterval > 0 ? {pollInterval} : {}), }); - const fcmToken = sessionStorage.getItem("fcmtoken"); + const [getConversations, {loading, data, refetch, fetchMore}] = + useLazyQuery(CONVERSATION_LIST_QUERY, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !chatVisible, + ...(pollInterval > 0 ? {pollInterval} : {}), + }); - useEffect(() => { - if (fcmToken) { - setpollInterval(0); - } else { - setpollInterval(60000); - } - }, [fcmToken]); + const fcmToken = sessionStorage.getItem("fcmtoken"); - useEffect(() => { - if (chatVisible) - getConversations({ - variables: { - offset: 0, - }, - }); - }, [chatVisible, getConversations]); + useEffect(() => { + if (fcmToken) { + setpollInterval(0); + } else { + setpollInterval(60000); + } + }, [fcmToken]); - const loadMoreConversations = useCallback(() => { - if (data) - fetchMore({ - variables: { - offset: data.conversations.length, - }, - }); - }, [data, fetchMore]); + useEffect(() => { + if (chatVisible) + getConversations({ + variables: { + offset: 0, + }, + }); + }, [chatVisible, getConversations]); - const unreadCount = unreadData?.messages_aggregate.aggregate.count || 0; + const loadMoreConversations = useCallback(() => { + if (data) + fetchMore({ + variables: { + offset: data.conversations.length, + }, + }); + }, [data, fetchMore]); - return ( - - - {chatVisible ? ( -
- - - {t("messaging.labels.messaging")} - - - - - - refetch()} - /> - {pollInterval > 0 && ( - {t("messaging.labels.nopush")} - )} - - toggleChatVisible()} - style={{ position: "absolute", right: ".5rem", top: ".5rem" }} - /> + const unreadCount = unreadData?.messages_aggregate.aggregate.count || 0; - -
- {loading ? ( - + return ( + + + {chatVisible ? ( +
+ + + {t("messaging.labels.messaging")} + + + + + + refetch()} + /> + {pollInterval > 0 && ( + {t("messaging.labels.nopush")} + )} + + toggleChatVisible()} + style={{position: "absolute", right: ".5rem", top: ".5rem"}} + /> + + +
+ {loading ? ( + + ) : ( + + )} + + + {selectedConversation ? : null} + + + ) : ( - +
toggleChatVisible()} + style={{cursor: "pointer"}} + > + + {t("messaging.labels.messaging")} +
)} - -
- {selectedConversation ? : null} - - - - ) : ( -
toggleChatVisible()} - style={{ cursor: "pointer" }} - > - - {t("messaging.labels.messaging")} -
- )} - - - ); + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ChatPopupComponent); diff --git a/client/src/components/chat-popup/chat-popup.styles.scss b/client/src/components/chat-popup/chat-popup.styles.scss index be9a5c0a7..04566dba1 100644 --- a/client/src/components/chat-popup/chat-popup.styles.scss +++ b/client/src/components/chat-popup/chat-popup.styles.scss @@ -13,6 +13,7 @@ height: 100%; } } + .chat-popup-info-icon { margin-right: 5px; } diff --git a/client/src/components/chat-presets/chat-presets.component.jsx b/client/src/components/chat-presets/chat-presets.component.jsx index 74e1a0dd6..5fee9c0fe 100644 --- a/client/src/components/chat-presets/chat-presets.component.jsx +++ b/client/src/components/chat-presets/chat-presets.component.jsx @@ -1,40 +1,38 @@ -import { PlusCircleOutlined } from "@ant-design/icons"; -import { Dropdown, Menu } from "antd"; +import {PlusCircleOutlined} from "@ant-design/icons"; +import {Dropdown} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setMessage } from "../../redux/messaging/messaging.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setMessage} from "../../redux/messaging/messaging.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) - setMessage: (message) => dispatch(setMessage(message)), + //setUserLanguage: language => dispatch(setUserLanguage(language)) + setMessage: (message) => dispatch(setMessage(message)), }); -export function ChatPresetsComponent({ bodyshop, setMessage, className }) { - const menu = ( - - {bodyshop.md_messaging_presets.map((i, idx) => ( - setMessage(i.text)} key={idx}> - {i.label} - - ))} - - ); +export function ChatPresetsComponent({bodyshop, setMessage, className}) { - return ( -
- - - -
- ); + const items = bodyshop.md_messaging_presets.map((i, idx) => ({ + key: idx, + label: (i.label), + onClick: () => setMessage(i.text), + })); + + return ( +
+ + + +
+ ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ChatPresetsComponent); diff --git a/client/src/components/chat-print-button/chat-print-button.component.jsx b/client/src/components/chat-print-button/chat-print-button.component.jsx index e1c214157..2e61c0002 100644 --- a/client/src/components/chat-print-button/chat-print-button.component.jsx +++ b/client/src/components/chat-print-button/chat-print-button.component.jsx @@ -1,59 +1,46 @@ -import { MailOutlined, PrinterOutlined } from "@ant-design/icons"; -import { Space, Spin } from "antd"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {MailOutlined, PrinterOutlined} from "@ant-design/icons"; +import {Space, Spin} from "antd"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({ - setEmailOptions: (e) => dispatch(setEmailOptions(e)), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), }); -export function ChatPrintButton({ conversation }) { - const [loading, setLoading] = useState(false); +export function ChatPrintButton({conversation}) { + const [loading, setLoading] = useState(false); - return ( - - { - setLoading(true); - GenerateDocument( + const generateDocument = (type) => { + setLoading(true); + GenerateDocument( { - name: TemplateList("messaging").conversation_list.key, - variables: { id: conversation.id }, + name: TemplateList("messaging").conversation_list.key, + variables: {id: conversation.id}, }, { - subject: TemplateList("messaging").conversation_list.subject, + subject: TemplateList("messaging").conversation_list.subject, }, - "p", + type, conversation.id - ); - setLoading(false); - }} - /> - { - setLoading(true); - GenerateDocument( - { - name: TemplateList("messaging").conversation_list.key, - variables: { id: conversation.id }, - }, - { - subject: TemplateList("messaging").conversation_list.subject, - }, - "e", - conversation.id - ); - setLoading(false); - }} - /> - {loading && } - - ); + ).catch(e => { + console.warn('Something went wrong generating a document.'); + }); + setLoading(false); + } + + return ( + + generateDocument('p')}/> + generateDocument('e')}/> + {loading && } + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ChatPrintButton); diff --git a/client/src/components/chat-send-message/chat-send-message.component.jsx b/client/src/components/chat-send-message/chat-send-message.component.jsx index 6eac70ca2..cae683876 100644 --- a/client/src/components/chat-send-message/chat-send-message.component.jsx +++ b/client/src/components/chat-send-message/chat-send-message.component.jsx @@ -1,116 +1,111 @@ -import { LoadingOutlined, SendOutlined } from "@ant-design/icons"; -import { Input, Spin } from "antd"; -import React, { useEffect, useRef, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - sendMessage, - setMessage, -} from "../../redux/messaging/messaging.actions"; -import { - selectIsSending, - selectMessage, -} from "../../redux/messaging/messaging.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {LoadingOutlined, SendOutlined} from "@ant-design/icons"; +import {Input, Spin} from "antd"; +import React, {useEffect, useRef, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {sendMessage, setMessage,} from "../../redux/messaging/messaging.actions"; +import {selectIsSending, selectMessage,} from "../../redux/messaging/messaging.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ChatMediaSelector from "../chat-media-selector/chat-media-selector.component"; import ChatPresetsComponent from "../chat-presets/chat-presets.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - isSending: selectIsSending, - message: selectMessage, + bodyshop: selectBodyshop, + isSending: selectIsSending, + message: selectMessage, }); const mapDispatchToProps = (dispatch) => ({ - sendMessage: (message) => dispatch(sendMessage(message)), - setMessage: (message) => dispatch(setMessage(message)), + sendMessage: (message) => dispatch(sendMessage(message)), + setMessage: (message) => dispatch(setMessage(message)), }); function ChatSendMessageComponent({ - conversation, - bodyshop, - sendMessage, - isSending, - message, - setMessage, -}) { - const inputArea = useRef(null); - const [selectedMedia, setSelectedMedia] = useState([]); - useEffect(() => { - inputArea.current.focus(); - }, [isSending, setMessage]); + conversation, + bodyshop, + sendMessage, + isSending, + message, + setMessage, + }) { + const inputArea = useRef(null); + const [selectedMedia, setSelectedMedia] = useState([]); + useEffect(() => { + inputArea.current.focus(); + }, [isSending, setMessage]); - const { t } = useTranslation(); + const {t} = useTranslation(); - const handleEnter = () => { - const selectedImages = selectedMedia.filter((i) => i.isSelected); - if ((message === "" || !message) && selectedImages.length === 0) return; - logImEXEvent("messaging_send_message"); + const handleEnter = () => { + const selectedImages = selectedMedia.filter((i) => i.isSelected); + if ((message === "" || !message) && selectedImages.length === 0) return; + logImEXEvent("messaging_send_message"); - if (selectedImages.length < 11) { - sendMessage({ - to: conversation.phone_num, - body: message || "", - messagingServiceSid: bodyshop.messagingservicesid, - conversationid: conversation.id, - selectedMedia: selectedImages, - imexshopid: bodyshop.imexshopid, - }); - setSelectedMedia( - selectedMedia.map((i) => { - return { ...i, isSelected: false }; - }) - ); - } - }; + if (selectedImages.length < 11) { + sendMessage({ + to: conversation.phone_num, + body: message || "", + messagingServiceSid: bodyshop.messagingservicesid, + conversationid: conversation.id, + selectedMedia: selectedImages, + imexshopid: bodyshop.imexshopid, + }); + setSelectedMedia( + selectedMedia.map((i) => { + return {...i, isSelected: false}; + }) + ); + } + }; - return ( -
- - - + return ( +
+ + + setMessage(e.target.value)} - onPressEnter={(event) => { - event.preventDefault(); - if (!!!event.shiftKey) handleEnter(); - }} + className="imex-flex-row__margin imex-flex-row__grow" + allowClear + autoFocus + ref={inputArea} + autoSize={{minRows: 1, maxRows: 4}} + value={message} + disabled={isSending} + placeholder={t("messaging.labels.typeamessage")} + onChange={(e) => setMessage(e.target.value)} + onPressEnter={(event) => { + event.preventDefault(); + if (!!!event.shiftKey) handleEnter(); + }} /> - - - } - /> -
- ); + + + } + /> +
+ ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ChatSendMessageComponent); diff --git a/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx index ad9f64e02..004b28a3c 100644 --- a/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx +++ b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx @@ -1,45 +1,45 @@ -import { CloseCircleOutlined, LoadingOutlined } from "@ant-design/icons"; -import { Empty, Select, Space } from "antd"; +import {CloseCircleOutlined, LoadingOutlined} from "@ant-design/icons"; +import {Empty, Select, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; +import {useTranslation} from "react-i18next"; +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; export default function ChatTagRoComponent({ - roOptions, - loading, - handleSearch, - handleInsertTag, - setVisible, -}) { - const { t } = useTranslation(); + roOptions, + loading, + handleSearch, + handleInsertTag, + setOpen, + }) { + const {t} = useTranslation(); - return ( - -
- -
- {loading ? : null} + return ( + +
+ +
+ {loading ? : null} - {loading ? ( - - ) : ( - setVisible(false)} /> - )} -
- ); + {loading ? ( + + ) : ( + setOpen(false)}/> + )} +
+ ); } diff --git a/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx b/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx index ebd9ac148..f2ea134f0 100644 --- a/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx +++ b/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx @@ -1,66 +1,66 @@ -import { PlusOutlined } from "@ant-design/icons"; -import { useLazyQuery, useMutation } from "@apollo/client"; -import { Tag } from "antd"; +import {PlusOutlined} from "@ant-design/icons"; +import {useLazyQuery, useMutation} from "@apollo/client"; +import {Tag} from "antd"; import _ from "lodash"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_CONVERSATION_TAG } from "../../graphql/job-conversations.queries"; -import { SEARCH_FOR_JOBS } from "../../graphql/jobs.queries"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_CONVERSATION_TAG} from "../../graphql/job-conversations.queries"; +import {SEARCH_FOR_JOBS} from "../../graphql/jobs.queries"; import ChatTagRo from "./chat-tag-ro.component"; -export default function ChatTagRoContainer({ conversation }) { - const { t } = useTranslation(); - const [visible, setVisible] = useState(false); +export default function ChatTagRoContainer({conversation}) { + const {t} = useTranslation(); + const [open, setOpen] = useState(false); - const [loadRo, { loading, data }] = useLazyQuery(SEARCH_FOR_JOBS); + const [loadRo, {loading, data}] = useLazyQuery(SEARCH_FOR_JOBS); - const executeSearch = (v) => { - logImEXEvent("messaging_search_job_tag", { searchTerm: v }); - loadRo(v); - }; + const executeSearch = (v) => { + logImEXEvent("messaging_search_job_tag", {searchTerm: v}); + loadRo(v); + }; - const debouncedExecuteSearch = _.debounce(executeSearch, 500); + const debouncedExecuteSearch = _.debounce(executeSearch, 500); - const handleSearch = (value) => { - debouncedExecuteSearch({ variables: { search: value } }); - }; + const handleSearch = (value) => { + debouncedExecuteSearch({variables: {search: value}}); + }; - const [insertTag] = useMutation(INSERT_CONVERSATION_TAG, { - variables: { conversationId: conversation.id }, - }); + const [insertTag] = useMutation(INSERT_CONVERSATION_TAG, { + variables: {conversationId: conversation.id}, + }); - const handleInsertTag = (value, option) => { - logImEXEvent("messaging_add_job_tag"); - insertTag({ variables: { jobId: option.key } }); - setVisible(false); - }; + const handleInsertTag = (value, option) => { + logImEXEvent("messaging_add_job_tag"); + insertTag({variables: {jobId: option.key}}); + setOpen(false); + }; - const existingJobTags = - conversation && - conversation.job_conversations && - conversation.job_conversations.map((i) => i.jobid); + const existingJobTags = + conversation && + conversation.job_conversations && + conversation.job_conversations.map((i) => i.jobid); - const roOptions = data - ? data.search_jobs.filter((job) => !existingJobTags.includes(job.id)) - : []; + const roOptions = data + ? data.search_jobs.filter((job) => !existingJobTags.includes(job.id)) + : []; - return ( -
- {visible ? ( - - ) : ( - setVisible(true)}> - - {t("messaging.actions.link")} - - )} -
- ); + return ( +
+ {open ? ( + + ) : ( + setOpen(true)}> + + {t("messaging.actions.link")} + + )} +
+ ); } diff --git a/client/src/components/config-form-components/checkbox/checkbox.component.jsx b/client/src/components/config-form-components/checkbox/checkbox.component.jsx index cfc8896c3..f3945268d 100644 --- a/client/src/components/config-form-components/checkbox/checkbox.component.jsx +++ b/client/src/components/config-form-components/checkbox/checkbox.component.jsx @@ -1,22 +1,22 @@ -import { Checkbox, Form } from "antd"; +import {Checkbox, Form} from "antd"; import React from "react"; -export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { - const { name, label, required } = formItem; +export default function JobIntakeFormCheckboxComponent({formItem, readOnly}) { + const {name, label, required} = formItem; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/config-form-components/config-form-components.component.jsx b/client/src/components/config-form-components/config-form-components.component.jsx index abcd6a6b5..c2b513052 100644 --- a/client/src/components/config-form-components/config-form-components.component.jsx +++ b/client/src/components/config-form-components/config-form-components.component.jsx @@ -1,18 +1,18 @@ import React from "react"; import FormTypes from "./config-form-types"; -export default function ConfirmFormComponents({ componentList, readOnly }) { - return ( -
- {componentList.map((f, idx) => { - const Comp = FormTypes[f.type]; +export default function ConfirmFormComponents({componentList, readOnly}) { + return ( +
+ {componentList.map((f, idx) => { + const Comp = FormTypes[f.type]; - if (!!Comp) { - return ; - } else { - return
Error
; - } - })} -
- ); + if (!!Comp) { + return ; + } else { + return
Error
; + } + })} +
+ ); } diff --git a/client/src/components/config-form-components/config-form-types.js b/client/src/components/config-form-components/config-form-types.js index c156f7f2d..fa2121ef8 100644 --- a/client/src/components/config-form-components/config-form-types.js +++ b/client/src/components/config-form-components/config-form-types.js @@ -3,12 +3,13 @@ import Rate from "./rate/rate.component"; import Slider from "./slider/slider.component"; import Text from "./text/text.component"; import Textarea from "./textarea/textarea.component"; + const e = { - checkbox: CheckboxFormItem, - slider: Slider, - text: Text, - textarea: Textarea, - rate: Rate, + checkbox: CheckboxFormItem, + slider: Slider, + text: Text, + textarea: Textarea, + rate: Rate, }; export default e; diff --git a/client/src/components/config-form-components/rate/rate.component.jsx b/client/src/components/config-form-components/rate/rate.component.jsx index ae6a2e5c1..2e144b7be 100644 --- a/client/src/components/config-form-components/rate/rate.component.jsx +++ b/client/src/components/config-form-components/rate/rate.component.jsx @@ -1,21 +1,21 @@ -import { Form, Rate } from "antd"; +import {Form, Rate} from "antd"; import React from "react"; -export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { - const { name, label, required } = formItem; +export default function JobIntakeFormCheckboxComponent({formItem, readOnly}) { + const {name, label, required} = formItem; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/config-form-components/slider/slider.component.jsx b/client/src/components/config-form-components/slider/slider.component.jsx index ba5a665e5..0d8da40f7 100644 --- a/client/src/components/config-form-components/slider/slider.component.jsx +++ b/client/src/components/config-form-components/slider/slider.component.jsx @@ -1,21 +1,21 @@ -import { Form, Slider } from "antd"; +import {Form, Slider} from "antd"; import React from "react"; -export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { - const { name, label, required, min, max } = formItem; +export default function JobIntakeFormCheckboxComponent({formItem, readOnly}) { + const {name, label, required, min, max} = formItem; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/config-form-components/text/text.component.jsx b/client/src/components/config-form-components/text/text.component.jsx index 981576b31..9364e1c5d 100644 --- a/client/src/components/config-form-components/text/text.component.jsx +++ b/client/src/components/config-form-components/text/text.component.jsx @@ -1,20 +1,20 @@ -import { Form, Input } from "antd"; +import {Form, Input} from "antd"; import React from "react"; -export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { - const { name, label, required } = formItem; - return ( - - - - ); +export default function JobIntakeFormCheckboxComponent({formItem, readOnly}) { + const {name, label, required} = formItem; + return ( + + + + ); } diff --git a/client/src/components/config-form-components/textarea/textarea.component.jsx b/client/src/components/config-form-components/textarea/textarea.component.jsx index 7ff783543..f707e4298 100644 --- a/client/src/components/config-form-components/textarea/textarea.component.jsx +++ b/client/src/components/config-form-components/textarea/textarea.component.jsx @@ -1,21 +1,21 @@ -import { Form, Input } from "antd"; +import {Form, Input} from "antd"; import React from "react"; -export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { - const { name, label, required, rows } = formItem; +export default function JobIntakeFormCheckboxComponent({formItem, readOnly}) { + const {name, label, required, rows} = formItem; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/conflict/conflict.component.jsx b/client/src/components/conflict/conflict.component.jsx index efac77288..0e5b1d541 100644 --- a/client/src/components/conflict/conflict.component.jsx +++ b/client/src/components/conflict/conflict.component.jsx @@ -1,27 +1,27 @@ import React from "react"; -import { Result, Button } from "antd"; -import { useTranslation } from "react-i18next"; +import {Button, Result} from "antd"; +import {useTranslation} from "react-i18next"; export default function ConflictComponent() { - const { t } = useTranslation(); - return ( -
- -
{t("general.labels.instanceconflictext")}
- -
- } - /> - - ); + const {t} = useTranslation(); + return ( +
+ +
{t("general.labels.instanceconflictext")}
+ +
+ } + /> + + ); } diff --git a/client/src/components/contract-cars/contract-cars.component.jsx b/client/src/components/contract-cars/contract-cars.component.jsx index 6162ae7af..9868b0ad9 100644 --- a/client/src/components/contract-cars/contract-cars.component.jsx +++ b/client/src/components/contract-cars/contract-cars.component.jsx @@ -1,152 +1,152 @@ -import { Card, Input, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../utils/sorters"; +import {Card, Input, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../utils/sorters"; export default function ContractsCarsComponent({ - loading, - data, - selectedCarId, - handleSelect, -}) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - search: "", - }); + loading, + data, + selectedCarId, + handleSelect, + }) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + search: "", + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("courtesycars.fields.fleetnumber"), - dataIndex: "fleetnumber", - key: "fleetnumber", - sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), - sortOrder: - state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) =>
{t(record.status)}
, - }, - { - title: t("courtesycars.fields.readiness"), - dataIndex: "readiness", - key: "readiness", - sorter: (a, b) => alphaSort(a.readiness, b.readiness), - sortOrder: - state.sortedInfo.columnKey === "readiness" && state.sortedInfo.order, - render: (text, record) => t(record.readiness), - }, - { - title: t("courtesycars.fields.year"), - dataIndex: "year", - key: "year", - sorter: (a, b) => alphaSort(a.year, b.year), - sortOrder: - state.sortedInfo.columnKey === "year" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.make"), - dataIndex: "make", - key: "make", - sorter: (a, b) => alphaSort(a.make, b.make), - sortOrder: - state.sortedInfo.columnKey === "make" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.model"), - dataIndex: "model", - key: "model", - sorter: (a, b) => alphaSort(a.model, b.model), - sortOrder: - state.sortedInfo.columnKey === "model" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.color"), - dataIndex: "color", - key: "color", - sorter: (a, b) => alphaSort(a.color, b.color), - sortOrder: - state.sortedInfo.columnKey === "color" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.plate"), - dataIndex: "plate", - key: "plate", - sorter: (a, b) => alphaSort(a.plate, b.plate), - sortOrder: - state.sortedInfo.columnKey === "plate" && state.sortedInfo.order, - }, - ]; + const columns = [ + { + title: t("courtesycars.fields.fleetnumber"), + dataIndex: "fleetnumber", + key: "fleetnumber", + sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), + sortOrder: + state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) =>
{t(record.status)}
, + }, + { + title: t("courtesycars.fields.readiness"), + dataIndex: "readiness", + key: "readiness", + sorter: (a, b) => alphaSort(a.readiness, b.readiness), + sortOrder: + state.sortedInfo.columnKey === "readiness" && state.sortedInfo.order, + render: (text, record) => t(record.readiness), + }, + { + title: t("courtesycars.fields.year"), + dataIndex: "year", + key: "year", + sorter: (a, b) => alphaSort(a.year, b.year), + sortOrder: + state.sortedInfo.columnKey === "year" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.make"), + dataIndex: "make", + key: "make", + sorter: (a, b) => alphaSort(a.make, b.make), + sortOrder: + state.sortedInfo.columnKey === "make" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.model"), + dataIndex: "model", + key: "model", + sorter: (a, b) => alphaSort(a.model, b.model), + sortOrder: + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.color"), + dataIndex: "color", + key: "color", + sorter: (a, b) => alphaSort(a.color, b.color), + sortOrder: + state.sortedInfo.columnKey === "color" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.plate"), + dataIndex: "plate", + key: "plate", + sorter: (a, b) => alphaSort(a.plate, b.plate), + sortOrder: + state.sortedInfo.columnKey === "plate" && state.sortedInfo.order, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const filteredData = - state.search === "" - ? data - : data.filter( - (cc) => - (cc.fleetnumber || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (cc.status || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (cc.year || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (cc.make || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (cc.model || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (cc.color || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (cc.plate || "").toLowerCase().includes(state.search.toLowerCase()) - ); + const filteredData = + state.search === "" + ? data + : data.filter( + (cc) => + (cc.fleetnumber || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (cc.status || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (cc.year || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (cc.make || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (cc.model || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (cc.color || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (cc.plate || "").toLowerCase().includes(state.search.toLowerCase()) + ); - return ( - setState({ ...state, search: e.target.value })} - /> - } - > -
{ - return { - onClick: (event) => { - handleSelect(record); - }, - }; - }} - /> - - ); + return ( + setState({...state, search: e.target.value})} + /> + } + > +
{ + return { + onClick: (event) => { + handleSelect(record); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/contract-cars/contract-cars.container.jsx b/client/src/components/contract-cars/contract-cars.container.jsx index bc1421c27..9d5f23355 100644 --- a/client/src/components/contract-cars/contract-cars.container.jsx +++ b/client/src/components/contract-cars/contract-cars.container.jsx @@ -1,37 +1,37 @@ -import { useQuery } from "@apollo/client"; -import moment from "moment"; +import {useQuery} from "@apollo/client"; +import dayjs from "../../utils/day"; import React from "react"; -import { QUERY_AVAILABLE_CC } from "../../graphql/courtesy-car.queries"; +import {QUERY_AVAILABLE_CC} from "../../graphql/courtesy-car.queries"; import AlertComponent from "../alert/alert.component"; import ContractCarsComponent from "./contract-cars.component"; -export default function ContractCarsContainer({ selectedCarState, form }) { - const { loading, error, data } = useQuery(QUERY_AVAILABLE_CC, { - variables: { today: moment().format("YYYY-MM-DD") }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const [selectedCar, setSelectedCar] = selectedCarState; - - const handleSelect = (record) => { - setSelectedCar(record); - - form.setFieldsValue({ - kmstart: record.mileage, - dailyrate: record.dailycost, - fuelout: record.fuel, - damage: record.damage, +export default function ContractCarsContainer({selectedCarState, form}) { + const {loading, error, data} = useQuery(QUERY_AVAILABLE_CC, { + variables: {today: dayjs().format("YYYY-MM-DD")}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - }; - if (error) return ; - return ( - - ); + const [selectedCar, setSelectedCar] = selectedCarState; + + const handleSelect = (record) => { + setSelectedCar(record); + + form.setFieldsValue({ + kmstart: record.mileage, + dailyrate: record.dailycost, + fuelout: record.fuel, + damage: record.damage, + }); + }; + + if (error) return ; + return ( + + ); } diff --git a/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx b/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx index eec385fca..b267d0dc6 100644 --- a/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx +++ b/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx @@ -1,408 +1,397 @@ -import { useMutation } from "@apollo/client"; -import { - Button, - Form, - InputNumber, - notification, - Popover, - Radio, - Select, - Space, -} from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, Form, InputNumber, notification, Popover, Radio, Select, Space,} from "antd"; import axios from "axios"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { INSERT_NEW_JOB } from "../../graphql/jobs.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {INSERT_NEW_JOB} from "../../graphql/jobs.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function ContractConvertToRo({ - bodyshop, - currentUser, - contract, - disabled, -}) { - const { t } = useTranslation(); - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [insertJob] = useMutation(INSERT_NEW_JOB); - const history = useHistory(); + bodyshop, + currentUser, + contract, + disabled, + }) { + const {t} = useTranslation(); + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); + const [insertJob] = useMutation(INSERT_NEW_JOB); + const history = useNavigate(); - const handleFinish = async (values) => { - setLoading(true); + const handleFinish = async (values) => { + setLoading(true); - const contractLength = moment(contract.actualreturn).diff( - moment(contract.start), - "days" - ); - const billingLines = []; - if (contractLength > 0) - billingLines.push({ - manual_line: true, - unq_seq: 1, - line_no: 1, - line_ref: 1, - line_desc: t("contracts.fields.dailyrate"), - db_price: contract.dailyrate, - act_price: contract.dailyrate, - part_qty: contractLength, - part_type: "CCDR", - tax_part: true, - mod_lb_hrs: 0, - db_ref: "io-ccdr", - // mod_lbr_ty: "PAL", - }); - const mileageDiff = - contract.kmend - contract.kmstart - contract.dailyfreekm * contractLength; - if (mileageDiff > 0) { - billingLines.push({ - manual_line: true, - unq_seq: 2, - line_no: 2, - line_ref: 2, - line_desc: "Fuel Surcharge", - db_price: contract.excesskmrate, - act_price: contract.excesskmrate, - part_type: "CCM", - part_qty: mileageDiff, - tax_part: true, - db_ref: "io-ccm", - mod_lb_hrs: 0, - }); - } + const contractLength = dayjs(contract.actualreturn).diff( + dayjs(contract.start), + "day" + ); + const billingLines = []; + if (contractLength > 0) + billingLines.push({ + manual_line: true, + unq_seq: 1, + line_no: 1, + line_ref: 1, + line_desc: t("contracts.fields.dailyrate"), + db_price: contract.dailyrate, + act_price: contract.dailyrate, + part_qty: contractLength, + part_type: "CCDR", + tax_part: true, + mod_lb_hrs: 0, + db_ref: "io-ccdr", + // mod_lbr_ty: "PAL", + }); + const mileageDiff = + contract.kmend - contract.kmstart - contract.dailyfreekm * contractLength; + if (mileageDiff > 0) { + billingLines.push({ + manual_line: true, + unq_seq: 2, + line_no: 2, + line_ref: 2, + line_desc: "Fuel Surcharge", + db_price: contract.excesskmrate, + act_price: contract.excesskmrate, + part_type: "CCM", + part_qty: mileageDiff, + tax_part: true, + db_ref: "io-ccm", + mod_lb_hrs: 0, + }); + } - if (values.refuelqty > 0) { - billingLines.push({ - manual_line: true, - unq_seq: 3, - line_no: 3, - line_ref: 3, - line_desc: t("contracts.fields.refuelcharge"), - db_price: contract.refuelcharge, - act_price: contract.refuelcharge, - part_qty: values.refuelqty, - part_type: "CCF", - tax_part: true, - db_ref: "io-ccf", - mod_lb_hrs: 0, - }); - } - if (values.applyCleanupCharge) { - billingLines.push({ - manual_line: true, - unq_seq: 4, - line_no: 4, - line_ref: 4, - line_desc: t("contracts.fields.cleanupcharge"), - db_price: contract.cleanupcharge, - act_price: contract.cleanupcharge, - part_qty: 1, - part_type: "CCC", - tax_part: true, - db_ref: "io-ccc", - mod_lb_hrs: 0, - }); - } - if (contract.damagewaiver) { - //Add for cleanup fee. - billingLines.push({ - manual_line: true, - unq_seq: 5, - line_no: 5, - line_ref: 5, - line_desc: t("contracts.fields.damagewaiver"), - db_price: contract.damagewaiver, - act_price: contract.damagewaiver, - part_type: "CCD", - part_qty: 1, - tax_part: true, - db_ref: "io-ccd", - mod_lb_hrs: 0, - }); - } + if (values.refuelqty > 0) { + billingLines.push({ + manual_line: true, + unq_seq: 3, + line_no: 3, + line_ref: 3, + line_desc: t("contracts.fields.refuelcharge"), + db_price: contract.refuelcharge, + act_price: contract.refuelcharge, + part_qty: values.refuelqty, + part_type: "CCF", + tax_part: true, + db_ref: "io-ccf", + mod_lb_hrs: 0, + }); + } + if (values.applyCleanupCharge) { + billingLines.push({ + manual_line: true, + unq_seq: 4, + line_no: 4, + line_ref: 4, + line_desc: t("contracts.fields.cleanupcharge"), + db_price: contract.cleanupcharge, + act_price: contract.cleanupcharge, + part_qty: 1, + part_type: "CCC", + tax_part: true, + db_ref: "io-ccc", + mod_lb_hrs: 0, + }); + } + if (contract.damagewaiver) { + //Add for cleanup fee. + billingLines.push({ + manual_line: true, + unq_seq: 5, + line_no: 5, + line_ref: 5, + line_desc: t("contracts.fields.damagewaiver"), + db_price: contract.damagewaiver, + act_price: contract.damagewaiver, + part_type: "CCD", + part_qty: 1, + tax_part: true, + db_ref: "io-ccd", + mod_lb_hrs: 0, + }); + } - const newJob = { - // converted: true, - shopid: bodyshop.id, - ownerid: contract.job.ownerid, - vehicleid: contract.job.vehicleid, - federal_tax_rate: bodyshop.bill_tax_rates.federal_tax_rate / 100, - state_tax_rate: bodyshop.bill_tax_rates.state_tax_rate / 100, - local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate / 100, - ins_co_nm: values.ins_co_nm, - class: values.class, - converted: true, - clm_no: contract.job.clm_no ? `${contract.job.clm_no}-CC` : null, - ownr_fn: contract.job.owner.ownr_fn, - ownr_ln: contract.job.owner.ownr_ln, - ownr_co_nm: contract.job.owner.ownr_co_nm, - ownr_ph1: contract.job.owner.ownr_ph1, - ownr_ea: contract.job.owner.ownr_ea, - v_model_desc: contract.job.vehicle && contract.job.vehicle.v_model_desc, - v_model_yr: contract.job.vehicle && contract.job.vehicle.v_model_yr, - v_make_desc: contract.job.vehicle && contract.job.vehicle.v_make_desc, - v_vin: contract.job.vehicle && contract.job.vehicle.v_vin, - status: bodyshop.md_ro_statuses.default_completed, - notes: { - data: [ - { - text: t("contracts.labels.noteconvertedfrom", { - agreementnumber: contract.agreementnumber, - }), - audit: true, - created_by: currentUser.email, - }, - ], - }, - joblines: { - data: billingLines, - }, - parts_tax_rates: { - PAA: { - prt_type: "PAA", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - PAC: { - prt_type: "PAC", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - PAL: { - prt_type: "PAL", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - PAM: { - prt_type: "PAM", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - PAN: { - prt_type: "PAN", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - PAR: { - prt_type: "PAR", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - PAS: { - prt_type: "PAS", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - CCDR: { - prt_type: "CCDR", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - CCF: { - prt_type: "CCF", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - CCM: { - prt_type: "CCM", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - CCC: { - prt_type: "CCC", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - CCD: { - prt_type: "CCD", - prt_discp: 0, - prt_mktyp: false, - prt_mkupp: 0, - prt_tax_in: true, - prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - }, - }, + const newJob = { + // converted: true, + shopid: bodyshop.id, + ownerid: contract.job.ownerid, + vehicleid: contract.job.vehicleid, + federal_tax_rate: bodyshop.bill_tax_rates.federal_tax_rate / 100, + state_tax_rate: bodyshop.bill_tax_rates.state_tax_rate / 100, + local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate / 100, + ins_co_nm: values.ins_co_nm, + class: values.class, + converted: true, + clm_no: contract.job.clm_no ? `${contract.job.clm_no}-CC` : null, + ownr_fn: contract.job.owner.ownr_fn, + ownr_ln: contract.job.owner.ownr_ln, + ownr_co_nm: contract.job.owner.ownr_co_nm, + ownr_ph1: contract.job.owner.ownr_ph1, + ownr_ea: contract.job.owner.ownr_ea, + v_model_desc: contract.job.vehicle && contract.job.vehicle.v_model_desc, + v_model_yr: contract.job.vehicle && contract.job.vehicle.v_model_yr, + v_make_desc: contract.job.vehicle && contract.job.vehicle.v_make_desc, + v_vin: contract.job.vehicle && contract.job.vehicle.v_vin, + status: bodyshop.md_ro_statuses.default_completed, + notes: { + data: [ + { + text: t("contracts.labels.noteconvertedfrom", { + agreementnumber: contract.agreementnumber, + }), + audit: true, + created_by: currentUser.email, + }, + ], + }, + joblines: { + data: billingLines, + }, + parts_tax_rates: { + PAA: { + prt_type: "PAA", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + PAC: { + prt_type: "PAC", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + PAL: { + prt_type: "PAL", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + PAM: { + prt_type: "PAM", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + PAN: { + prt_type: "PAN", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + PAR: { + prt_type: "PAR", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + PAS: { + prt_type: "PAS", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + CCDR: { + prt_type: "CCDR", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + CCF: { + prt_type: "CCF", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + CCM: { + prt_type: "CCM", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + CCC: { + prt_type: "CCC", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + CCD: { + prt_type: "CCD", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + }, + }, + }; + + //Calcualte the new job totals. + + const newTotals = ( + await axios.post("/job/totals", { + job: {...newJob, joblines: billingLines}, + }) + ).data; + + newJob.clm_total = newTotals.totals.total_repairs.amount / 100; + newJob.job_totals = newTotals; + + const result = await insertJob({ + variables: {job: [newJob]}, + // refetchQueries: ["GET_JOB_BY_PK"], + // awaitRefetchQueries: true, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.inserting", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("jobs.successes.created"), + onClick: () => { + history.push( + `/manage/jobs/${result.data.insert_jobs.returning[0].id}` + ); + }, + }); + } + + setOpen(false); + setLoading(false); }; - //Calcualte the new job totals. + const popContent = ( +
+
+ + + + + + + + + {t("general.labels.yes")} + {t("general.labels.no")} + + + + + + + + + + +
+ ); - const newTotals = ( - await axios.post("/job/totals", { - job: { ...newJob, joblines: billingLines }, - }) - ).data; - - newJob.clm_total = newTotals.totals.total_repairs.amount / 100; - newJob.job_totals = newTotals; - - const result = await insertJob({ - variables: { job: [newJob] }, - // refetchQueries: ["GET_JOB_BY_PK"], - // awaitRefetchQueries: true, - }); - - if (!!result.errors) { - notification["error"]({ - message: t("jobs.errors.inserting", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("jobs.successes.created"), - onClick: () => { - history.push( - `/manage/jobs/${result.data.insert_jobs.returning[0].id}` - ); - }, - }); - } - - setVisible(false); - setLoading(false); - }; - - const popContent = ( -
-
- - - - - - - - - {t("general.labels.yes")} - {t("general.labels.no")} - - - - - - - - - - -
- ); - - return ( -
- - - -
- ); + return ( +
+ + + +
+ ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ContractConvertToRo); diff --git a/client/src/components/contract-courtesy-car-block/contract-courtesy-car-block.component.jsx b/client/src/components/contract-courtesy-car-block/contract-courtesy-car-block.component.jsx index 4c251405d..d95e1b52e 100644 --- a/client/src/components/contract-courtesy-car-block/contract-courtesy-car-block.component.jsx +++ b/client/src/components/contract-courtesy-car-block/contract-courtesy-car-block.component.jsx @@ -1,32 +1,32 @@ -import { Card } from "antd"; +import {Card} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import DataLabel from "../data-label/data-label.component"; -export default function ContractCourtesyCarBlock({ courtesyCar }) { - const { t } = useTranslation(); - return ( - - -
- - {(courtesyCar && courtesyCar.fleetnumber) || ""} - - - {(courtesyCar && courtesyCar.plate) || ""} - - - {`${(courtesyCar && courtesyCar.year) || ""} ${ - (courtesyCar && courtesyCar.make) || "" - } ${(courtesyCar && courtesyCar.model) || ""}`} - -
-
- - ); +export default function ContractCourtesyCarBlock({courtesyCar}) { + const {t} = useTranslation(); + return ( + + +
+ + {(courtesyCar && courtesyCar.fleetnumber) || ""} + + + {(courtesyCar && courtesyCar.plate) || ""} + + + {`${(courtesyCar && courtesyCar.year) || ""} ${ + (courtesyCar && courtesyCar.make) || "" + } ${(courtesyCar && courtesyCar.model) || ""}`} + +
+
+ + ); } diff --git a/client/src/components/contract-form/contract-form-job-prefill.component.jsx b/client/src/components/contract-form/contract-form-job-prefill.component.jsx index 8760aef57..639ba21b4 100644 --- a/client/src/components/contract-form/contract-form-job-prefill.component.jsx +++ b/client/src/components/contract-form/contract-form-job-prefill.component.jsx @@ -1,44 +1,45 @@ -import { useLazyQuery } from "@apollo/client"; -import { Button, notification } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { GET_JOB_FOR_CC_CONTRACT } from "../../graphql/jobs.queries"; -export default function ContractCreateJobPrefillComponent({ jobId, form }) { - const [call, { loading, error, data }] = useLazyQuery( - GET_JOB_FOR_CC_CONTRACT - ); - const { t } = useTranslation(); +import {useLazyQuery} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {GET_JOB_FOR_CC_CONTRACT} from "../../graphql/jobs.queries"; - const handleClick = () => { - call({ variables: { id: jobId } }); - }; +export default function ContractCreateJobPrefillComponent({jobId, form}) { + const [call, {loading, error, data}] = useLazyQuery( + GET_JOB_FOR_CC_CONTRACT + ); + const {t} = useTranslation(); - useEffect(() => { - if (data) { - form.setFieldsValue({ - driver_dlst: data.jobs_by_pk.ownr_ast, - driver_fn: data.jobs_by_pk.ownr_fn, - driver_ln: data.jobs_by_pk.ownr_ln, - driver_addr1: data.jobs_by_pk.ownr_addr1, - driver_state: data.jobs_by_pk.ownr_st, - driver_city: data.jobs_by_pk.ownr_city, - driver_zip: data.jobs_by_pk.ownr_zip, - driver_ph1: data.jobs_by_pk.ownr_ph1, - }); + const handleClick = () => { + call({variables: {id: jobId}}); + }; + + useEffect(() => { + if (data) { + form.setFieldsValue({ + driver_dlst: data.jobs_by_pk.ownr_ast, + driver_fn: data.jobs_by_pk.ownr_fn, + driver_ln: data.jobs_by_pk.ownr_ln, + driver_addr1: data.jobs_by_pk.ownr_addr1, + driver_state: data.jobs_by_pk.ownr_st, + driver_city: data.jobs_by_pk.ownr_city, + driver_zip: data.jobs_by_pk.ownr_zip, + driver_ph1: data.jobs_by_pk.ownr_ph1, + }); + } + }, [data, form]); + + if (error) { + notification["error"]({ + message: t("contracts.errors.fetchingjobinfo", { + error: JSON.stringify(error), + }), + }); } - }, [data, form]); - if (error) { - notification["error"]({ - message: t("contracts.errors.fetchingjobinfo", { - error: JSON.stringify(error), - }), - }); - } - - return ( - - ); + return ( + + ); } diff --git a/client/src/components/contract-form/contract-form.component.jsx b/client/src/components/contract-form/contract-form.component.jsx index f41933625..8dbf991cd 100644 --- a/client/src/components/contract-form/contract-form.component.jsx +++ b/client/src/components/contract-form/contract-form.component.jsx @@ -1,9 +1,9 @@ -import { WarningFilled } from "@ant-design/icons"; -import { Form, Input, InputNumber, Space } from "antd"; -import moment from "moment"; +import {WarningFilled} from "@ant-design/icons"; +import {Form, Input, InputNumber, Space} from "antd"; +import dayjs from "../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; +import {DateFormatter} from "../../utils/DateFormatter"; //import ContractLicenseDecodeButton from "../contract-license-decode-button/contract-license-decode-button.component"; import ContractStatusSelector from "../contract-status-select/contract-status-select.component"; import ContractsRatesChangeButton from "../contracts-rates-change-button/contracts-rates-change-button.component"; @@ -11,339 +11,337 @@ import CourtesyCarFuelSlider from "../courtesy-car-fuel-select/courtesy-car-fuel import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormDateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; -import InputPhone, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import InputPhone, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import ContractFormJobPrefill from "./contract-form-job-prefill.component"; export default function ContractFormComponent({ - form, - create = false, - selectedJobState, - selectedCar, -}) { - const { t } = useTranslation(); - return ( -
- - - {create ? null : ( - - - - )} - - - - - - - {create ? null : ( - - - - )} - - - - - - {create && ( - - p.kmstart !== c.kmstart || p.scheduledreturn !== c.scheduledreturn - } - > - {() => { - const mileageOver = - selectedCar && - selectedCar.nextservicekm <= form.getFieldValue("kmstart"); + form, + create = false, + selectedJobState, + selectedCar, + }) { + const {t} = useTranslation(); + return ( +
+ + + {create ? null : ( + + + + )} + + + + + + + {create ? null : ( + + + + )} + + + + + + {create && ( + + p.kmstart !== c.kmstart || p.scheduledreturn !== c.scheduledreturn + } + > + {() => { + const mileageOver = + selectedCar && + selectedCar.nextservicekm <= form.getFieldValue("kmstart"); - const dueForService = - selectedCar && - selectedCar.nextservicedate && - moment(selectedCar.nextservicedate).isBefore( - moment(form.getFieldValue("scheduledreturn")) - ); + const dueForService = + selectedCar && + selectedCar.nextservicedate && + dayjs(selectedCar.nextservicedate).isBefore( + dayjs(form.getFieldValue("scheduledreturn")) + ); - if (mileageOver || dueForService) - return ( - + if (mileageOver || dueForService) + return ( + - - {t("contracts.labels.cardueforservice")} + + {t("contracts.labels.cardueforservice")} - {`${ - selectedCar && selectedCar.nextservicekm - } km`} - + {`${ + selectedCar && selectedCar.nextservicekm + } km`} + {selectedCar && selectedCar.nextservicedate} - - ); + + ); - return <>; - }} - - )} - {create ? null : ( - - - - )} - - - - - - - - - {create ? null : ( - - - - )} - -
- - {selectedJobState && ( -
- -
- )} - { - // - } -
-
- - - - - - p.driver_dlexpiry !== c.driver_dlexpiry || - p.scheduledreturn !== c.scheduledreturn - } - > - {() => { - const dlExpiresBeforeReturn = moment( - form.getFieldValue("driver_dlexpiry") - ).isBefore(moment(form.getFieldValue("scheduledreturn"))); - - return ( -
- - - - {dlExpiresBeforeReturn && ( - - - {t("contracts.labels.dlexpirebeforereturn")} - + return <>; + }} + )} -
- ); - }} -
+ {create ? null : ( + + + + )} + + + +
+ + + + + {create ? null : ( + + + + )} + +
+ + {selectedJobState && ( +
+ +
+ )} + { + // + } +
+
+ + + + + + p.driver_dlexpiry !== c.driver_dlexpiry || + p.scheduledreturn !== c.scheduledreturn + } + > + {() => { + const dlExpiresBeforeReturn = dayjs( + form.getFieldValue("driver_dlexpiry") + ).isBefore(dayjs(form.getFieldValue("scheduledreturn"))); - - - - - - - - - - - - - - - - - - - - - - - - - - PhoneItemFormatterValidation(getFieldValue, "driver_ph1"), - ]} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ); + return ( +
+ + + + {dlExpiresBeforeReturn && ( + + + {t("contracts.labels.dlexpirebeforereturn")} + + )} +
+ ); + }} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + PhoneItemFormatterValidation(getFieldValue, "driver_ph1"), + ]} + > + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); } diff --git a/client/src/components/contract-job-block/contract-job-block.component.jsx b/client/src/components/contract-job-block/contract-job-block.component.jsx index b0ee45401..e0d6af75b 100644 --- a/client/src/components/contract-job-block/contract-job-block.component.jsx +++ b/client/src/components/contract-job-block/contract-job-block.component.jsx @@ -1,32 +1,33 @@ -import { Card } from "antd"; +import {Card} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import DataLabel from "../data-label/data-label.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; -export default function ContractJobBlock({ job }) { - const { t } = useTranslation(); - return ( - - -
- - {(job && job.ro_number) || ""} - - - {`${(job && job.v_model_yr) || ""} ${ - (job && job.v_make_desc) || "" - } ${(job && job.v_model_desc) || ""}`} - - - - -
-
- - ); + +export default function ContractJobBlock({job}) { + const {t} = useTranslation(); + return ( + + +
+ + {(job && job.ro_number) || ""} + + + {`${(job && job.v_model_yr) || ""} ${ + (job && job.v_make_desc) || "" + } ${(job && job.v_model_desc) || ""}`} + + + + +
+
+ + ); } diff --git a/client/src/components/contract-jobs/contract-jobs.component.jsx b/client/src/components/contract-jobs/contract-jobs.component.jsx index d84dd8e2a..84dfd6d4e 100644 --- a/client/src/components/contract-jobs/contract-jobs.component.jsx +++ b/client/src/components/contract-jobs/contract-jobs.component.jsx @@ -1,201 +1,201 @@ -import { Card, Input, Table } from "antd"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../utils/sorters"; +import {Card, Input, Table} from "antd"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../utils/sorters"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import {pageLimit} from "../../utils/config"; export default function ContractsJobsComponent({ - loading, - data, - selectedJob, - handleSelect, -}) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - search: "", - }); + loading, + data, + selectedJob, + handleSelect, + }) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + search: "", + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - width: "8%", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + width: "8%", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => ( - + render: (text, record) => ( + {record.ro_number ? record.ro_number : t("general.labels.na")} - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - width: "25%", - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - render: (text, record) => , - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - width: "10%", - ellipsis: true, - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => { - return record.status || t("general.labels.na"); - }, - }, + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + width: "25%", + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => , + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + width: "10%", + ellipsis: true, + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) => { + return record.status || t("general.labels.na"); + }, + }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - width: "15%", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + width: "15%", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" + record.v_model_desc || "" }`} - ) : ( - t("jobs.errors.novehicle") - ); - }, - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate_no", - key: "plate_no", - width: "8%", - ellipsis: true, - sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), - sortOrder: - state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, - render: (text, record) => { - return record.plate_no ? ( - {record.plate_no} - ) : ( - t("general.labels.unknown") - ); - }, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - width: "12%", - ellipsis: true, - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - render: (text, record) => { - return record.clm_no ? ( - {record.clm_no} - ) : ( - t("general.labels.unknown") - ); - }, - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const filteredData = - state.search === "" - ? data - : data.filter( - (j) => - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.ownr_co_nm || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.clm_no || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(state.search.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(state.search.toLowerCase()) - ); - - const defaultCurrent = useMemo(() => { - const page = - Math.floor( - (filteredData.findIndex((v) => v.id === selectedJob) || 0) / 10 - ) + 1; - if (page === 0) return 1; - return page; - }, [filteredData, selectedJob]); - - if (loading) return ; - return ( - setState({ ...state, search: e.target.value })} - /> - } - > -
{ - return { - onClick: (event) => { - handleSelect(record); + ) : ( + t("jobs.errors.novehicle") + ); }, - }; - }} - /> - - ); + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + width: "8%", + ellipsis: true, + sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), + sortOrder: + state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, + render: (text, record) => { + return record.plate_no ? ( + {record.plate_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + width: "12%", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + render: (text, record) => { + return record.clm_no ? ( + {record.clm_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + const filteredData = + state.search === "" + ? data + : data.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.clm_no || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(state.search.toLowerCase()) + ); + + const defaultCurrent = useMemo(() => { + const page = + Math.floor( + (filteredData.findIndex((v) => v.id === selectedJob) || 0) / 10 + ) + 1; + if (page === 0) return 1; + return page; + }, [filteredData, selectedJob]); + + if (loading) return ; + return ( + setState({...state, search: e.target.value})} + /> + } + > +
{ + return { + onClick: (event) => { + handleSelect(record); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/contract-jobs/contract-jobs.container.jsx b/client/src/components/contract-jobs/contract-jobs.container.jsx index 56bfe5a9d..926d89330 100644 --- a/client/src/components/contract-jobs/contract-jobs.container.jsx +++ b/client/src/components/contract-jobs/contract-jobs.container.jsx @@ -1,39 +1,41 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ALL_ACTIVE_JOBS} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import ContractJobsComponent from "./contract-jobs.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); -export function ContractJobsContainer({ selectedJobState, bodyshop }) { - const { loading, error, data } = useQuery(QUERY_ALL_ACTIVE_JOBS, { - variables: { - statuses: bodyshop.md_ro_statuses.active_statuses || ["Open"], - isConverted: true, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const [selectedJob, setSelectedJob] = selectedJobState; - const handleSelect = (record) => { - setSelectedJob(record.id); - }; +export function ContractJobsContainer({selectedJobState, bodyshop}) { + const {loading, error, data} = useQuery(QUERY_ALL_ACTIVE_JOBS, { + variables: { + statuses: bodyshop.md_ro_statuses.active_statuses || ["Open"], + isConverted: true, + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const [selectedJob, setSelectedJob] = selectedJobState; - if (error) return ; - return ( - - ); + const handleSelect = (record) => { + setSelectedJob(record.id); + }; + + if (error) return ; + return ( + + ); } + export default connect(mapStateToProps, null)(ContractJobsContainer); diff --git a/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx b/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx index 90e7fbaa4..49da3a5b2 100644 --- a/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx +++ b/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx @@ -1,123 +1,123 @@ -import { Button, Input, Modal, Typography } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Button, Input, Modal, Typography} from "antd"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import aamva from "../../utils/aamva"; import DataLabel from "../data-label/data-label.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -export default function ContractLicenseDecodeButton({ form }) { - const { t } = useTranslation(); - const [modalVisible, setModalVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [decodedBarcode, setDecodedBarcode] = useState(null); +export default function ContractLicenseDecodeButton({form}) { + const {t} = useTranslation(); + const [modalVisible, setModalVisible] = useState(false); + const [loading, setLoading] = useState(false); + const [decodedBarcode, setDecodedBarcode] = useState(null); - const handleDecode = (e) => { - logImEXEvent("contract_license_decode"); - setLoading(true); - const aamvaParse = aamva.parse(e.currentTarget.value); - setDecodedBarcode(aamvaParse); - setLoading(false); - }; - - const handleInsertForm = () => { - logImEXEvent("contract_license_decode_fill_form"); - - const values = { - driver_dlnumber: decodedBarcode.dl, - driver_dlexpiry: moment( - `20${decodedBarcode.expiration_date}${moment( - decodedBarcode.birthday - ).format("DD")}` - ), - driver_dlst: decodedBarcode.state, - driver_fn: decodedBarcode.name.first, - driver_ln: decodedBarcode.name.last, - driver_addr1: decodedBarcode.address, - driver_city: decodedBarcode.city, - driver_state: decodedBarcode.state, - driver_zip: decodedBarcode.postal_code, - driver_dob: moment(decodedBarcode.birthday), + const handleDecode = (e) => { + logImEXEvent("contract_license_decode"); + setLoading(true); + const aamvaParse = aamva.parse(e.currentTarget.value); + setDecodedBarcode(aamvaParse); + setLoading(false); }; - form.setFieldsValue(values); - setModalVisible(false); - setDecodedBarcode(null); - }; - const handleClick = () => { - setModalVisible(true); - }; - const handleCancel = () => { - setModalVisible(false); - }; + const handleInsertForm = () => { + logImEXEvent("contract_license_decode_fill_form"); - return ( -
- + const values = { + driver_dlnumber: decodedBarcode.dl, + driver_dlexpiry: dayjs( + `20${decodedBarcode.expiration_date}${dayjs( + decodedBarcode.birthday + ).format("DD")}` + ), + driver_dlst: decodedBarcode.state, + driver_fn: decodedBarcode.name.first, + driver_ln: decodedBarcode.name.last, + driver_addr1: decodedBarcode.address, + driver_city: decodedBarcode.city, + driver_state: decodedBarcode.state, + driver_zip: decodedBarcode.postal_code, + driver_dob: dayjs(decodedBarcode.birthday), + }; + + form.setFieldsValue(values); + setModalVisible(false); + setDecodedBarcode(null); + }; + const handleClick = () => { + setModalVisible(true); + }; + const handleCancel = () => { + setModalVisible(false); + }; + + return (
-
- { - if (!loading) setLoading(true); - }} - onPressEnter={handleDecode} - /> -
- - {decodedBarcode ? ( -
- - {decodedBarcode.state} - - - {decodedBarcode.dl} - - - {decodedBarcode.name.first} - - - {decodedBarcode.name.last} - - - {decodedBarcode.address} - - - {decodedBarcode.address} - - - {moment( - `20${decodedBarcode.expiration_date}${moment( - decodedBarcode.birthday - ).format("DD")}` - ).format("MM/DD/YYYY")} - - - {moment(decodedBarcode.birthday).format("MM/DD/YYYY")} - +
- - {t("contracts.labels.correctdataonform")} - +
+ { + if (!loading) setLoading(true); + }} + onPressEnter={handleDecode} + /> +
+ + {decodedBarcode ? ( +
+ + {decodedBarcode.state} + + + {decodedBarcode.dl} + + + {decodedBarcode.name.first} + + + {decodedBarcode.name.last} + + + {decodedBarcode.address} + + + {decodedBarcode.address} + + + {dayjs( + `20${decodedBarcode.expiration_date}${dayjs( + decodedBarcode.birthday + ).format("DD")}` + ).format("MM/DD/YYYY")} + + + {dayjs(decodedBarcode.birthday).format("MM/DD/YYYY")} + +
+ + {t("contracts.labels.correctdataonform")} + +
+
+ ) : ( +
{t("contracts.labels.waitingforscan")}
+ )} +
-
- ) : ( -
{t("contracts.labels.waitingforscan")}
- )} -
+ +
-
- -
- ); + ); } diff --git a/client/src/components/contract-status-select/contract-status-select.component.jsx b/client/src/components/contract-status-select/contract-status-select.component.jsx index 609326542..72a8a2e5c 100644 --- a/client/src/components/contract-status-select/contract-status-select.component.jsx +++ b/client/src/components/contract-status-select/contract-status-select.component.jsx @@ -1,32 +1,33 @@ -import React, { useState, useEffect, forwardRef } from "react"; -import { Select } from "antd"; -import { useTranslation } from "react-i18next"; -const { Option } = Select; +import React, {forwardRef, useEffect, useState} from "react"; +import {Select} from "antd"; +import {useTranslation} from "react-i18next"; -const ContractStatusComponent = ({ value, onChange }, ref) => { - const [option, setOption] = useState(value); - const { t } = useTranslation(); +const {Option} = Select; - useEffect(() => { - if (value !== option && onChange) { - onChange(option); - } - }, [value, option, onChange]); +const ContractStatusComponent = ({value, onChange}, ref) => { + const [option, setOption] = useState(value); + const {t} = useTranslation(); - return ( - - ); + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + return ( + + ); }; export default forwardRef(ContractStatusComponent); diff --git a/client/src/components/contracts-find-modal/contracts-find-modal.component.jsx b/client/src/components/contracts-find-modal/contracts-find-modal.component.jsx index 83a87b39a..4bd08369a 100644 --- a/client/src/components/contracts-find-modal/contracts-find-modal.component.jsx +++ b/client/src/components/contracts-find-modal/contracts-find-modal.component.jsx @@ -1,37 +1,37 @@ -import { Form, Input } from "antd"; +import {Form, Input} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export default connect(mapStateToProps, null)(PartsReceiveModalComponent); -export function PartsReceiveModalComponent({ bodyshop, form }) { - const { t } = useTranslation(); +export function PartsReceiveModalComponent({bodyshop, form}) { + const {t} = useTranslation(); - return ( -
- - - - - - -
- ); + return ( +
+ + + + + + +
+ ); } diff --git a/client/src/components/contracts-find-modal/contracts-find-modal.container.jsx b/client/src/components/contracts-find-modal/contracts-find-modal.container.jsx index a450d5845..e7398f6a3 100644 --- a/client/src/components/contracts-find-modal/contracts-find-modal.container.jsx +++ b/client/src/components/contracts-find-modal/contracts-find-modal.container.jsx @@ -1,169 +1,169 @@ -import { useLazyQuery } from "@apollo/client"; -import { Button, Form, Modal, Table } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { FIND_CONTRACT } from "../../graphql/cccontracts.queries"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectContractFinder } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useLazyQuery} from "@apollo/client"; +import {Button, Form, Modal, Table} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {FIND_CONTRACT} from "../../graphql/cccontracts.queries"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectContractFinder} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import ContractsFindModalComponent from "./contracts-find-modal.component"; import AlertComponent from "../alert/alert.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - contractFinderModal: selectContractFinder, + bodyshop: selectBodyshop, + contractFinderModal: selectContractFinder, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("contractFinder")), + toggleModalVisible: () => dispatch(toggleModalVisible("contractFinder")), }); export function ContractsFindModalContainer({ - contractFinderModal, - toggleModalVisible, + contractFinderModal, + toggleModalVisible, - bodyshop, -}) { - const { t } = useTranslation(); + bodyshop, + }) { + const {t} = useTranslation(); - const { visible } = contractFinderModal; + const {open} = contractFinderModal; - const [form] = Form.useForm(); + const [form] = Form.useForm(); - // const [updateJobLines] = useMutation(UPDATE_JOB_LINE); - const [callSearch, { loading, error, data }] = useLazyQuery(FIND_CONTRACT); - const handleFinish = async (values) => { - logImEXEvent("contract_finder_search"); + // const [updateJobLines] = useMutation(UPDATE_JOB_LINE); + const [callSearch, {loading, error, data}] = useLazyQuery(FIND_CONTRACT); + const handleFinish = async (values) => { + logImEXEvent("contract_finder_search"); - //Execute contract find + //Execute contract find - callSearch({ - variables: { - plate: - (values.plate && values.plate !== "" && values.plate) || undefined, - time: values.time, - }, - }); - }; - - useEffect(() => { - if (visible) { - form.resetFields(); - } - }, [visible, form]); - - return ( - toggleModalVisible()} - onOk={() => toggleModalVisible()} - destroyOnClose - forceRender - > -
- - - {error && ( - - )} -
( - - {record.agreementnumber || ""} - - ), + callSearch({ + variables: { + plate: + (values.plate && values.plate !== "" && values.plate) || undefined, + time: values.time, }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "job.ro_number", - key: "job.ro_number", - render: (text, record) => ( - - {record.job.ro_number || ""} - - ), - }, - { - title: t("contracts.fields.driver"), - dataIndex: "driver_ln", - key: "driver_ln", - render: (text, record) => - `${record.driver_fn || ""} ${record.driver_ln || ""}`, - }, - { - title: t("contracts.labels.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - render: (text, record) => ( - {`${ - record.courtesycar.year - } ${record.courtesycar.make} ${record.courtesycar.model} ${ - record.courtesycar.plate - ? `(${record.courtesycar.plate})` - : "" - }`} - ), - }, - { - title: t("contracts.fields.status"), - dataIndex: "status", - render: (text, record) => t(record.status), - }, - { - title: t("contracts.fields.start"), - dataIndex: "start", - key: "start", - render: (text, record) => ( - {record.start} - ), - }, - { - title: t("contracts.fields.scheduledreturn"), - dataIndex: "scheduledreturn", - key: "scheduledreturn", - render: (text, record) => ( - {record.scheduledreturn} - ), - }, - { - title: t("contracts.fields.actualreturn"), - dataIndex: "actualreturn", - key: "actualreturn", - render: (text, record) => ( - {record.actualreturn} - ), - }, - ]} - rowKey="id" - dataSource={data && data.cccontracts} - /> - - - ); + }); + }; + + useEffect(() => { + if (open) { + form.resetFields(); + } + }, [open, form]); + + return ( + toggleModalVisible()} + onOk={() => toggleModalVisible()} + destroyOnClose + forceRender + > +
+ + + {error && ( + + )} +
( + + {record.agreementnumber || ""} + + ), + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "job.ro_number", + key: "job.ro_number", + render: (text, record) => ( + + {record.job.ro_number || ""} + + ), + }, + { + title: t("contracts.fields.driver"), + dataIndex: "driver_ln", + key: "driver_ln", + render: (text, record) => + `${record.driver_fn || ""} ${record.driver_ln || ""}`, + }, + { + title: t("contracts.labels.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + render: (text, record) => ( + {`${ + record.courtesycar.year + } ${record.courtesycar.make} ${record.courtesycar.model} ${ + record.courtesycar.plate + ? `(${record.courtesycar.plate})` + : "" + }`} + ), + }, + { + title: t("contracts.fields.status"), + dataIndex: "status", + render: (text, record) => t(record.status), + }, + { + title: t("contracts.fields.start"), + dataIndex: "start", + key: "start", + render: (text, record) => ( + {record.start} + ), + }, + { + title: t("contracts.fields.scheduledreturn"), + dataIndex: "scheduledreturn", + key: "scheduledreturn", + render: (text, record) => ( + {record.scheduledreturn} + ), + }, + { + title: t("contracts.fields.actualreturn"), + dataIndex: "actualreturn", + key: "actualreturn", + render: (text, record) => ( + {record.actualreturn} + ), + }, + ]} + rowKey="id" + dataSource={data && data.cccontracts} + /> + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ContractsFindModalContainer); diff --git a/client/src/components/contracts-list/contracts-list.component.jsx b/client/src/components/contracts-list/contracts-list.component.jsx index cd25e1e9a..4cd2a8a38 100644 --- a/client/src/components/contracts-list/contracts-list.component.jsx +++ b/client/src/components/contracts-list/contracts-list.component.jsx @@ -1,224 +1,224 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; -import { alphaSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import {alphaSort} from "../../utils/sorters"; import ContractsFindModalContainer from "../contracts-find-modal/contracts-find-modal.container"; -import moment from "moment"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) - setContractFinderContext: (context) => - dispatch(setModalContext({ context: context, modal: "contractFinder" })), + //setUserLanguage: language => dispatch(setUserLanguage(language)) + setContractFinderContext: (context) => + dispatch(setModalContext({context: context, modal: "contractFinder"})), }); export default connect(mapStateToProps, mapDispatchToProps)(ContractsList); export function ContractsList({ - bodyshop, - loading, - contracts, - refetch, - total, - setContractFinderContext, -}) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const history = useHistory(); - const search = queryString.parse(useLocation().search); - const { page } = search; + bodyshop, + loading, + contracts, + refetch, + total, + setContractFinderContext, + }) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const {page} = search; - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("contracts.fields.agreementnumber"), - dataIndex: "agreementnumber", - key: "agreementnumber", - sorter: (a, b) => a.agreementnumber - b.agreementnumber, - sortOrder: - state.sortedInfo.columnKey === "agreementnumber" && - state.sortedInfo.order, - render: (text, record) => ( - - {record.agreementnumber || ""} - - ), - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "job.ro_number", - key: "job.ro_number", - render: (text, record) => ( - - {record.job.ro_number || ""} - - ), - }, - { - title: t("contracts.fields.driver"), - dataIndex: "driver_ln", - key: "driver_ln", - sorter: (a, b) => alphaSort(a.driver_ln, b.driver_ln), - sortOrder: - state.sortedInfo.columnKey === "driver_ln" && state.sortedInfo.order, - render: (text, record) => - bodyshop.last_name_first - ? `${record.driver_ln || ""}, ${record.driver_fn || ""}` - : `${record.driver_fn || ""} ${record.driver_ln || ""}`, - }, - { - title: t("contracts.labels.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - //sorter: (a, b) => alphaSort(a.status, b.status), - //sortOrder: - // state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => ( - {`${ - record.courtesycar.year - } ${record.courtesycar.make} ${record.courtesycar.model}${ - record.courtesycar.plate ? ` (${record.courtesycar.plate})` : "" - }${ - record.courtesycar.fleetnumber - ? ` (${record.courtesycar.fleetnumber})` - : "" - }`} - ), - }, - { - title: t("contracts.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => t(record.status), - }, - { - title: t("contracts.fields.start"), - dataIndex: "start", - key: "start", - sorter: (a, b) => alphaSort(a.start, b.start), - sortOrder: - state.sortedInfo.columnKey === "start" && state.sortedInfo.order, - render: (text, record) => ( - {record.start} - ), - }, - { - title: t("contracts.fields.scheduledreturn"), - dataIndex: "scheduledreturn", - key: "scheduledreturn", - sorter: (a, b) => alphaSort(a.scheduledreturn, b.scheduledreturn), - sortOrder: - state.sortedInfo.columnKey === "scheduledreturn" && - state.sortedInfo.order, - render: (text, record) => ( - {record.scheduledreturn} - ), - }, - { - title: t("contracts.fields.actualreturn"), - dataIndex: "actualreturn", - key: "actualreturn", - sorter: (a, b) => alphaSort(a.actualreturn, b.actualreturn), - sortOrder: - state.sortedInfo.columnKey === "actualreturn" && state.sortedInfo.order, - render: (text, record) => ( - {record.actualreturn} - ), - }, - { - title: t("contracts.fields.length"), - dataIndex: "length", - key: "length", + const columns = [ + { + title: t("contracts.fields.agreementnumber"), + dataIndex: "agreementnumber", + key: "agreementnumber", + sorter: (a, b) => a.agreementnumber - b.agreementnumber, + sortOrder: + state.sortedInfo.columnKey === "agreementnumber" && + state.sortedInfo.order, + render: (text, record) => ( + + {record.agreementnumber || ""} + + ), + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "job.ro_number", + key: "job.ro_number", + render: (text, record) => ( + + {record.job.ro_number || ""} + + ), + }, + { + title: t("contracts.fields.driver"), + dataIndex: "driver_ln", + key: "driver_ln", + sorter: (a, b) => alphaSort(a.driver_ln, b.driver_ln), + sortOrder: + state.sortedInfo.columnKey === "driver_ln" && state.sortedInfo.order, + render: (text, record) => + bodyshop.last_name_first + ? `${record.driver_ln || ""}, ${record.driver_fn || ""}` + : `${record.driver_fn || ""} ${record.driver_ln || ""}`, + }, + { + title: t("contracts.labels.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + //sorter: (a, b) => alphaSort(a.status, b.status), + //sortOrder: + // state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) => ( + {`${ + record.courtesycar.year + } ${record.courtesycar.make} ${record.courtesycar.model}${ + record.courtesycar.plate ? ` (${record.courtesycar.plate})` : "" + }${ + record.courtesycar.fleetnumber + ? ` (${record.courtesycar.fleetnumber})` + : "" + }`} + ), + }, + { + title: t("contracts.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) => t(record.status), + }, + { + title: t("contracts.fields.start"), + dataIndex: "start", + key: "start", + sorter: (a, b) => alphaSort(a.start, b.start), + sortOrder: + state.sortedInfo.columnKey === "start" && state.sortedInfo.order, + render: (text, record) => ( + {record.start} + ), + }, + { + title: t("contracts.fields.scheduledreturn"), + dataIndex: "scheduledreturn", + key: "scheduledreturn", + sorter: (a, b) => alphaSort(a.scheduledreturn, b.scheduledreturn), + sortOrder: + state.sortedInfo.columnKey === "scheduledreturn" && + state.sortedInfo.order, + render: (text, record) => ( + {record.scheduledreturn} + ), + }, + { + title: t("contracts.fields.actualreturn"), + dataIndex: "actualreturn", + key: "actualreturn", + sorter: (a, b) => alphaSort(a.actualreturn, b.actualreturn), + sortOrder: + state.sortedInfo.columnKey === "actualreturn" && state.sortedInfo.order, + render: (text, record) => ( + {record.actualreturn} + ), + }, + { + title: t("contracts.fields.length"), + dataIndex: "length", + key: "length", - render: (text, record) => - (record.actualreturn && - record.start && - `${moment(record.actualreturn) - .diff(moment(record.start), "days", true) - .toFixed(1)} days`) || - "", - }, - ]; + render: (text, record) => + (record.actualreturn && + record.start && + `${dayjs(record.actualreturn) + .diff(dayjs(record.start), "day", true) + .toFixed(1)} days`) || + "", + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - search.sortcolumn = sorter.columnKey; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history({search: queryString.stringify(search)}); + }; - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - + + )} + + + { + search.search = value; + history({search: queryString.stringify(search)}); + }} + /> + + } + > + +
- {t("general.actions.clear")} - - - )} - - - { - search.search = value; - history.push({ search: queryString.stringify(search) }); - }} - /> - - } - > - -
- - ); + pagination={{ + position: "top", + pageSize: pageLimit, + current: parseInt(page || 1), + total: total, + }} + columns={columns} + rowKey="id" + dataSource={contracts} + onChange={handleTableChange} + /> + + ); } diff --git a/client/src/components/contracts-rates-change-button/contracts-rates-change-button.component.jsx b/client/src/components/contracts-rates-change-button/contracts-rates-change-button.component.jsx index 08e50e6c1..0b8508255 100644 --- a/client/src/components/contracts-rates-change-button/contracts-rates-change-button.component.jsx +++ b/client/src/components/contracts-rates-change-button/contracts-rates-change-button.component.jsx @@ -1,46 +1,42 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Dropdown, Menu } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Dropdown} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function ContractsRatesChangeButton({ disabled, form, bodyshop }) { - const { t } = useTranslation(); +export function ContractsRatesChangeButton({disabled, form, bodyshop}) { + const {t} = useTranslation(); - const handleClick = ({ item, key, keyPath }) => { - const { label, ...rate } = item.props.value; - form.setFieldsValue(rate); - }; + const handleClick = ({item, key, keyPath}) => { + const {label, ...rate} = item.props.value; + form.setFieldsValue(rate); + }; - const menu = ( -
- - {bodyshop.md_ccc_rates.map((rate, idx) => ( - - {rate.label} - - ))} - -
- ); + const menuItems = bodyshop.md_ccc_rates.map((i, idx) => ({ + key: idx, + label: i.label, + value: i, + })); - return ( - - e.preventDefault()} - > - {t("contracts.actions.changerate")} - - - ); + const menu = {items: menuItems, onClick: handleClick}; + + return ( + + e.preventDefault()} + > + {t("contracts.actions.changerate")} + + + ); } export default connect(mapStateToProps, null)(ContractsRatesChangeButton); diff --git a/client/src/components/courtesy-car-contract-list/courtesy-car-contract-list.component.jsx b/client/src/components/courtesy-car-contract-list/courtesy-car-contract-list.component.jsx index 125033101..d4b6f846c 100644 --- a/client/src/components/courtesy-car-contract-list/courtesy-car-contract-list.component.jsx +++ b/client/src/components/courtesy-car-contract-list/courtesy-car-contract-list.component.jsx @@ -1,104 +1,104 @@ -import { Card, Table } from "antd"; +import {Card, Table} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { DateFormatter } from "../../utils/DateFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {useTranslation} from "react-i18next"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {DateFormatter} from "../../utils/DateFormatter"; +import {alphaSort} from "../../utils/sorters"; import {pageLimit} from "../../utils/config"; export default function CourtesyCarContractListComponent({ - contracts, - totalContracts, -}) { - const search = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder } = search; - const history = useHistory(); + contracts, + totalContracts, + }) { + const search = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder} = search; + const history = useNavigate(); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("contracts.fields.agreementnumber"), - dataIndex: "agreementnumber", - key: "agreementnumber", - sorter: (a, b) => a.agreementnumber - b.agreementnumber, - sortOrder: sortcolumn === "agreementnumber" && sortorder, - render: (text, record) => ( - - {record.agreementnumber || ""} - - ), - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "job.ro_number", - key: "job.ro_number", + const columns = [ + { + title: t("contracts.fields.agreementnumber"), + dataIndex: "agreementnumber", + key: "agreementnumber", + sorter: (a, b) => a.agreementnumber - b.agreementnumber, + sortOrder: sortcolumn === "agreementnumber" && sortorder, + render: (text, record) => ( + + {record.agreementnumber || ""} + + ), + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "job.ro_number", + key: "job.ro_number", - render: (text, record) => ( - - {record.job.ro_number || ""} - - ), - }, - { - title: t("contracts.fields.driver"), - dataIndex: "driver_ln", - key: "driver_ln", + render: (text, record) => ( + + {record.job.ro_number || ""} + + ), + }, + { + title: t("contracts.fields.driver"), + dataIndex: "driver_ln", + key: "driver_ln", - render: (text, record) => - `${record.driver_fn || ""} ${record.driver_ln || ""}`, - }, - { - title: t("contracts.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: sortcolumn === "status" && sortorder, - render: (text, record) => t(record.status), - }, - { - title: t("contracts.fields.start"), - dataIndex: "start", - key: "start", - sorter: (a, b) => alphaSort(a.start, b.start), - sortOrder: sortcolumn === "start" && sortorder, - render: (text, record) => {record.start}, - }, - { - title: t("contracts.fields.scheduledreturn"), - dataIndex: "scheduledreturn", - key: "scheduledreturn", - sorter: (a, b) => a.scheduledreturn - b.scheduledreturn, - sortOrder: sortcolumn === "scheduledreturn" && sortorder, - render: (text, record) => ( - {record.scheduledreturn} - ), - }, - ]; + render: (text, record) => + `${record.driver_fn || ""} ${record.driver_ln || ""}`, + }, + { + title: t("contracts.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: sortcolumn === "status" && sortorder, + render: (text, record) => t(record.status), + }, + { + title: t("contracts.fields.start"), + dataIndex: "start", + key: "start", + sorter: (a, b) => alphaSort(a.start, b.start), + sortOrder: sortcolumn === "start" && sortorder, + render: (text, record) => {record.start}, + }, + { + title: t("contracts.fields.scheduledreturn"), + dataIndex: "scheduledreturn", + key: "scheduledreturn", + sorter: (a, b) => a.scheduledreturn - b.scheduledreturn, + sortOrder: sortcolumn === "scheduledreturn" && sortorder, + render: (text, record) => ( + {record.scheduledreturn} + ), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - search.page = pagination.current; - search.sortcolumn = sorter.columnKey; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history({search: queryString.stringify(search)}); + }; - return ( - -
- - ); + return ( + +
+ + ); } diff --git a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx index f9a32dfee..c738a87fb 100644 --- a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx +++ b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx @@ -1,11 +1,12 @@ -import { WarningFilled } from "@ant-design/icons"; -import { useApolloClient } from "@apollo/client"; -import { Button, Form, Input, InputNumber, PageHeader, Space } from "antd"; -import moment from "moment"; +import {WarningFilled} from "@ant-design/icons"; +import {useApolloClient} from "@apollo/client"; +import {Button, Form, Input, InputNumber, Space} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; +import dayjs from "../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { CHECK_CC_FLEET_NUMBER } from "../../graphql/courtesy-car.queries"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; +import {CHECK_CC_FLEET_NUMBER} from "../../graphql/courtesy-car.queries"; +import {DateFormatter} from "../../utils/DateFormatter"; import CourtesyCarFuelSlider from "../courtesy-car-fuel-select/courtesy-car-fuel-select.component"; import CourtesyCarReadiness from "../courtesy-car-readiness-select/courtesy-car-readiness-select.component"; import CourtesyCarStatus from "../courtesy-car-status-select/courtesy-car-status-select.component"; @@ -14,352 +15,352 @@ import FormDatePicker from "../form-date-picker/form-date-picker.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -export default function CourtesyCarCreateFormComponent({ form, saveLoading }) { - const { t } = useTranslation(); - const client = useApolloClient(); +export default function CourtesyCarCreateFormComponent({form, saveLoading}) { + const {t} = useTranslation(); + const client = useApolloClient(); - return ( -
- form.submit()} - > - {t("general.actions.save")} - - } - /> - - {/* */} - - - - - - - - - - - - - - - - - - - - - - - - - ({ - async validator(rule, value) { - if (value) { - const response = await client.query({ - query: CHECK_CC_FLEET_NUMBER, - variables: { - name: value, - }, - }); - - if ( - response.data.courtesycars_aggregate.aggregate.count === 0 - ) { - return Promise.resolve(); - } else if ( - response.data.courtesycars_aggregate.nodes.length === 1 && - response.data.courtesycars_aggregate.nodes[0].id === - form.getFieldValue("id") - ) { - return Promise.resolve(); - } - return Promise.reject(t("courtesycars.labels.uniquefleet")); - } else { - return Promise.resolve(); + return ( +
+ form.submit()} + > + {t("general.actions.save")} + } - }, - }), - ]} - > - - - - - - - - - - - - - - - + /> - - - - - - - - - - -
- - - - - p.mileage !== c.mileage || p.nextservicekm !== c.nextservicekm - } - > - {() => { - const nextservicekm = form.getFieldValue("nextservicekm"); - const mileageOver = nextservicekm - ? nextservicekm <= form.getFieldValue("mileage") - : false; - if (mileageOver) - return ( - + {/* */} + + + + + + + + + + + + + + + + + + + + + + + + + ({ + async validator(rule, value) { + if (value) { + const response = await client.query({ + query: CHECK_CC_FLEET_NUMBER, + variables: { + name: value, + }, + }); + + if ( + response.data.courtesycars_aggregate.aggregate.count === 0 + ) { + return Promise.resolve(); + } else if ( + response.data.courtesycars_aggregate.nodes.length === 1 && + response.data.courtesycars_aggregate.nodes[0].id === + form.getFieldValue("id") + ) { + return Promise.resolve(); + } + return Promise.reject(t("courtesycars.labels.uniquefleet")); + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + p.mileage !== c.mileage || p.nextservicekm !== c.nextservicekm + } + > + {() => { + const nextservicekm = form.getFieldValue("nextservicekm"); + const mileageOver = nextservicekm + ? nextservicekm <= form.getFieldValue("mileage") + : false; + if (mileageOver) + return ( + - - {t("contracts.labels.cardueforservice")} + + {t("contracts.labels.cardueforservice")} - {`${nextservicekm} km`} - - ); + {`${nextservicekm} km`} + + ); - return <>; - }} - -
-
- - - - p.nextservicedate !== c.nextservicedate} - > - {() => { - const nextservicedate = form.getFieldValue("nextservicedate"); - const dueForService = - nextservicedate && - moment(nextservicedate).endOf("day").isSameOrBefore(moment()); + return <>; + }} + +
+
+ + + + p.nextservicedate !== c.nextservicedate} + > + {() => { + const nextservicedate = form.getFieldValue("nextservicedate"); + const dueForService = + nextservicedate && + dayjs(nextservicedate).endOf("day").isSameOrBefore(dayjs()); - if (dueForService) - return ( - + if (dueForService) + return ( + - - {t("contracts.labels.cardueforservice")} + + {t("contracts.labels.cardueforservice")} - + {nextservicedate} - - ); + + ); - return <>; - }} - -
- - - - - - -
- - - - - p.registrationexpires !== c.registrationexpires - } - > - {() => { - const expires = form.getFieldValue("registrationexpires"); + return <>; + }} + +
+ + + + + + +
+ + + + + p.registrationexpires !== c.registrationexpires + } + > + {() => { + const expires = form.getFieldValue("registrationexpires"); - const dateover = - expires && moment(expires).endOf("day").isBefore(moment()); + const dateover = + expires && dayjs(expires).endOf("day").isBefore(dayjs()); - if (dateover) - return ( - + if (dateover) + return ( + - - {t("contracts.labels.dateinpast")} + + {t("contracts.labels.dateinpast")} - - ); + + ); - return <>; - }} - -
-
- - - - p.insuranceexpires !== c.insuranceexpires} - > - {() => { - const expires = form.getFieldValue("insuranceexpires"); + return <>; + }} + +
+
+ + + + p.insuranceexpires !== c.insuranceexpires} + > + {() => { + const expires = form.getFieldValue("insuranceexpires"); - const dateover = - expires && moment(expires).endOf("day").isBefore(moment()); + const dateover = + expires && dayjs(expires).endOf("day").isBefore(dayjs()); - if (dateover) - return ( - + if (dateover) + return ( + - - {t("contracts.labels.dateinpast")} + + {t("contracts.labels.dateinpast")} - - ); + + ); - return <>; - }} - + return <>; + }} + +
+ + + +
- - - -
-
- ); + ); } diff --git a/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx b/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx index 6b561d12a..a76193568 100644 --- a/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx +++ b/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx @@ -1,66 +1,66 @@ -import { Slider } from "antd"; -import React, { forwardRef } from "react"; -import { useTranslation } from "react-i18next"; +import {Slider} from "antd"; +import React, {forwardRef} from "react"; +import {useTranslation} from "react-i18next"; const CourtesyCarFuelComponent = (props, ref) => { - const { t } = useTranslation(); + const {t} = useTranslation(); - const marks = { - 0: { - style: { - color: "#f50", - }, - label: {t("courtesycars.labels.fuel.empty")}, - }, - 13: t("courtesycars.labels.fuel.18"), - 25: t("courtesycars.labels.fuel.14"), - 38: t("courtesycars.labels.fuel.38"), - 50: t("courtesycars.labels.fuel.12"), - 63: t("courtesycars.labels.fuel.58"), - 75: t("courtesycars.labels.fuel.34"), - 88: t("courtesycars.labels.fuel.78"), - 100: { - style: { - color: "#008000", - }, - label: {t("courtesycars.labels.fuel.full")}, - }, - }; - - return ( - { - switch (value) { - case 0: - return t("courtesycars.labels.fuel.empty"); - case 13: - return t("courtesycars.labels.fuel.18"); - case 25: - return t("courtesycars.labels.fuel.14"); - case 38: - return t("courtesycars.labels.fuel.38"); - case 50: - return t("courtesycars.labels.fuel.12"); - case 63: - return t("courtesycars.labels.fuel.58"); - case 75: - return t("courtesycars.labels.fuel.34"); - case 88: - return t("courtesycars.labels.fuel.78"); - case 100: - return t("courtesycars.labels.fuel.full"); - default: - return value; - } + const marks = { + 0: { + style: { + color: "#f50", + }, + label: {t("courtesycars.labels.fuel.empty")}, }, - }} - /> - ); + 13: t("courtesycars.labels.fuel.18"), + 25: t("courtesycars.labels.fuel.14"), + 38: t("courtesycars.labels.fuel.38"), + 50: t("courtesycars.labels.fuel.12"), + 63: t("courtesycars.labels.fuel.58"), + 75: t("courtesycars.labels.fuel.34"), + 88: t("courtesycars.labels.fuel.78"), + 100: { + style: { + color: "#008000", + }, + label: {t("courtesycars.labels.fuel.full")}, + }, + }; + + return ( + { + switch (value) { + case 0: + return t("courtesycars.labels.fuel.empty"); + case 13: + return t("courtesycars.labels.fuel.18"); + case 25: + return t("courtesycars.labels.fuel.14"); + case 38: + return t("courtesycars.labels.fuel.38"); + case 50: + return t("courtesycars.labels.fuel.12"); + case 63: + return t("courtesycars.labels.fuel.58"); + case 75: + return t("courtesycars.labels.fuel.34"); + case 88: + return t("courtesycars.labels.fuel.78"); + case 100: + return t("courtesycars.labels.fuel.full"); + default: + return value; + } + }, + }} + /> + ); }; export default forwardRef(CourtesyCarFuelComponent); diff --git a/client/src/components/courtesy-car-readiness-select/courtesy-car-readiness-select.component.jsx b/client/src/components/courtesy-car-readiness-select/courtesy-car-readiness-select.component.jsx index 9dd1fd514..b33cf4539 100644 --- a/client/src/components/courtesy-car-readiness-select/courtesy-car-readiness-select.component.jsx +++ b/client/src/components/courtesy-car-readiness-select/courtesy-car-readiness-select.component.jsx @@ -1,35 +1,36 @@ -import { Select } from "antd"; -import React, { forwardRef, useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -const { Option } = Select; +import {Select} from "antd"; +import React, {forwardRef, useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; -const CourtesyCarReadinessComponent = ({ value, onChange }, ref) => { - const [option, setOption] = useState(value); - const { t } = useTranslation(); +const {Option} = Select; - useEffect(() => { - if (value !== option && onChange) { - onChange(option); - } - }, [value, option, onChange]); +const CourtesyCarReadinessComponent = ({value, onChange}, ref) => { + const [option, setOption] = useState(value); + const {t} = useTranslation(); - return ( - - ); + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + return ( + + ); }; export default forwardRef(CourtesyCarReadinessComponent); diff --git a/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx b/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx index 46f742304..f92302d3c 100644 --- a/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx +++ b/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx @@ -1,50 +1,50 @@ -import { Form, InputNumber } from "antd"; +import {Form, InputNumber} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import CourtesyCarFuelSlider from "../courtesy-car-fuel-select/courtesy-car-fuel-select.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; export default function CourtesyCarReturnModalComponent() { - const { t } = useTranslation(); + const {t} = useTranslation(); - return ( -
- - - - - - - - - -
- ); + return ( +
+ + + + + + + + + +
+ ); } diff --git a/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.container.jsx b/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.container.jsx index a1fcff8b7..04fe0d126 100644 --- a/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.container.jsx +++ b/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.container.jsx @@ -1,88 +1,88 @@ -import { Form, Modal, notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectCourtesyCarReturn } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Form, Modal, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectCourtesyCarReturn} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CourtesyCarReturnModalComponent from "./courtesy-car-return-modal.component"; -import moment from "moment"; -import { RETURN_CONTRACT } from "../../graphql/cccontracts.queries"; -import { useMutation } from "@apollo/client"; +import dayjs from "../../utils/day"; +import {RETURN_CONTRACT} from "../../graphql/cccontracts.queries"; +import {useMutation} from "@apollo/client"; const mapStateToProps = createStructuredSelector({ - courtesyCarReturnModal: selectCourtesyCarReturn, - bodyshop: selectBodyshop, + courtesyCarReturnModal: selectCourtesyCarReturn, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("courtesyCarReturn")), + toggleModalVisible: () => dispatch(toggleModalVisible("courtesyCarReturn")), }); export function CCReturnModalContainer({ - courtesyCarReturnModal, - toggleModalVisible, - bodyshop, -}) { - const [loading, setLoading] = useState(false); - const { visible, context, actions } = courtesyCarReturnModal; - const { t } = useTranslation(); - const [form] = Form.useForm(); - const [updateContract] = useMutation(RETURN_CONTRACT); - const handleFinish = (values) => { - setLoading(true); - updateContract({ - variables: { - contractId: context.contractId, - cccontract: { - kmend: values.kmend, - actualreturn: values.actualreturn, - status: "contracts.status.returned", - fuelin: values.fuelin, - }, - courtesycarid: context.courtesyCarId, - courtesycar: { - status: "courtesycars.status.in", - fuel: values.fuelin, - mileage: values.kmend, - }, - }, - }) - .then((r) => { - if (actions.refetch) actions.refetch(); - toggleModalVisible(); - }) - .catch((error) => { - notification["error"]({ - message: t("contracts.errors.returning", { error: error }), - }); - }); - setLoading(false); - }; + courtesyCarReturnModal, + toggleModalVisible, + bodyshop, + }) { + const [loading, setLoading] = useState(false); + const {open, context, actions} = courtesyCarReturnModal; + const {t} = useTranslation(); + const [form] = Form.useForm(); + const [updateContract] = useMutation(RETURN_CONTRACT); + const handleFinish = (values) => { + setLoading(true); + updateContract({ + variables: { + contractId: context.contractId, + cccontract: { + kmend: values.kmend, + actualreturn: values.actualreturn, + status: "contracts.status.returned", + fuelin: values.fuelin, + }, + courtesycarid: context.courtesyCarId, + courtesycar: { + status: "courtesycars.status.in", + fuel: values.fuelin, + mileage: values.kmend, + }, + }, + }) + .then((r) => { + if (actions.refetch) actions.refetch(); + toggleModalVisible(); + }) + .catch((error) => { + notification["error"]({ + message: t("contracts.errors.returning", {error: error}), + }); + }); + setLoading(false); + }; - return ( - toggleModalVisible()} - width={"90%"} - okText={t("general.actions.save")} - onOk={() => form.submit()} - okButtonProps={{ htmlType: "submit", loading: loading }} - > -
- - -
- ); + return ( + toggleModalVisible()} + width={"90%"} + okText={t("general.actions.save")} + onOk={() => form.submit()} + okButtonProps={{htmlType: "submit", loading: loading}} + > +
+ + +
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(CCReturnModalContainer); diff --git a/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx b/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx index 771a321d7..64c08d643 100644 --- a/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx +++ b/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx @@ -1,43 +1,44 @@ -import React, { useState, useEffect, forwardRef } from "react"; -import { Select } from "antd"; -import { useTranslation } from "react-i18next"; -const { Option } = Select; +import React, {forwardRef, useEffect, useState} from "react"; +import {Select} from "antd"; +import {useTranslation} from "react-i18next"; -const CourtesyCarStatusComponent = ({ value, onChange }, ref) => { - const [option, setOption] = useState(value); - const { t } = useTranslation(); +const {Option} = Select; - useEffect(() => { - if (value !== option && onChange) { - onChange(option); - } - }, [value, option, onChange]); +const CourtesyCarStatusComponent = ({value, onChange}, ref) => { + const [option, setOption] = useState(value); + const {t} = useTranslation(); - return ( - - ); + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + return ( + + ); }; export default forwardRef(CourtesyCarStatusComponent); diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx index 2c992990c..97e0a7979 100644 --- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx +++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx @@ -1,291 +1,280 @@ -import { SyncOutlined, WarningFilled } from "@ant-design/icons"; -import { - Button, - Card, - Dropdown, - Input, - Menu, - Space, - Table, - Tooltip, -} from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { alphaSort } from "../../utils/sorters"; -import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; -export default function CourtesyCarsList({ loading, courtesycars, refetch }) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const [searchText, setSearchText] = useState(""); - const { t } = useTranslation(); +import {SyncOutlined, WarningFilled} from "@ant-design/icons"; +import {Button, Card, Dropdown, Input, Space, Table, Tooltip,} from "antd"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {alphaSort} from "../../utils/sorters"; +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; - const columns = [ - { - title: t("courtesycars.fields.fleetnumber"), - dataIndex: "fleetnumber", - key: "fleetnumber", - sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), - sortOrder: - state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.vin"), - dataIndex: "vin", - key: "vin", - sorter: (a, b) => alphaSort(a.vin, b.vin), - sortOrder: state.sortedInfo.columnKey === "vin" && state.sortedInfo.order, - render: (text, record) => ( - {record.vin} - ), - }, - { - title: t("courtesycars.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - filters: [ +export default function CourtesyCarsList({loading, courtesycars, refetch}) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); + const [searchText, setSearchText] = useState(""); + const {t} = useTranslation(); + + const columns = [ { - text: t("courtesycars.status.in"), - value: "courtesycars.status.in", + title: t("courtesycars.fields.fleetnumber"), + dataIndex: "fleetnumber", + key: "fleetnumber", + sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), + sortOrder: + state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order, }, { - text: t("courtesycars.status.out"), - value: "courtesycars.status.out", + title: t("courtesycars.fields.vin"), + dataIndex: "vin", + key: "vin", + sorter: (a, b) => alphaSort(a.vin, b.vin), + sortOrder: state.sortedInfo.columnKey === "vin" && state.sortedInfo.order, + render: (text, record) => ( + {record.vin} + ), }, { - text: t("courtesycars.status.sold"), - value: "courtesycars.status.sold", + title: t("courtesycars.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + filters: [ + { + text: t("courtesycars.status.in"), + value: "courtesycars.status.in", + }, + { + text: t("courtesycars.status.out"), + value: "courtesycars.status.out", + }, + { + text: t("courtesycars.status.sold"), + value: "courtesycars.status.sold", + }, + { + text: t("courtesycars.status.leasereturn"), + value: "courtesycars.status.leasereturn", + }, + ], + onFilter: (value, record) => value.includes(record.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) => { + const {nextservicedate, nextservicekm, mileage} = record; + + const mileageOver = nextservicekm ? nextservicekm <= mileage : false; + + const dueForService = + nextservicedate && dayjs(nextservicedate).endOf('day').isSameOrBefore(dayjs()); + + return ( + + {t(record.status)} + {(mileageOver || dueForService) && ( + + + + )} + + ); + }, }, { - text: t("courtesycars.status.leasereturn"), - value: "courtesycars.status.leasereturn", - }, - ], - onFilter: (value, record) => value.includes(record.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => { - const { nextservicedate, nextservicekm, mileage } = record; - - const mileageOver = nextservicekm ? nextservicekm <= mileage : false; - - const dueForService = - nextservicedate && - moment(nextservicedate).endOf("day").isSameOrBefore(moment()); - - return ( - - {t(record.status)} - {(mileageOver || dueForService) && ( - - - - )} - - ); - }, - }, - { - title: t("courtesycars.fields.readiness"), - dataIndex: "readiness", - key: "readiness", - sorter: (a, b) => alphaSort(a.readiness, b.readiness), - filters: [ - { - text: t("courtesycars.readiness.ready"), - value: "courtesycars.readiness.ready", + title: t("courtesycars.fields.readiness"), + dataIndex: "readiness", + key: "readiness", + sorter: (a, b) => alphaSort(a.readiness, b.readiness), + filters: [ + { + text: t("courtesycars.readiness.ready"), + value: "courtesycars.readiness.ready", + }, + { + text: t("courtesycars.readiness.notready"), + value: "courtesycars.readiness.notready", + }, + ], + onFilter: (value, record) => value.includes(record.readiness), + sortOrder: + state.sortedInfo.columnKey === "readiness" && state.sortedInfo.order, + render: (text, record) => t(record.readiness), }, { - text: t("courtesycars.readiness.notready"), - value: "courtesycars.readiness.notready", + title: t("courtesycars.fields.year"), + dataIndex: "year", + key: "year", + sorter: (a, b) => alphaSort(a.year, b.year), + sortOrder: + state.sortedInfo.columnKey === "year" && state.sortedInfo.order, }, - ], - onFilter: (value, record) => value.includes(record.readiness), - sortOrder: - state.sortedInfo.columnKey === "readiness" && state.sortedInfo.order, - render: (text, record) => t(record.readiness), - }, - { - title: t("courtesycars.fields.year"), - dataIndex: "year", - key: "year", - sorter: (a, b) => alphaSort(a.year, b.year), - sortOrder: - state.sortedInfo.columnKey === "year" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.make"), - dataIndex: "make", - key: "make", - sorter: (a, b) => alphaSort(a.make, b.make), - sortOrder: - state.sortedInfo.columnKey === "make" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.model"), - dataIndex: "model", - key: "model", - sorter: (a, b) => alphaSort(a.model, b.model), - sortOrder: - state.sortedInfo.columnKey === "model" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.color"), - dataIndex: "color", - key: "color", - sorter: (a, b) => alphaSort(a.color, b.color), - sortOrder: - state.sortedInfo.columnKey === "color" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.plate"), - dataIndex: "plate", - key: "plate", - sorter: (a, b) => alphaSort(a.plate, b.plate), - sortOrder: - state.sortedInfo.columnKey === "plate" && state.sortedInfo.order, - }, - { - title: t("courtesycars.fields.fuel"), - dataIndex: "fuel", - key: "fuel", - sorter: (a, b) => alphaSort(a.fuel, b.fuel), - sortOrder: - state.sortedInfo.columnKey === "fuel" && state.sortedInfo.order, - render: (text, record) => { - switch (record.fuel) { - case 100: - return t("courtesycars.labels.fuel.full"); - case 88: - return t("courtesycars.labels.fuel.78"); - case 63: - return t("courtesycars.labels.fuel.58"); - case 50: - return t("courtesycars.labels.fuel.12"); - case 38: - return t("courtesycars.labels.fuel.34"); - case 25: - return t("courtesycars.labels.fuel.14"); - case 13: - return t("courtesycars.labels.fuel.18"); - case 0: - return t("courtesycars.labels.fuel.empty"); - default: - return record.fuel; - } - }, - }, - { - title: t("courtesycars.labels.outwith"), - dataIndex: "outwith", - key: "outwith", - // sorter: (a, b) => alphaSort(a.model, b.model), - sortOrder: - state.sortedInfo.columnKey === "model" && state.sortedInfo.order, - render: (text, record) => - record.cccontracts.length === 1 ? ( - - {`${ - record.cccontracts[0].job.ro_number - } - ${OwnerNameDisplayFunction(record.cccontracts[0].job)}`} - - ) : null, - }, - { - title: t("contracts.fields.scheduledreturn"), - dataIndex: "scheduledreturn", - key: "scheduledreturn", - render: (text, record) => - record.cccontracts.length === 1 && ( - - {record.cccontracts[0].scheduledreturn} - - ), - }, - ]; + { + title: t("courtesycars.fields.make"), + dataIndex: "make", + key: "make", + sorter: (a, b) => alphaSort(a.make, b.make), + sortOrder: + state.sortedInfo.columnKey === "make" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.model"), + dataIndex: "model", + key: "model", + sorter: (a, b) => alphaSort(a.model, b.model), + sortOrder: + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.color"), + dataIndex: "color", + key: "color", + sorter: (a, b) => alphaSort(a.color, b.color), + sortOrder: + state.sortedInfo.columnKey === "color" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.plate"), + dataIndex: "plate", + key: "plate", + sorter: (a, b) => alphaSort(a.plate, b.plate), + sortOrder: + state.sortedInfo.columnKey === "plate" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.fuel"), + dataIndex: "fuel", + key: "fuel", + sorter: (a, b) => alphaSort(a.fuel, b.fuel), + sortOrder: + state.sortedInfo.columnKey === "fuel" && state.sortedInfo.order, + render: (text, record) => { + switch (record.fuel) { + case 100: + return t("courtesycars.labels.fuel.full"); + case 88: + return t("courtesycars.labels.fuel.78"); + case 63: + return t("courtesycars.labels.fuel.58"); + case 50: + return t("courtesycars.labels.fuel.12"); + case 38: + return t("courtesycars.labels.fuel.34"); + case 25: + return t("courtesycars.labels.fuel.14"); + case 13: + return t("courtesycars.labels.fuel.18"); + case 0: + return t("courtesycars.labels.fuel.empty"); + default: + return record.fuel; + } + }, + }, + { + title: t("courtesycars.labels.outwith"), + dataIndex: "outwith", + key: "outwith", + // sorter: (a, b) => alphaSort(a.model, b.model), + sortOrder: + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, + render: (text, record) => + record.cccontracts.length === 1 ? ( + + {`${ + record.cccontracts[0].job.ro_number + } - ${OwnerNameDisplayFunction(record.cccontracts[0].job)}`} + + ) : null, + }, + { + title: t("contracts.fields.scheduledreturn"), + dataIndex: "scheduledreturn", + key: "scheduledreturn", + render: (text, record) => + record.cccontracts.length === 1 && ( + + {record.cccontracts[0].scheduledreturn} + + ), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const tableData = searchText - ? courtesycars.filter( - (c) => - (c.fleetnumber || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (c.vin || "").toLowerCase().includes(searchText.toLowerCase()) || - (c.year || "").toLowerCase().includes(searchText.toLowerCase()) || - (c.make || "").toLowerCase().includes(searchText.toLowerCase()) || - (c.model || "").toLowerCase().includes(searchText.toLowerCase()) || - (c.plate || "").toLowerCase().includes(searchText.toLowerCase()) || - (t(c.status) || "").toLowerCase().includes(searchText.toLowerCase()) - ) - : courtesycars; - return ( - - - - - GenerateDocument( - { - name: TemplateList("courtesycar").courtesy_car_inventory - .key, + const tableData = searchText + ? courtesycars.filter( + (c) => + (c.fleetnumber || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (c.vin || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.year || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.make || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.model || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.plate || "").toLowerCase().includes(searchText.toLowerCase()) || + (t(c.status) || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : courtesycars; + + const items = [ + { + key: "courtesycar_inventory", + label: t("printcenter.courtesycarcontract.courtesy_car_inventory"), + onClick: () => + GenerateDocument( + { + name: TemplateList("courtesycar").courtesy_car_inventory.key, variables: { - //id: contract.id + //id: contract.id }, - }, - {}, - "p" - ) - } - > - {t("printcenter.courtesycarcontract.courtesy_car_inventory")} - - + }, + {}, + "p" + ), + }, + ]; + + const menu = {items}; + + return ( + + + + + + + + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> + } - > - - - - - - { - setSearchText(e.target.value); - }} - value={searchText} - enterButton - /> - - } - > -
- - ); + > +
+ + ); } diff --git a/client/src/components/csi-response-form/csi-response-form.container.jsx b/client/src/components/csi-response-form/csi-response-form.container.jsx index a1882b09a..0bc418ef4 100644 --- a/client/src/components/csi-response-form/csi-response-form.container.jsx +++ b/client/src/components/csi-response-form/csi-response-form.container.jsx @@ -1,50 +1,50 @@ -import { useQuery } from "@apollo/client"; -import { Card, Form, Result } from "antd"; +import {useQuery} from "@apollo/client"; +import {Card, Form, Result} from "antd"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { useLocation } from "react-router-dom"; -import { QUERY_CSI_RESPONSE_BY_PK } from "../../graphql/csi.queries"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {useLocation} from "react-router-dom"; +import {QUERY_CSI_RESPONSE_BY_PK} from "../../graphql/csi.queries"; import AlertComponent from "../alert/alert.component"; import ConfigFormComponents from "../config-form-components/config-form-components.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; export default function CsiResponseFormContainer() { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const searchParams = queryString.parse(useLocation().search); - const { responseid } = searchParams; - const { loading, error, data } = useQuery(QUERY_CSI_RESPONSE_BY_PK, { - variables: { - id: responseid, - }, - skip: !!!responseid, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {t} = useTranslation(); + const [form] = Form.useForm(); + const searchParams = queryString.parse(useLocation().search); + const {responseid} = searchParams; + const {loading, error, data} = useQuery(QUERY_CSI_RESPONSE_BY_PK, { + variables: { + id: responseid, + }, + skip: !!!responseid, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - form.resetFields(); - }, [data, form]); + useEffect(() => { + form.resetFields(); + }, [data, form]); + + if (!!!responseid) + return ( + + + + ); + + if (loading) return ; + if (error) return ; - if (!!!responseid) return ( - - - + +
+ + +
); - - if (loading) return ; - if (error) return ; - - return ( - -
- - -
- ); } diff --git a/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx index f73e35512..2baccd5ab 100644 --- a/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx +++ b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx @@ -1,135 +1,135 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Table } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Table} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { DateFormatter } from "../../utils/DateFormatter"; -import { alphaSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {DateFormatter} from "../../utils/DateFormatter"; +import {alphaSort} from "../../utils/sorters"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import {pageLimit} from "../../utils/config"; export default function CsiResponseListPaginated({ - refetch, - loading, - responses, - total, -}) { - const search = queryString.parse(useLocation().search); - const { responseid, page, sortcolumn, sortorder } = search; - const history = useHistory(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + refetch, + loading, + responses, + total, + }) { + const search = queryString.parse(useLocation().search); + const {responseid, page, sortcolumn, sortorder} = search; + const history = useNavigate(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - width: "8%", - sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), - sortOrder: sortcolumn === "ro_number" && sortorder, + const {t} = useTranslation(); + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + width: "8%", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: sortcolumn === "ro_number" && sortorder, - render: (text, record) => ( - - {record.job.ro_number || t("general.labels.na")} - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), - width: "25%", - sortOrder: sortcolumn === "owner" && sortorder, - render: (text, record) => { - return record.job.owner ? ( - - - - ) : ( - - + render: (text, record) => ( + + {record.job.ro_number || t("general.labels.na")} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), + width: "25%", + sortOrder: sortcolumn === "owner" && sortorder, + render: (text, record) => { + return record.job.owner ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("csi.fields.completedon"), - dataIndex: "completedon", - key: "completedon", - ellipsis: true, - sorter: (a, b) => a.completedon - b.completedon, - width: "25%", - sortOrder: sortcolumn === "completedon" && sortorder, - render: (text, record) => { - return record.completedon ? ( - {record.completedon} - ) : null; - }, - }, - ]; + ); + }, + }, + { + title: t("csi.fields.completedon"), + dataIndex: "completedon", + key: "completedon", + ellipsis: true, + sorter: (a, b) => a.completedon - b.completedon, + width: "25%", + sortOrder: sortcolumn === "completedon" && sortorder, + render: (text, record) => { + return record.completedon ? ( + {record.completedon} + ) : null; + }, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - search.sortcolumn = sorter.columnKey; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history({search: queryString.stringify(search)}); + }; - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - search.responseid = record.id; - history.push({ search: queryString.stringify(search) }); - } - } else { - delete search.responseid; - history.push({ search: queryString.stringify(search) }); - } - }; + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + search.responseid = record.id; + history({search: queryString.stringify(search)}); + } + } else { + delete search.responseid; + history({search: queryString.stringify(search)}); + } + }; - return ( - refetch()}> - - - } - > -
{ - handleOnRowClick(record); - }, - selectedRowKeys: [responseid], - type: "radio", - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, // click row - }; - }} - /> - - ); + return ( + refetch()}> + + + } + > +
{ + handleOnRowClick(record); + }, + selectedRowKeys: [responseid], + type: "radio", + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, // click row + }; + }} + /> + + ); } diff --git a/client/src/components/dashboard-components/monthly-employee-efficiency/monthly-employee-efficiency.component.jsx b/client/src/components/dashboard-components/monthly-employee-efficiency/monthly-employee-efficiency.component.jsx index c4aa9ec6b..afc93350d 100644 --- a/client/src/components/dashboard-components/monthly-employee-efficiency/monthly-employee-efficiency.component.jsx +++ b/client/src/components/dashboard-components/monthly-employee-efficiency/monthly-employee-efficiency.component.jsx @@ -1,169 +1,159 @@ -import { Card } from "antd"; +import {Card} from "antd"; import _ from "lodash"; -import moment from "moment"; +import dayjs from "../../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { - Bar, - CartesianGrid, - ComposedChart, - Legend, - Line, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from "recharts"; +import {useTranslation} from "react-i18next"; +import {Bar, CartesianGrid, ComposedChart, Legend, Line, ResponsiveContainer, Tooltip, XAxis, YAxis,} from "recharts"; import * as Utils from "../../scoreboard-targets-table/scoreboard-targets-table.util"; import DashboardRefreshRequired from "../refresh-required.component"; export default function DashboardMonthlyEmployeeEfficiency({ - data, - ...cardProps -}) { - const { t } = useTranslation(); - if (!data) return null; - if (!data.monthly_employee_efficiency) - return ; + data, + ...cardProps + }) { + const {t} = useTranslation(); + if (!data) return null; + if (!data.monthly_employee_efficiency) + return ; - const ticketsByDate = _.groupBy(data.monthly_employee_efficiency, (item) => - moment(item.date).format("YYYY-MM-DD") - ); + const ticketsByDate = _.groupBy(data.monthly_employee_efficiency, (item) => + dayjs(item.date).format("YYYY-MM-DD") + ); - const listOfDays = Utils.ListOfDaysInCurrentMonth(); + const listOfDays = Utils.ListOfDaysInCurrentMonth(); - const chartData = listOfDays.reduce((acc, val) => { - //Sum up the current day. - let dailyHrs; - if (!!ticketsByDate[val]) { - dailyHrs = ticketsByDate[val].reduce( - (dayAcc, dayVal) => { - return { - actual: dayAcc.actual + dayVal.actualhrs, - productive: dayAcc.productive + dayVal.productivehrs, - }; - }, - { actual: 0, productive: 0 } - ); - } else { - dailyHrs = { actual: 0, productive: 0 }; - } + const chartData = listOfDays.reduce((acc, val) => { + //Sum up the current day. + let dailyHrs; + if (!!ticketsByDate[val]) { + dailyHrs = ticketsByDate[val].reduce( + (dayAcc, dayVal) => { + return { + actual: dayAcc.actual + dayVal.actualhrs, + productive: dayAcc.productive + dayVal.productivehrs, + }; + }, + {actual: 0, productive: 0} + ); + } else { + dailyHrs = {actual: 0, productive: 0}; + } - const dailyEfficiency = - ((dailyHrs.productive - dailyHrs.actual) / dailyHrs.actual + 1) * 100; + const dailyEfficiency = + ((dailyHrs.productive - dailyHrs.actual) / dailyHrs.actual + 1) * 100; - const theValue = { - date: moment(val).format("DD"), - // ...dailyHrs, - actual: dailyHrs.actual.toFixed(1), - productive: dailyHrs.productive.toFixed(1), - dailyEfficiency: isNaN(dailyEfficiency) ? 0 : dailyEfficiency.toFixed(1), - accActual: - acc.length > 0 - ? acc[acc.length - 1].accActual + dailyHrs.actual - : dailyHrs.actual, + const theValue = { + date: dayjs(val).format("DD"), + // ...dailyHrs, + actual: dailyHrs.actual.toFixed(1), + productive: dailyHrs.productive.toFixed(1), + dailyEfficiency: isNaN(dailyEfficiency) ? 0 : dailyEfficiency.toFixed(1), + accActual: + acc.length > 0 + ? acc[acc.length - 1].accActual + dailyHrs.actual + : dailyHrs.actual, - accProductive: - acc.length > 0 - ? acc[acc.length - 1].accProductive + dailyHrs.productive - : dailyHrs.productive, - accEfficiency: 0, - }; + accProductive: + acc.length > 0 + ? acc[acc.length - 1].accProductive + dailyHrs.productive + : dailyHrs.productive, + accEfficiency: 0, + }; - theValue.accEfficiency = - ((theValue.accProductive - theValue.accActual) / - (theValue.accActual || 0) + - 1) * - 100; + theValue.accEfficiency = + ((theValue.accProductive - theValue.accActual) / + (theValue.accActual || 0) + + 1) * + 100; - if (isNaN(theValue.accEfficiency)) { - theValue.accEfficiency = 0; - } else { - theValue.accEfficiency = theValue.accEfficiency.toFixed(1); - } + if (isNaN(theValue.accEfficiency)) { + theValue.accEfficiency = 0; + } else { + theValue.accEfficiency = theValue.accEfficiency.toFixed(1); + } - return [...acc, theValue]; - }, []); + return [...acc, theValue]; + }, []); - return ( - -
- - - - - - - - - - - - - - -
-
- ); + return ( + +
+ + + + + + + + + + + + + + +
+
+ ); } export const DashboardMonthlyEmployeeEfficiencyGql = ` - monthly_employee_efficiency: timetickets(where: {_and: [{date: {_gte: "${moment() + monthly_employee_efficiency: timetickets(where: {_and: [{date: {_gte: "${dayjs() .startOf("month") - .format("YYYY-MM-DD")}"}},{date: {_lte: "${moment() - .endOf("month") - .format("YYYY-MM-DD")}"}} ]}) { + .format("YYYY-MM-DD")}"}},{date: {_lte: "${dayjs() + .endOf("month") + .format("YYYY-MM-DD")}"}} ]}) { actualhrs productivehrs employeeid diff --git a/client/src/components/dashboard-components/monthly-job-costing/monthly-job-costing.component.jsx b/client/src/components/dashboard-components/monthly-job-costing/monthly-job-costing.component.jsx index c3a69a708..deeabbcc3 100644 --- a/client/src/components/dashboard-components/monthly-job-costing/monthly-job-costing.component.jsx +++ b/client/src/components/dashboard-components/monthly-job-costing/monthly-job-costing.component.jsx @@ -1,164 +1,164 @@ -import { Card, Input, Space, Table, Typography } from "antd"; +import {Card, Input, Space, Table, Typography} from "antd"; import axios from "axios"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../../utils/sorters"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../../utils/sorters"; import LoadingSkeleton from "../../loading-skeleton/loading-skeleton.component"; import Dinero from "dinero.js"; import DashboardRefreshRequired from "../refresh-required.component"; import {pageLimit} from "../../../utils/config"; -export default function DashboardMonthlyJobCosting({ data, ...cardProps }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [costingData, setcostingData] = useState(null); - const [searchText, setSearchText] = useState(""); - const [state, setState] = useState({ - sortedInfo: {}, - }); +export default function DashboardMonthlyJobCosting({data, ...cardProps}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [costingData, setcostingData] = useState(null); + const [searchText, setSearchText] = useState(""); + const [state, setState] = useState({ + sortedInfo: {}, + }); - useEffect(() => { - async function getCostingData() { - if (data && data.monthly_sales) { - setLoading(true); - const response = await axios.post("/job/costingmulti", { - jobids: data.monthly_sales.map((x) => x.id), - }); - setcostingData(response.data); - setLoading(false); - } - } + useEffect(() => { + async function getCostingData() { + if (data && data.monthly_sales) { + setLoading(true); + const response = await axios.post("/job/costingmulti", { + jobids: data.monthly_sales.map((x) => x.id), + }); + setcostingData(response.data); + setLoading(false); + } + } - getCostingData(); - }, [data]); + getCostingData(); + }, [data]); - if (!data) return null; - if (!data.monthly_sales) return ; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - const columns = [ - { - title: t("bodyshop.fields.responsibilitycenter"), - dataIndex: "cost_center", - key: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, - }, - { - title: t("jobs.labels.sales"), - dataIndex: "sales", - key: "sales", - sorter: (a, b) => - parseFloat(a.sales.substring(1)) - parseFloat(b.sales.substring(1)), - sortOrder: - state.sortedInfo.columnKey === "sales" && state.sortedInfo.order, - }, + if (!data) return null; + if (!data.monthly_sales) return ; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + const columns = [ + { + title: t("bodyshop.fields.responsibilitycenter"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.sales"), + dataIndex: "sales", + key: "sales", + sorter: (a, b) => + parseFloat(a.sales.substring(1)) - parseFloat(b.sales.substring(1)), + sortOrder: + state.sortedInfo.columnKey === "sales" && state.sortedInfo.order, + }, - { - title: t("jobs.labels.costs"), - dataIndex: "costs", - key: "costs", - sorter: (a, b) => - parseFloat(a.costs.substring(1)) - parseFloat(b.costs.substring(1)), - sortOrder: - state.sortedInfo.columnKey === "costs" && state.sortedInfo.order, - }, + { + title: t("jobs.labels.costs"), + dataIndex: "costs", + key: "costs", + sorter: (a, b) => + parseFloat(a.costs.substring(1)) - parseFloat(b.costs.substring(1)), + sortOrder: + state.sortedInfo.columnKey === "costs" && state.sortedInfo.order, + }, - { - title: t("jobs.labels.gpdollars"), - dataIndex: "gpdollars", - key: "gpdollars", - sorter: (a, b) => - parseFloat(a.gpdollars.substring(1)) - - parseFloat(b.gpdollars.substring(1)), + { + title: t("jobs.labels.gpdollars"), + dataIndex: "gpdollars", + key: "gpdollars", + sorter: (a, b) => + parseFloat(a.gpdollars.substring(1)) - + parseFloat(b.gpdollars.substring(1)), - sortOrder: - state.sortedInfo.columnKey === "gpdollars" && state.sortedInfo.order, - }, - { - title: t("jobs.labels.gppercent"), - dataIndex: "gppercent", - key: "gppercent", - sorter: (a, b) => - parseFloat(a.gppercent.slice(0, -1) || 0) - - parseFloat(b.gppercent.slice(0, -1) || 0), - sortOrder: - state.sortedInfo.columnKey === "gppercent" && state.sortedInfo.order, - }, - ]; - const filteredData = - searchText === "" - ? (costingData && costingData.allCostCenterData) || [] - : costingData.allCostCenterData.filter((d) => - (d.cost_center || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) - ); + sortOrder: + state.sortedInfo.columnKey === "gpdollars" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.gppercent"), + dataIndex: "gppercent", + key: "gppercent", + sorter: (a, b) => + parseFloat(a.gppercent.slice(0, -1) || 0) - + parseFloat(b.gppercent.slice(0, -1) || 0), + sortOrder: + state.sortedInfo.columnKey === "gppercent" && state.sortedInfo.order, + }, + ]; + const filteredData = + searchText === "" + ? (costingData && costingData.allCostCenterData) || [] + : costingData.allCostCenterData.filter((d) => + (d.cost_center || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) + ); - return ( - - { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> - - } - {...cardProps} - > - -
-
( - - - - {t("general.labels.totals")} - - - - {Dinero( - costingData && - costingData.allSummaryData && - costingData.allSummaryData.totalSales - ).toFormat()} - - - {Dinero( - costingData && - costingData.allSummaryData && - costingData.allSummaryData.totalCost - ).toFormat()} - - - {Dinero( - costingData && - costingData.allSummaryData && - costingData.allSummaryData.gpdollars - ).toFormat()} - - - - )} - /> - - - - ); + return ( + + { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> + + } + {...cardProps} + > + +
+
( + + + + {t("general.labels.totals")} + + + + {Dinero( + costingData && + costingData.allSummaryData && + costingData.allSummaryData.totalSales + ).toFormat()} + + + {Dinero( + costingData && + costingData.allSummaryData && + costingData.allSummaryData.totalCost + ).toFormat()} + + + {Dinero( + costingData && + costingData.allSummaryData && + costingData.allSummaryData.gpdollars + ).toFormat()} + + + + )} + /> + + + + ); } diff --git a/client/src/components/dashboard-components/monthly-labor-sales/monthly-labor-sales.component.jsx b/client/src/components/dashboard-components/monthly-labor-sales/monthly-labor-sales.component.jsx index a8d100e02..cd4f13e71 100644 --- a/client/src/components/dashboard-components/monthly-labor-sales/monthly-labor-sales.component.jsx +++ b/client/src/components/dashboard-components/monthly-labor-sales/monthly-labor-sales.component.jsx @@ -1,67 +1,67 @@ -import { Card } from "antd"; +import {Card} from "antd"; import Dinero from "dinero.js"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Cell, Pie, PieChart, ResponsiveContainer, Sector } from "recharts"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Cell, Pie, PieChart, ResponsiveContainer, Sector} from "recharts"; import DashboardRefreshRequired from "../refresh-required.component"; -export default function DashboardMonthlyLaborSales({ data, ...cardProps }) { - const { t } = useTranslation(); - const [activeIndex, setActiveIndex] = useState(0); - if (!data) return null; - if (!data.monthly_sales) return ; +export default function DashboardMonthlyLaborSales({data, ...cardProps}) { + const {t} = useTranslation(); + const [activeIndex, setActiveIndex] = useState(0); + if (!data) return null; + if (!data.monthly_sales) return ; - const laborData = {}; + const laborData = {}; - data.monthly_sales.forEach((job) => { - job.joblines.forEach((jobline) => { - if (!jobline.mod_lbr_ty) return; - if (!laborData[jobline.mod_lbr_ty]) - laborData[jobline.mod_lbr_ty] = Dinero(); - laborData[jobline.mod_lbr_ty] = laborData[jobline.mod_lbr_ty].add( - Dinero({ - amount: Math.round( - (job[`rate_${jobline.mod_lbr_ty.toLowerCase()}`] || 0) * 100 - ), - }).multiply(jobline.mod_lb_hrs || 0) - ); + data.monthly_sales.forEach((job) => { + job.joblines.forEach((jobline) => { + if (!jobline.mod_lbr_ty) return; + if (!laborData[jobline.mod_lbr_ty]) + laborData[jobline.mod_lbr_ty] = Dinero(); + laborData[jobline.mod_lbr_ty] = laborData[jobline.mod_lbr_ty].add( + Dinero({ + amount: Math.round( + (job[`rate_${jobline.mod_lbr_ty.toLowerCase()}`] || 0) * 100 + ), + }).multiply(jobline.mod_lb_hrs || 0) + ); + }); }); - }); - const chartData = Object.keys(laborData).map((key) => { - return { - name: t(`joblines.fields.lbr_types.${key.toUpperCase()}`), - value: laborData[key].getAmount() / 100, - color: pieColor(key.toUpperCase()), - }; - }); + const chartData = Object.keys(laborData).map((key) => { + return { + name: t(`joblines.fields.lbr_types.${key.toUpperCase()}`), + value: laborData[key].getAmount() / 100, + color: pieColor(key.toUpperCase()), + }; + }); - return ( - -
- - - setActiveIndex(index)} - > - {chartData.map((entry, index) => ( - - ))} - - - -
-
- ); + return ( + +
+ + + setActiveIndex(index)} + > + {chartData.map((entry, index) => ( + + ))} + + + +
+
+ ); } export const DashboardMonthlyRevenueGraphGql = ` @@ -69,75 +69,75 @@ export const DashboardMonthlyRevenueGraphGql = ` `; const pieColor = (type) => { - if (type === "LAA") return "lightgreen"; - else if (type === "LAB") return "dodgerblue"; - else if (type === "LAD") return "aliceblue"; - else if (type === "LAE") return "seafoam"; - else if (type === "LAG") return "chartreuse"; - else if (type === "LAF") return "magenta"; - else if (type === "LAM") return "gold"; - else if (type === "LAR") return "crimson"; - else if (type === "LAU") return "slategray"; - else if (type === "LA1") return "slategray"; - else if (type === "LA2") return "slategray"; - else if (type === "LA3") return "slategray"; - else if (type === "LA4") return "slategray"; - return "slategray"; + if (type === "LAA") return "lightgreen"; + else if (type === "LAB") return "dodgerblue"; + else if (type === "LAD") return "aliceblue"; + else if (type === "LAE") return "seafoam"; + else if (type === "LAG") return "chartreuse"; + else if (type === "LAF") return "magenta"; + else if (type === "LAM") return "gold"; + else if (type === "LAR") return "crimson"; + else if (type === "LAU") return "slategray"; + else if (type === "LA1") return "slategray"; + else if (type === "LA2") return "slategray"; + else if (type === "LA3") return "slategray"; + else if (type === "LA4") return "slategray"; + return "slategray"; }; const renderActiveShape = (props) => { - //const RADIAN = Math.PI / 180; - const { - cx, - cy, - //midAngle, - innerRadius, - outerRadius, - startAngle, - endAngle, - fill, - payload, - // percent, - value, - } = props; - // const sin = Math.sin(-RADIAN * midAngle); - // const cos = Math.cos(-RADIAN * midAngle); - // // const sx = cx + (outerRadius + 10) * cos; - // const sy = cy + (outerRadius + 10) * sin; - // const mx = cx + (outerRadius + 30) * cos; - // const my = cy + (outerRadius + 30) * sin; - // //const ex = mx + (cos >= 0 ? 1 : -1) * 22; - // const ey = my; - //const textAnchor = cos >= 0 ? "start" : "end"; + //const RADIAN = Math.PI / 180; + const { + cx, + cy, + //midAngle, + innerRadius, + outerRadius, + startAngle, + endAngle, + fill, + payload, + // percent, + value, + } = props; + // const sin = Math.sin(-RADIAN * midAngle); + // const cos = Math.cos(-RADIAN * midAngle); + // // const sx = cx + (outerRadius + 10) * cos; + // const sy = cy + (outerRadius + 10) * sin; + // const mx = cx + (outerRadius + 30) * cos; + // const my = cy + (outerRadius + 30) * sin; + // //const ex = mx + (cos >= 0 ? 1 : -1) * 22; + // const ey = my; + //const textAnchor = cos >= 0 ? "start" : "end"; - return ( - - - {payload.name} - - - {Dinero({ amount: Math.round(value * 100) }).toFormat()} - - - - - ); + return ( + + + {payload.name} + + + {Dinero({amount: Math.round(value * 100)}).toFormat()} + + + + + ); }; // ; +export default function DashboardMonthlyPartsSales({data, ...cardProps}) { + const {t} = useTranslation(); + const [activeIndex, setActiveIndex] = useState(0); + if (!data) return null; + if (!data.monthly_sales) return ; - const partData = {}; + const partData = {}; - data.monthly_sales.forEach((job) => { - job.joblines.forEach((jobline) => { - if (!jobline.part_type) return; - if (!partData[jobline.part_type]) partData[jobline.part_type] = Dinero(); - partData[jobline.part_type] = partData[jobline.part_type].add( - Dinero({ amount: Math.round((jobline.act_price || 0) * 100) }).multiply( - jobline.part_qty || 0 - ) - ); + data.monthly_sales.forEach((job) => { + job.joblines.forEach((jobline) => { + if (!jobline.part_type) return; + if (!partData[jobline.part_type]) partData[jobline.part_type] = Dinero(); + partData[jobline.part_type] = partData[jobline.part_type].add( + Dinero({amount: Math.round((jobline.act_price || 0) * 100)}).multiply( + jobline.part_qty || 0 + ) + ); + }); }); - }); - const chartData = Object.keys(partData).map((key) => { - return { - name: t(`joblines.fields.part_types.${key.toUpperCase()}`), - value: partData[key].getAmount() / 100, - color: pieColor(key.toUpperCase()), - }; - }); + const chartData = Object.keys(partData).map((key) => { + return { + name: t(`joblines.fields.part_types.${key.toUpperCase()}`), + value: partData[key].getAmount() / 100, + color: pieColor(key.toUpperCase()), + }; + }); - return ( - -
- - - setActiveIndex(index)} - > - {chartData.map((entry, index) => ( - - ))} - - - -
-
- ); + return ( + +
+ + + setActiveIndex(index)} + > + {chartData.map((entry, index) => ( + + ))} + + + +
+
+ ); } export const DashboardMonthlyRevenueGraphGql = ` `; const pieColor = (type) => { - if (type === "PAA") return "darkgreen"; - else if (type === "PAC") return "green"; - else if (type === "PAE") return "gold"; - else if (type === "PAG") return "seafoam"; - else if (type === "PAL") return "chartreuse"; - else if (type === "PAM") return "magenta"; - else if (type === "PAN") return "crimson"; - else if (type === "PAO") return "gold"; - else if (type === "PAP") return "crimson"; - else if (type === "PAR") return "indigo"; - else if (type === "PAS") return "dodgerblue"; - else if (type === "PASL") return "dodgerblue"; - return "slategray"; + if (type === "PAA") return "darkgreen"; + else if (type === "PAC") return "green"; + else if (type === "PAE") return "gold"; + else if (type === "PAG") return "seafoam"; + else if (type === "PAL") return "chartreuse"; + else if (type === "PAM") return "magenta"; + else if (type === "PAN") return "crimson"; + else if (type === "PAO") return "gold"; + else if (type === "PAP") return "crimson"; + else if (type === "PAR") return "indigo"; + else if (type === "PAS") return "dodgerblue"; + else if (type === "PASL") return "dodgerblue"; + return "slategray"; }; const renderActiveShape = (props) => { - // const RADIAN = Math.PI / 180; - const { - cx, - cy, - // midAngle, - innerRadius, - outerRadius, - startAngle, - endAngle, - fill, - payload, - // percent, - value, - } = props; - // const sin = Math.sin(-RADIAN * midAngle); - // const cos = Math.cos(-RADIAN * midAngle); - // const sx = cx + (outerRadius + 10) * cos; - //const sy = cy + (outerRadius + 10) * sin; - // const mx = cx + (outerRadius + 30) * cos; - //const my = cy + (outerRadius + 30) * sin; - // const ex = mx + (cos >= 0 ? 1 : -1) * 22; - // const ey = my; - // const textAnchor = cos >= 0 ? "start" : "end"; + // const RADIAN = Math.PI / 180; + const { + cx, + cy, + // midAngle, + innerRadius, + outerRadius, + startAngle, + endAngle, + fill, + payload, + // percent, + value, + } = props; + // const sin = Math.sin(-RADIAN * midAngle); + // const cos = Math.cos(-RADIAN * midAngle); + // const sx = cx + (outerRadius + 10) * cos; + //const sy = cy + (outerRadius + 10) * sin; + // const mx = cx + (outerRadius + 30) * cos; + //const my = cy + (outerRadius + 30) * sin; + // const ex = mx + (cos >= 0 ? 1 : -1) * 22; + // const ey = my; + // const textAnchor = cos >= 0 ? "start" : "end"; - return ( - - - {payload.name} - - - {Dinero({ amount: Math.round(value * 100) }).toFormat()} - - - - - ); + return ( + + + {payload.name} + + + {Dinero({amount: Math.round(value * 100)}).toFormat()} + + + + + ); }; diff --git a/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx b/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx index 8c68e29e9..d5e9c9627 100644 --- a/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx +++ b/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx @@ -1,93 +1,83 @@ -import { Card } from "antd"; -import moment from "moment"; +import {Card} from "antd"; +import dayjs from "../../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import _ from "lodash"; -import { - Area, - Bar, - CartesianGrid, - ComposedChart, - Legend, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from "recharts"; +import {Area, Bar, CartesianGrid, ComposedChart, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis,} from "recharts"; import Dinero from "dinero.js"; import * as Utils from "../../scoreboard-targets-table/scoreboard-targets-table.util"; import DashboardRefreshRequired from "../refresh-required.component"; -export default function DashboardMonthlyRevenueGraph({ data, ...cardProps }) { - const { t } = useTranslation(); - if (!data) return null; - if (!data.monthly_sales) return ; +export default function DashboardMonthlyRevenueGraph({data, ...cardProps}) { + const {t} = useTranslation(); + if (!data) return null; + if (!data.monthly_sales) return ; - const jobsByDate = _.groupBy(data.monthly_sales, (item) => - moment(item.date_invoiced).format("YYYY-MM-DD") - ); + const jobsByDate = _.groupBy(data.monthly_sales, (item) => + dayjs(item.date_invoiced).format("YYYY-MM-DD") + ); - const listOfDays = Utils.ListOfDaysInCurrentMonth(); + const listOfDays = Utils.ListOfDaysInCurrentMonth(); - const chartData = listOfDays.reduce((acc, val) => { - //Sum up the current day. - let dailySales; - if (!!jobsByDate[val]) { - dailySales = jobsByDate[val].reduce((dayAcc, dayVal) => { - return dayAcc.add( - Dinero((dayVal.job_totals && dayVal.job_totals.totals.subtotal) || 0) - ); - }, Dinero()); - } else { - dailySales = Dinero(); - } + const chartData = listOfDays.reduce((acc, val) => { + //Sum up the current day. + let dailySales; + if (!!jobsByDate[val]) { + dailySales = jobsByDate[val].reduce((dayAcc, dayVal) => { + return dayAcc.add( + Dinero((dayVal.job_totals && dayVal.job_totals.totals.subtotal) || 0) + ); + }, Dinero()); + } else { + dailySales = Dinero(); + } - const theValue = { - date: moment(val).format("DD"), - dailySales: dailySales.getAmount() / 100, - accSales: - acc.length > 0 - ? acc[acc.length - 1].accSales + dailySales.getAmount() / 100 - : dailySales.getAmount() / 100, - }; + const theValue = { + date: dayjs(val).format("DD"), + dailySales: dailySales.getAmount() / 100, + accSales: + acc.length > 0 + ? acc[acc.length - 1].accSales + dailySales.getAmount() / 100 + : dailySales.getAmount() / 100, + }; - return [...acc, theValue]; - }, []); + return [...acc, theValue]; + }, []); - return ( - -
- - - - - - value && value.toFixed(2)} - /> - - - - - -
-
- ); + return ( + +
+ + + + + + value && value.toFixed(2)} + /> + + + + + +
+
+ ); } export const DashboardMonthlyRevenueGraphGql = ` diff --git a/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx b/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx index 10b268f0d..d315fda6e 100644 --- a/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx +++ b/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx @@ -1,33 +1,34 @@ -import { Card, Statistic } from "antd"; +import {Card, Statistic} from "antd"; import Dinero from "dinero.js"; -import moment from "moment"; +import dayjs from "../../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import DashboardRefreshRequired from "../refresh-required.component"; -export default function DashboardProjectedMonthlySales({ data, ...cardProps }) { - const { t } = useTranslation(); - if (!data) return null; - if (!data.projected_monthly_sales) - return ; - const dollars = - data.projected_monthly_sales && - data.projected_monthly_sales.reduce( - (acc, val) => - acc.add( - Dinero( - val.job_totals && - val.job_totals.totals && - val.job_totals.totals.subtotal - ) - ), - Dinero() +export default function DashboardProjectedMonthlySales({data, ...cardProps}) { + const {t} = useTranslation(); + if (!data) return null; + if (!data.projected_monthly_sales) + return ; + + const dollars = + data.projected_monthly_sales && + data.projected_monthly_sales.reduce( + (acc, val) => + acc.add( + Dinero( + val.job_totals && + val.job_totals.totals && + val.job_totals.totals.subtotal + ) + ), + Dinero() + ); + return ( + + + ); - return ( - - - - ); } export const DashboardProjectedMonthlySalesGql = ` @@ -36,24 +37,24 @@ export const DashboardProjectedMonthlySalesGql = ` _or: [ {_and: [ {date_invoiced:{_is_null: false }}, - {date_invoiced: {_gte: "${moment() - .startOf("month") - .startOf("day") - .toISOString()}"}}, {date_invoiced: {_lte: "${moment() - .endOf("month") - .endOf("day") - .toISOString()}"}}]}, + {date_invoiced: {_gte: "${dayjs() + .startOf("month") + .startOf("day") + .toISOString()}"}}, {date_invoiced: {_lte: "${dayjs() + .endOf("month") + .endOf("day") + .toISOString()}"}}]}, { _and:[ {date_invoiced:{_is_null: true }}, - {actual_completion: {_gte: "${moment() + {actual_completion: {_gte: "${dayjs() .startOf("month") .startOf("day") - .toISOString()}"}}, {actual_completion: {_lte: "${moment() - .endOf("month") - .endOf("day") - .toISOString()}"}} + .toISOString()}"}}, {actual_completion: {_lte: "${dayjs() + .endOf("month") + .endOf("day") + .toISOString()}"}} ] }, @@ -61,13 +62,13 @@ _and:[ {_and: [ {date_invoiced: {_is_null: true}}, {actual_completion: {_is_null: true}} - {scheduled_completion: {_gte: "${moment() - .startOf("month") - .startOf("day") - .toISOString()}"}}, {scheduled_completion: {_lte: "${moment() - .endOf("month") - .endOf("day") - .toISOString()}"}} + {scheduled_completion: {_gte: "${dayjs() + .startOf("month") + .startOf("day") + .toISOString()}"}}, {scheduled_completion: {_lte: "${dayjs() + .endOf("month") + .endOf("day") + .toISOString()}"}} ]} diff --git a/client/src/components/dashboard-components/refresh-required.component.jsx b/client/src/components/dashboard-components/refresh-required.component.jsx index a765c30ac..f4614e025 100644 --- a/client/src/components/dashboard-components/refresh-required.component.jsx +++ b/client/src/components/dashboard-components/refresh-required.component.jsx @@ -1,25 +1,25 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Card } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Card} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; export default function DashboardRefreshRequired(props) { - const { t } = useTranslation(); + const {t} = useTranslation(); - return ( - -
- -
{t("dashboard.errors.refreshrequired")}
-
-
- ); + return ( + +
+ +
{t("dashboard.errors.refreshrequired")}
+
+
+ ); } diff --git a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx index 74609ca49..e9977d934 100644 --- a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx +++ b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx @@ -1,219 +1,215 @@ -import { - BranchesOutlined, - ExclamationCircleFilled, - PauseCircleOutlined, -} from "@ant-design/icons"; -import { Card, Space, Table, Tooltip } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined,} from "@ant-design/icons"; +import {Card, Space, Table, Tooltip} from "antd"; +import dayjs from "../../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../../owner-name-display/owner-name-display.component"; import DashboardRefreshRequired from "../refresh-required.component"; import {pageLimit} from "../../../utils/config"; -export default function DashboardScheduledInToday({ data, ...cardProps }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - if (!data) return null; - if (!data.scheduled_in_today) - return ; +export default function DashboardScheduledInToday({data, ...cardProps}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + if (!data) return null; + if (!data.scheduled_in_today) + return ; - const appt = []; // Flatten Data - data.scheduled_in_today.forEach((item) => { - if (item.job) { - var i = { - canceled: item.canceled, - id: item.id, - alt_transport: item.job.alt_transport, - clm_no: item.job.clm_no, - jobid: item.job.jobid, - ins_co_nm: item.job.ins_co_nm, - iouparent: item.job.iouparent, - ownerid: item.job.ownerid, - ownr_co_nm: item.job.ownr_co_nm, - ownr_ea: item.job.ownr_ea, - ownr_fn: item.job.ownr_fn, - ownr_ln: item.job.ownr_ln, - ownr_ph1: item.job.ownr_ph1, - ownr_ph2: item.job.ownr_ph2, - production_vars: item.job.production_vars, - ro_number: item.job.ro_number, - suspended: item.job.suspended, - v_make_desc: item.job.v_make_desc, - v_model_desc: item.job.v_model_desc, - v_model_yr: item.job.v_model_yr, - v_vin: item.job.v_vin, - vehicleid: item.job.vehicleid, - note: item.note, - start: moment(item.start).format("hh:mm a"), - title: item.title, - }; - appt.push(i); - } - }); - appt.sort(function (a, b) { - return new moment(a.start) - new moment(b.start); - }); + const appt = []; // Flatten Data + data.scheduled_in_today.forEach((item) => { + if (item.job) { + var i = { + canceled: item.canceled, + id: item.id, + alt_transport: item.job.alt_transport, + clm_no: item.job.clm_no, + jobid: item.job.jobid, + ins_co_nm: item.job.ins_co_nm, + iouparent: item.job.iouparent, + ownerid: item.job.ownerid, + ownr_co_nm: item.job.ownr_co_nm, + ownr_ea: item.job.ownr_ea, + ownr_fn: item.job.ownr_fn, + ownr_ln: item.job.ownr_ln, + ownr_ph1: item.job.ownr_ph1, + ownr_ph2: item.job.ownr_ph2, + production_vars: item.job.production_vars, + ro_number: item.job.ro_number, + suspended: item.job.suspended, + v_make_desc: item.job.v_make_desc, + v_model_desc: item.job.v_model_desc, + v_model_yr: item.job.v_model_yr, + v_vin: item.job.v_vin, + vehicleid: item.job.vehicleid, + note: item.note, + start: dayjs(item.start).format("hh:mm a"), + title: item.title, + }; + appt.push(i); + } + }); + appt.sort(function (a, b) { + return new dayjs(a.start) - new dayjs(b.start); + }); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - render: (text, record) => ( - e.stopPropagation()} - > - - {record.ro_number || t("general.labels.na")} - {record.production_vars && record.production_vars.alert ? ( - - ) : null} - {record.suspended && ( - - )} - {record.iouparent && ( - - - - )} - - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - responsive: ["md"], - render: (text, record) => { - return record.ownerid ? ( - e.stopPropagation()} - > - - - ) : ( - - + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + render: (text, record) => ( + e.stopPropagation()} + > + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && ( + + )} + {record.iouparent && ( + + + + )} + + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + responsive: ["md"], + render: (text, record) => { + return record.ownerid ? ( + e.stopPropagation()} + > + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.ownr_ea"), - dataIndex: "ownr_ea", - key: "ownr_ea", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - e.stopPropagation()} - > - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ) : ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ); - }, - }, - { - title: t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - ellipsis: true, - responsive: ["md"], - }, - { - title: t("appointments.fields.time"), - dataIndex: "start", - key: "start", - ellipsis: true, - responsive: ["md"], - }, - { - title: t("appointments.fields.alt_transport"), - dataIndex: "alt_transport", - key: "alt_transport", - ellipsis: true, - responsive: ["md"], - }, - ]; + ); + }, + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()} + > + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("appointments.fields.time"), + dataIndex: "start", + key: "start", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("appointments.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + responsive: ["md"], + }, + ]; - const handleTableChange = (sorter) => { - setState({ ...state, sortedInfo: sorter }); - }; + const handleTableChange = (sorter) => { + setState({...state, sortedInfo: sorter}); + }; - return ( - -
-
- - - ); + return ( + +
+
+ + + ); } export const DashboardScheduledInTodayGql = ` - scheduled_in_today: appointments(where: {start: {_gte: "${moment() + scheduled_in_today: appointments(where: {start: {_gte: "${dayjs() .startOf("day") - .toISOString()}", _lte: "${moment() - .endOf("day") - .toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) { + .toISOString()}", _lte: "${dayjs() + .endOf("day") + .toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) { canceled id job { diff --git a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx index 0407e3aad..8168bc540 100644 --- a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx +++ b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx @@ -1,181 +1,177 @@ -import { - BranchesOutlined, - ExclamationCircleFilled, - PauseCircleOutlined, -} from "@ant-design/icons"; -import { Card, Space, Table, Tooltip } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined,} from "@ant-design/icons"; +import {Card, Space, Table, Tooltip} from "antd"; +import dayjs from "../../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../../owner-name-display/owner-name-display.component"; import DashboardRefreshRequired from "../refresh-required.component"; import {pageLimit} from "../../../utils/config"; -export default function DashboardScheduledOutToday({ data, ...cardProps }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - if (!data) return null; - if (!data.scheduled_out_today) - return ; +export default function DashboardScheduledOutToday({data, ...cardProps}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + if (!data) return null; + if (!data.scheduled_out_today) + return ; - data.scheduled_out_today.forEach((item) => { - item.scheduled_completion= moment(item.scheduled_completion).format("hh:mm a") - }); - data.scheduled_out_today.sort(function (a, b) { - return new Date(a.scheduled_completion) - new Date(b.scheduled_completion); - }); + data.scheduled_out_today.forEach((item) => { + item.scheduled_completion = dayjs(item.scheduled_completion).format("hh:mm a") + }); + data.scheduled_out_today.sort(function (a, b) { + return new Date(a.scheduled_completion) - new Date(b.scheduled_completion); + }); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - render: (text, record) => ( - e.stopPropagation()} - > - - {record.ro_number || t("general.labels.na")} - {record.production_vars && record.production_vars.alert ? ( - - ) : null} - {record.suspended && ( - - )} - {record.iouparent && ( - - - - )} - - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - responsive: ["md"], - render: (text, record) => { - return record.ownerid ? ( - e.stopPropagation()} - > - - - ) : ( - - + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + render: (text, record) => ( + e.stopPropagation()} + > + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && ( + + )} + {record.iouparent && ( + + + + )} + + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + responsive: ["md"], + render: (text, record) => { + return record.ownerid ? ( + e.stopPropagation()} + > + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.ownr_ea"), - dataIndex: "ownr_ea", - key: "ownr_ea", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - e.stopPropagation()} - > - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ) : ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ); - }, - }, - { - title: t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - ellipsis: true, - responsive: ["md"], - }, - { - title: t("jobs.fields.scheduled_completion"), - dataIndex: "scheduled_completion", - key: "scheduled_completion", - ellipsis: true, - responsive: ["md"], - }, - { - title: t("appointments.fields.alt_transport"), - dataIndex: "alt_transport", - key: "alt_transport", - ellipsis: true, - responsive: ["md"], - }, - ]; + ); + }, + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()} + > + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("jobs.fields.scheduled_completion"), + dataIndex: "scheduled_completion", + key: "scheduled_completion", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("appointments.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + responsive: ["md"], + }, + ]; - const handleTableChange = (sorter) => { - setState({ ...state, sortedInfo: sorter }); - }; + const handleTableChange = (sorter) => { + setState({...state, sortedInfo: sorter}); + }; - return ( - -
-
- - - ); + return ( + +
+
+ + + ); } export const DashboardScheduledOutTodayGql = ` @@ -183,8 +179,8 @@ export const DashboardScheduledOutTodayGql = ` date_invoiced: {_is_null: true}, ro_number: {_is_null: false}, voided: {_eq: false}, - scheduled_completion: {_gte: "${moment().startOf("day").toISOString()}", - _lte: "${moment().endOf("day").toISOString()}"}}) { + scheduled_completion: {_gte: "${dayjs().startOf("day").toISOString()}", + _lte: "${dayjs().endOf("day").toISOString()}"}}) { alt_transport clm_no jobid: id diff --git a/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx b/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx index fe0643732..5e563a475 100644 --- a/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx +++ b/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx @@ -1,27 +1,27 @@ -import { Card, Statistic } from "antd"; +import {Card, Statistic} from "antd"; import Dinero from "dinero.js"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import DashboardRefreshRequired from "../refresh-required.component"; export default function DashboardTotalProductionDollars({ - data, - ...cardProps -}) { - const { t } = useTranslation(); - if (!data) return null; - if (!data.production_jobs) return ; - const dollars = - data.production_jobs && - data.production_jobs.reduce( - (acc, val) => - acc.add(Dinero(val.job_totals && val.job_totals.totals.subtotal)), - Dinero() - ); + data, + ...cardProps + }) { + const {t} = useTranslation(); + if (!data) return null; + if (!data.production_jobs) return ; + const dollars = + data.production_jobs && + data.production_jobs.reduce( + (acc, val) => + acc.add(Dinero(val.job_totals && val.job_totals.totals.subtotal)), + Dinero() + ); - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx b/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx index 9cdf7fc68..3d43bb1fb 100644 --- a/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx +++ b/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx @@ -1,63 +1,63 @@ -import { Card, Space, Statistic } from "antd"; +import {Card, Space, Statistic} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../../redux/user/user.selectors"; import DashboardRefreshRequired from "../refresh-required.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(DashboardTotalProductionHours); export function DashboardTotalProductionHours({ - bodyshop, - data, - ...cardProps -}) { - const { t } = useTranslation(); - if (!data) return null; - if (!data.production_jobs) return ; - const hours = - data.production_jobs && - data.production_jobs.reduce( - (acc, val) => { - return { - body: acc.body + val.labhrs.aggregate.sum.mod_lb_hrs, - ref: acc.ref + val.larhrs.aggregate.sum.mod_lb_hrs, - total: - acc.total + - val.labhrs.aggregate.sum.mod_lb_hrs + - val.larhrs.aggregate.sum.mod_lb_hrs, - }; - }, - { body: 0, ref: 0, total: 0 } + bodyshop, + data, + ...cardProps + }) { + const {t} = useTranslation(); + if (!data) return null; + if (!data.production_jobs) return ; + const hours = + data.production_jobs && + data.production_jobs.reduce( + (acc, val) => { + return { + body: acc.body + val.labhrs.aggregate.sum.mod_lb_hrs, + ref: acc.ref + val.larhrs.aggregate.sum.mod_lb_hrs, + total: + acc.total + + val.labhrs.aggregate.sum.mod_lb_hrs + + val.larhrs.aggregate.sum.mod_lb_hrs, + }; + }, + {body: 0, ref: 0, total: 0} + ); + const aboveTargetHours = hours.total >= bodyshop.prodtargethrs; + return ( + + + + + + + ); - const aboveTargetHours = hours.total >= bodyshop.prodtargethrs; - return ( - - - - - - - - ); } export const DashboardTotalProductionHoursGql = ``; diff --git a/client/src/components/dashboard-grid/dashboard-grid.component.jsx b/client/src/components/dashboard-grid/dashboard-grid.component.jsx index d24dd5641..a4eeca85c 100644 --- a/client/src/components/dashboard-grid/dashboard-grid.component.jsx +++ b/client/src/components/dashboard-grid/dashboard-grid.component.jsx @@ -1,21 +1,19 @@ -import Icon, { SyncOutlined } from "@ant-design/icons"; -import { gql, useMutation, useQuery } from "@apollo/client"; -import { Button, Dropdown, Menu, PageHeader, Space, notification } from "antd"; +import Icon, {SyncOutlined} from "@ant-design/icons"; +import {gql, useMutation, useQuery} from "@apollo/client"; +import {Button, Dropdown, notification, Space} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import i18next from "i18next"; import _ from "lodash"; -import moment from "moment"; -import React, { useState } from "react"; -import { Responsive, WidthProvider } from "react-grid-layout"; -import { useTranslation } from "react-i18next"; -import { MdClose } from "react-icons/md"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_DASHBOARD_LAYOUT } from "../../graphql/user.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {Responsive, WidthProvider} from "react-grid-layout"; +import {useTranslation} from "react-i18next"; +import {MdClose} from "react-icons/md"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_DASHBOARD_LAYOUT} from "../../graphql/user.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import DashboardMonthlyEmployeeEfficiency, { DashboardMonthlyEmployeeEfficiencyGql, @@ -29,7 +27,8 @@ import DashboardMonthlyRevenueGraph, { import DashboardProjectedMonthlySales, { DashboardProjectedMonthlySalesGql, } from "../dashboard-components/pojected-monthly-sales/projected-monthly-sales.component"; -import DashboardTotalProductionDollars from "../dashboard-components/total-production-dollars/total-production-dollars.component"; +import DashboardTotalProductionDollars + from "../dashboard-components/total-production-dollars/total-production-dollars.component"; import DashboardTotalProductionHours, { DashboardTotalProductionHoursGql, } from "../dashboard-components/total-production-hours/total-production-hours.component"; @@ -44,343 +43,339 @@ import DashboardScheduledOutToday, { DashboardScheduledOutTodayGql, } from "../dashboard-components/scheduled-out-today/scheduled-out-today.component"; import "./dashboard-grid.styles.scss"; -import { GenerateDashboardData } from "./dashboard-grid.utils"; +import {GenerateDashboardData} from "./dashboard-grid.utils"; const ResponsiveReactGridLayout = WidthProvider(Responsive); const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function DashboardGridComponent({ currentUser, bodyshop }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - ...(bodyshop.associations[0].user.dashboardlayout - ? bodyshop.associations[0].user.dashboardlayout - : { items: [], layout: {}, layouts: [] }), - }); - - const { loading, error, data, refetch } = useQuery( - createDashboardQuery(state), - { fetchPolicy: "network-only", nextFetchPolicy: "network-only" } - ); - - const [updateLayout] = useMutation(UPDATE_DASHBOARD_LAYOUT); - - const handleLayoutChange = async (layout, layouts) => { - logImEXEvent("dashboard_change_layout"); - - setState({ ...state, layout, layouts }); - - const result = await updateLayout({ - variables: { - email: currentUser.email, - layout: { ...state, layout, layouts }, - }, +export function DashboardGridComponent({currentUser, bodyshop}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + ...(bodyshop.associations[0].user.dashboardlayout + ? bodyshop.associations[0].user.dashboardlayout + : {items: [], layout: {}, layouts: []}), }); - if (!!result.errors) { - notification["error"]({ - message: t("dashboard.errors.updatinglayout", { - message: JSON.stringify(result.errors), - }), - }); - } - }; - const handleRemoveComponent = (key) => { - logImEXEvent("dashboard_remove_component", { name: key }); - const idxToRemove = state.items.findIndex((i) => i.i === key); - const items = _.cloneDeep(state.items); + const {loading, error, data, refetch} = useQuery( + createDashboardQuery(state), + {fetchPolicy: "network-only", nextFetchPolicy: "network-only"} + ); - items.splice(idxToRemove, 1); - setState({ ...state, items }); - }; + const [updateLayout] = useMutation(UPDATE_DASHBOARD_LAYOUT); - const handleAddComponent = (e) => { - logImEXEvent("dashboard_add_component", { name: e }); - setState({ - ...state, - items: [ - ...state.items, - { - i: e.key, - x: (state.items.length * 2) % (state.cols || 12), - y: 99, // puts it at the bottom - w: componentList[e.key].w || 2, - h: componentList[e.key].h || 2, - }, - ], - }); - }; + const handleLayoutChange = async (layout, layouts) => { + logImEXEvent("dashboard_change_layout"); - const dashboarddata = React.useMemo( - () => GenerateDashboardData(data), - [data] - ); - const existingLayoutKeys = state.items.map((i) => i.i); - const addComponentOverlay = ( - - {Object.keys(componentList).map((key) => ( - - {componentList[key].label} - - ))} - - ); + setState({...state, layout, layouts}); - if (error) return ; - - return ( -
- - - - - - + const result = await updateLayout({ + variables: { + email: currentUser.email, + layout: {...state, layout, layouts}, + }, + }); + if (!!result.errors) { + notification["error"]({ + message: t("dashboard.errors.updatinglayout", { + message: JSON.stringify(result.errors), + }), + }); } - /> + }; + const handleRemoveComponent = (key) => { + logImEXEvent("dashboard_remove_component", {name: key}); + const idxToRemove = state.items.findIndex((i) => i.i === key); - - {state.items.map((item, index) => { - const TheComponent = componentList[item.i].component; - return ( -
{ + logImEXEvent("dashboard_add_component", {name: e}); + setState({ + ...state, + items: [ + ...state.items, + { + i: e.key, + x: (state.items.length * 2) % (state.cols || 12), + y: 99, // puts it at the bottom + w: componentList[e.key].w || 2, + h: componentList[e.key].h || 2, + }, + ], + }); + }; + + const dashboarddata = React.useMemo( + () => GenerateDashboardData(data), + [data] + ); + const existingLayoutKeys = state.items.map((i) => i.i); + + const menuItems = Object.keys(componentList).map((key) => ({ + key: key, + label: componentList[key].label, + value: key, + disabled: existingLayoutKeys.includes(key), + })); + + const menu = {items: menuItems, onClick: handleAddComponent}; + + if (error) return ; + + return ( +
+ + + + + + + } + /> + + - - handleRemoveComponent(item.i)} - /> - - -
- ); - })} - -
- ); + {state.items.map((item, index) => { + const TheComponent = componentList[item.i].component; + return ( +
+ + handleRemoveComponent(item.i)} + /> + + +
+ ); + })} +
+
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(DashboardGridComponent); const componentList = { - ProductionDollars: { - label: i18next.t("dashboard.titles.productiondollars"), - component: DashboardTotalProductionDollars, - gqlFragment: null, - w: 1, - h: 1, - minW: 2, - minH: 1, - }, - ProductionHours: { - label: i18next.t("dashboard.titles.productionhours"), - component: DashboardTotalProductionHours, - gqlFragment: DashboardTotalProductionHoursGql, - w: 3, - h: 1, - minW: 3, - minH: 1, - }, - ProjectedMonthlySales: { - label: i18next.t("dashboard.titles.projectedmonthlysales"), - component: DashboardProjectedMonthlySales, - gqlFragment: DashboardProjectedMonthlySalesGql, - w: 2, - h: 1, - minW: 2, - minH: 1, - }, - MonthlyRevenueGraph: { - label: i18next.t("dashboard.titles.monthlyrevenuegraph"), - component: DashboardMonthlyRevenueGraph, - gqlFragment: DashboardMonthlyRevenueGraphGql, - w: 4, - h: 2, - minW: 4, - minH: 2, - }, - MonthlyJobCosting: { - label: i18next.t("dashboard.titles.monthlyjobcosting"), - component: DashboardMonthlyJobCosting, - gqlFragment: null, - minW: 6, - minH: 3, - w: 6, - h: 3, - }, - MonthlyPartsSales: { - label: i18next.t("dashboard.titles.monthlypartssales"), - component: DashboardMonthlyPartsSales, - gqlFragment: null, - minW: 2, - minH: 2, - w: 2, - h: 2, - }, - MonthlyLaborSales: { - label: i18next.t("dashboard.titles.monthlylaborsales"), - component: DashboardMonthlyLaborSales, - gqlFragment: null, - minW: 2, - minH: 2, - w: 2, - h: 2, - }, - MonthlyEmployeeEfficency: { - label: i18next.t("dashboard.titles.monthlyemployeeefficiency"), - component: DashboardMonthlyEmployeeEfficiency, - gqlFragment: DashboardMonthlyEmployeeEfficiencyGql, - minW: 2, - minH: 2, - w: 2, - h: 2, - }, - ScheduleInToday: { - label: i18next.t("dashboard.titles.scheduledintoday", { - date: moment().startOf("day").format("MM/DD/YYYY"), - }), - component: DashboardScheduledInToday, - gqlFragment: DashboardScheduledInTodayGql, - minW: 10, - minH: 2, - w: 10, - h: 2, - }, - ScheduleOutToday: { - label: i18next.t("dashboard.titles.scheduledouttoday", { - date: moment().startOf("day").format("MM/DD/YYYY"), - }), - component: DashboardScheduledOutToday, - gqlFragment: DashboardScheduledOutTodayGql, - minW: 10, - minH: 2, - w: 10, - h: 2, - }, + ProductionDollars: { + label: i18next.t("dashboard.titles.productiondollars"), + component: DashboardTotalProductionDollars, + gqlFragment: null, + w: 1, + h: 1, + minW: 2, + minH: 1, + }, + ProductionHours: { + label: i18next.t("dashboard.titles.productionhours"), + component: DashboardTotalProductionHours, + gqlFragment: DashboardTotalProductionHoursGql, + w: 3, + h: 1, + minW: 3, + minH: 1, + }, + ProjectedMonthlySales: { + label: i18next.t("dashboard.titles.projectedmonthlysales"), + component: DashboardProjectedMonthlySales, + gqlFragment: DashboardProjectedMonthlySalesGql, + w: 2, + h: 1, + minW: 2, + minH: 1, + }, + MonthlyRevenueGraph: { + label: i18next.t("dashboard.titles.monthlyrevenuegraph"), + component: DashboardMonthlyRevenueGraph, + gqlFragment: DashboardMonthlyRevenueGraphGql, + w: 4, + h: 2, + minW: 4, + minH: 2, + }, + MonthlyJobCosting: { + label: i18next.t("dashboard.titles.monthlyjobcosting"), + component: DashboardMonthlyJobCosting, + gqlFragment: null, + minW: 6, + minH: 3, + w: 6, + h: 3, + }, + MonthlyPartsSales: { + label: i18next.t("dashboard.titles.monthlypartssales"), + component: DashboardMonthlyPartsSales, + gqlFragment: null, + minW: 2, + minH: 2, + w: 2, + h: 2, + }, + MonthlyLaborSales: { + label: i18next.t("dashboard.titles.monthlylaborsales"), + component: DashboardMonthlyLaborSales, + gqlFragment: null, + minW: 2, + minH: 2, + w: 2, + h: 2, + }, + MonthlyEmployeeEfficency: { + label: i18next.t("dashboard.titles.monthlyemployeeefficiency"), + component: DashboardMonthlyEmployeeEfficiency, + gqlFragment: DashboardMonthlyEmployeeEfficiencyGql, + minW: 2, + minH: 2, + w: 2, + h: 2, + }, + ScheduleInToday: { + label: i18next.t("dashboard.titles.scheduledintoday", { + date: dayjs().startOf("day").format("MM/DD/YYYY"), + }), + component: DashboardScheduledInToday, + gqlFragment: DashboardScheduledInTodayGql, + minW: 10, + minH: 2, + w: 10, + h: 2, + }, + ScheduleOutToday: { + label: i18next.t("dashboard.titles.scheduledouttoday", { + date: dayjs().startOf("day").format("MM/DD/YYYY"), + }), + component: DashboardScheduledOutToday, + gqlFragment: DashboardScheduledOutTodayGql, + minW: 10, + minH: 2, + w: 10, + h: 2, + }, }; const createDashboardQuery = (state) => { - const componentBasedAdditions = - state && - Array.isArray(state.layout) && - state.layout - .map((item, index) => componentList[item.i].gqlFragment || "") - .join(""); - return gql` - query QUERY_DASHBOARD_DETAILS { - ${componentBasedAdditions || ""} - monthly_sales: jobs(where: {_and: [ - { voided: {_eq: false}}, - {date_invoiced: {_gte: "${moment() + const componentBasedAdditions = + state && + Array.isArray(state.layout) && + state.layout + .map((item, index) => componentList[item.i].gqlFragment || "") + .join(""); + return gql` + query QUERY_DASHBOARD_DETAILS { + ${componentBasedAdditions || ""} + monthly_sales: jobs(where: {_and: [ + { voided: {_eq: false}}, + {date_invoiced: {_gte: "${dayjs() .startOf("month") - .startOf("day") - .toISOString()}"}}, {date_invoiced: {_lte: "${moment() + .startOf("day") + .toISOString()}"}}, {date_invoiced: {_lte: "${dayjs() .endOf("month") .endOf("day") .toISOString()}"}}]}) { id - ro_number - date_invoiced - job_totals - rate_la1 - rate_la2 - rate_la3 - rate_la4 - rate_laa - rate_lab - rate_lad - rate_lae - rate_laf - rate_lag - rate_lam - rate_lar - rate_las - rate_lau - rate_ma2s - rate_ma2t - rate_ma3s - rate_mabl - rate_macs - rate_mahw - rate_mapa - rate_mash - rate_matd - joblines(where: { removed: { _eq: false } }) { - id - mod_lbr_ty - mod_lb_hrs - act_price - part_qty - part_type - } - } - production_jobs: jobs(where: { inproduction: { _eq: true } }) { - id - ro_number - ins_co_nm - job_totals - joblines(where: { removed: { _eq: false } }) { - id - mod_lbr_ty - mod_lb_hrs - act_price - part_qty - part_type - } - labhrs: joblines_aggregate(where: { mod_lbr_ty: { _neq: "LAR" }, removed: { _eq: false } }) { - aggregate { - sum { - mod_lb_hrs + ro_number + date_invoiced + job_totals + rate_la1 + rate_la2 + rate_la3 + rate_la4 + rate_laa + rate_lab + rate_lad + rate_lae + rate_laf + rate_lag + rate_lam + rate_lar + rate_las + rate_lau + rate_ma2s + rate_ma2t + rate_ma3s + rate_mabl + rate_macs + rate_mahw + rate_mapa + rate_mash + rate_matd + joblines(where: { removed: { _eq: false } }) { + id + mod_lbr_ty + mod_lb_hrs + act_price + part_qty + part_type + } + } + production_jobs: jobs(where: { inproduction: { _eq: true } }) { + id + ro_number + ins_co_nm + job_totals + joblines(where: { removed: { _eq: false } }) { + id + mod_lbr_ty + mod_lb_hrs + act_price + part_qty + part_type + } + labhrs: joblines_aggregate(where: { mod_lbr_ty: { _neq: "LAR" }, removed: { _eq: false } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" }, removed: { _eq: false } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + } } - } - } - larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" }, removed: { _eq: false } }) { - aggregate { - sum { - mod_lb_hrs - } - } - } - } - } - `; + `; }; diff --git a/client/src/components/dashboard-grid/dashboard-grid.styles.scss b/client/src/components/dashboard-grid/dashboard-grid.styles.scss index 62a3ae72b..ceedfbca9 100644 --- a/client/src/components/dashboard-grid/dashboard-grid.styles.scss +++ b/client/src/components/dashboard-grid/dashboard-grid.styles.scss @@ -1,6 +1,7 @@ .react-resizable { position: relative; } + .react-resizable-handle { position: absolute; width: 20px; @@ -12,68 +13,82 @@ background-position: bottom right; padding: 0 3px 3px 0; } + .react-resizable-handle-sw { bottom: 0; left: 0; cursor: sw-resize; transform: rotate(90deg); } + .react-resizable-handle-se { bottom: 0; right: 0; cursor: se-resize; } + .react-resizable-handle-nw { top: 0; left: 0; cursor: nw-resize; transform: rotate(180deg); } + .react-resizable-handle-ne { top: 0; right: 0; cursor: ne-resize; transform: rotate(270deg); } + .react-resizable-handle-w, .react-resizable-handle-e { top: 50%; margin-top: -10px; cursor: ew-resize; } + .react-resizable-handle-w { left: 0; transform: rotate(135deg); } + .react-resizable-handle-e { right: 0; transform: rotate(315deg); } + .react-resizable-handle-n, .react-resizable-handle-s { left: 50%; margin-left: -10px; cursor: ns-resize; } + .react-resizable-handle-n { top: 0; transform: rotate(225deg); } + .react-resizable-handle-s { bottom: 0; transform: rotate(45deg); } + .react-grid-layout { position: relative; transition: height 200ms ease; } + .react-grid-item { transition: all 200ms ease; transition-property: left, top; } + .react-grid-item.cssTransforms { transition-property: transform; } + .react-grid-item.resizing { z-index: 1; will-change: width, height; @@ -124,9 +139,11 @@ .react-resizable-hide > .react-resizable-handle { display: none; } + .dashboard-card { height: 100%; width: 100%; + .ant-card-body { height: 80%; width: 100%; @@ -139,12 +156,16 @@ // align-items: center; // justify-content: center; } + .ant-spin-nested-loading { height: 100%; + .ant-spin-container { height: 100%; + .ant-table { height: 100%; + .ant-table-container { height: 100%; } diff --git a/client/src/components/dashboard-grid/dashboard-grid.utils.js b/client/src/components/dashboard-grid/dashboard-grid.utils.js index d7215d1b4..a5fde93ba 100644 --- a/client/src/components/dashboard-grid/dashboard-grid.utils.js +++ b/client/src/components/dashboard-grid/dashboard-grid.utils.js @@ -1,3 +1,3 @@ export function GenerateDashboardData(data) { - return data; + return data; } diff --git a/client/src/components/data-label/data-label.component.jsx b/client/src/components/data-label/data-label.component.jsx index f56d7c391..d95dbe697 100644 --- a/client/src/components/data-label/data-label.component.jsx +++ b/client/src/components/data-label/data-label.component.jsx @@ -1,46 +1,46 @@ -import { Typography } from "antd"; +import {Typography} from "antd"; import React from "react"; export default function DataLabel({ - label, - hideIfNull, - children, - vertical, - visible = true, - valueStyle = {}, - valueClassName, - onValueClick, - ...props -}) { - if (!visible || (hideIfNull && !!!children)) return null; + label, + hideIfNull, + children, + vertical, + open = true, + valueStyle = {}, + valueClassName, + onValueClick, + ...props + }) { + if (!open || (hideIfNull && !!!children)) return null; - return ( -
-
- {`${label}:`} -
-
- {typeof children === "string" ? ( - {children} - ) : ( - children - )} -
-
- ); + return ( +
+
+ {`${label}:`} +
+
+ {typeof children === "string" ? ( + {children} + ) : ( + children + )} +
+
+ ); } diff --git a/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx b/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx index 4bedf528f..369dc18f4 100644 --- a/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx +++ b/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx @@ -1,153 +1,153 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Form, Input, Table } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Form, Input, Table} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(DmsAllocationsSummaryAp); -export function DmsAllocationsSummaryAp({ socket, bodyshop, billids, title }) { - const { t } = useTranslation(); - const [allocationsSummary, setAllocationsSummary] = useState([]); +export function DmsAllocationsSummaryAp({socket, bodyshop, billids, title}) { + const {t} = useTranslation(); + const [allocationsSummary, setAllocationsSummary] = useState([]); - useEffect(() => { - socket.on("ap-export-success", (billid) => { - setAllocationsSummary((allocationsSummary) => - allocationsSummary.map((a) => { - if (a.billid !== billid) return a; - return { ...a, status: "Successful" }; - }) - ); - }); - socket.on("ap-export-failure", ({ billid, error }) => { - allocationsSummary.map((a) => { - if (a.billid !== billid) return a; - return { ...a, status: error }; - }); - }); - - if (socket.disconnected) socket.connect(); - return () => { - socket.removeListener("ap-export-success"); - socket.removeListener("ap-export-failure"); - //socket.disconnect(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - if (socket.connected) { - socket.emit("pbs-calculate-allocations-ap", billids, (ack) => { - setAllocationsSummary(ack); - - socket.allocationsSummary = ack; - }); - } - }, [socket, socket.connected, billids]); - console.log(allocationsSummary); - const columns = [ - { - title: t("general.labels.status"), - dataIndex: "status", - key: "status", - }, - { - title: t("bills.fields.invoice_number"), - dataIndex: ["Posting", "Reference"], - key: "reference", - }, - - { - title: t("jobs.fields.dms.lines"), - dataIndex: "Lines", - key: "Lines", - render: (text, record) => ( -
- - - - - - {record.Posting.Lines.map((l, idx) => ( - - - - - - ))} -
{t("bills.fields.invoice_number")}{t("bodyshop.fields.dms.dms_acctnumber")}{t("jobs.fields.dms.amount")}
{l.InvoiceNumber}{l.Account}{l.Amount}
- ), - }, - ]; - - const handleFinish = async (values) => { - socket.emit(`pbs-export-ap`, { - billids, - txEnvelope: values, - }); - }; - - return ( - { - socket.emit("pbs-calculate-allocations-ap", billids, (ack) => - setAllocationsSummary(ack) + useEffect(() => { + socket.on("ap-export-success", (billid) => { + setAllocationsSummary((allocationsSummary) => + allocationsSummary.map((a) => { + if (a.billid !== billid) return a; + return {...a, status: "Successful"}; + }) ); - }} + }); + socket.on("ap-export-failure", ({billid, error}) => { + allocationsSummary.map((a) => { + if (a.billid !== billid) return a; + return {...a, status: error}; + }); + }); + + if (socket.disconnected) socket.connect(); + return () => { + socket.removeListener("ap-export-success"); + socket.removeListener("ap-export-failure"); + //socket.disconnect(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (socket.connected) { + socket.emit("pbs-calculate-allocations-ap", billids, (ack) => { + setAllocationsSummary(ack); + + socket.allocationsSummary = ack; + }); + } + }, [socket, socket.connected, billids]); + console.log(allocationsSummary); + const columns = [ + { + title: t("general.labels.status"), + dataIndex: "status", + key: "status", + }, + { + title: t("bills.fields.invoice_number"), + dataIndex: ["Posting", "Reference"], + key: "reference", + }, + + { + title: t("jobs.fields.dms.lines"), + dataIndex: "Lines", + key: "Lines", + render: (text, record) => ( + + + + + + + {record.Posting.Lines.map((l, idx) => ( + + + + + + ))} +
{t("bills.fields.invoice_number")}{t("bodyshop.fields.dms.dms_acctnumber")}{t("jobs.fields.dms.amount")}
{l.InvoiceNumber}{l.Account}{l.Amount}
+ ), + }, + ]; + + const handleFinish = async (values) => { + socket.emit(`pbs-export-ap`, { + billids, + txEnvelope: values, + }); + }; + + return ( + { + socket.emit("pbs-calculate-allocations-ap", billids, (ack) => + setAllocationsSummary(ack) + ); + }} + > + + + } > - - - } - > - `${record.InvoiceNumber}${record.Account}`} - dataSource={allocationsSummary} - locale={{ emptyText: t("dms.labels.refreshallocations") }} - /> - - - - - - - - ); +
`${record.InvoiceNumber}${record.Account}`} + dataSource={allocationsSummary} + locale={{emptyText: t("dms.labels.refreshallocations")}} + /> + + + + + + + + ); } diff --git a/client/src/components/dms-allocations-summary/dms-allocations-summary.component.jsx b/client/src/components/dms-allocations-summary/dms-allocations-summary.component.jsx index 7c9944149..68c65aacf 100644 --- a/client/src/components/dms-allocations-summary/dms-allocations-summary.component.jsx +++ b/client/src/components/dms-allocations-summary/dms-allocations-summary.component.jsx @@ -1,142 +1,142 @@ -import { Alert, Button, Card, Table, Typography } from "antd"; -import React, { useState, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Alert, Button, Card, Table, Typography} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import Dinero from "dinero.js"; -import { SyncOutlined } from "@ant-design/icons"; +import {SyncOutlined} from "@ant-design/icons"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(DmsAllocationsSummary); -export function DmsAllocationsSummary({ socket, bodyshop, jobId, title }) { - const { t } = useTranslation(); - const [allocationsSummary, setAllocationsSummary] = useState([]); +export function DmsAllocationsSummary({socket, bodyshop, jobId, title}) { + const {t} = useTranslation(); + const [allocationsSummary, setAllocationsSummary] = useState([]); - useEffect(() => { - if (socket.connected) { - socket.emit("cdk-calculate-allocations", jobId, (ack) => { - setAllocationsSummary(ack); - socket.allocationsSummary = ack; - }); - } - }, [socket, socket.connected, jobId]); + useEffect(() => { + if (socket.connected) { + socket.emit("cdk-calculate-allocations", jobId, (ack) => { + setAllocationsSummary(ack); + socket.allocationsSummary = ack; + }); + } + }, [socket, socket.connected, jobId]); - const columns = [ - { - title: t("jobs.fields.dms.center"), - dataIndex: "center", - key: "center", - }, - { - title: t("jobs.fields.dms.sale"), - dataIndex: "sale", - key: "sale", - render: (text, record) => Dinero(record.sale).toFormat(), - }, - { - title: t("jobs.fields.dms.cost"), - dataIndex: "cost", - key: "cost", - render: (text, record) => Dinero(record.cost).toFormat(), - }, - { - title: t("jobs.fields.dms.sale_dms_acctnumber"), - dataIndex: "sale_dms_acctnumber", - key: "sale_dms_acctnumber", - render: (text, record) => - record.profitCenter && record.profitCenter.dms_acctnumber, - }, - { - title: t("jobs.fields.dms.cost_dms_acctnumber"), - dataIndex: "cost_dms_acctnumber", - key: "cost_dms_acctnumber", - render: (text, record) => - record.costCenter && record.costCenter.dms_acctnumber, - }, - { - title: t("jobs.fields.dms.dms_wip_acctnumber"), - dataIndex: "dms_wip_acctnumber", - key: "dms_wip_acctnumber", - render: (text, record) => - record.costCenter && record.costCenter.dms_wip_acctnumber, - }, - ]; + const columns = [ + { + title: t("jobs.fields.dms.center"), + dataIndex: "center", + key: "center", + }, + { + title: t("jobs.fields.dms.sale"), + dataIndex: "sale", + key: "sale", + render: (text, record) => Dinero(record.sale).toFormat(), + }, + { + title: t("jobs.fields.dms.cost"), + dataIndex: "cost", + key: "cost", + render: (text, record) => Dinero(record.cost).toFormat(), + }, + { + title: t("jobs.fields.dms.sale_dms_acctnumber"), + dataIndex: "sale_dms_acctnumber", + key: "sale_dms_acctnumber", + render: (text, record) => + record.profitCenter && record.profitCenter.dms_acctnumber, + }, + { + title: t("jobs.fields.dms.cost_dms_acctnumber"), + dataIndex: "cost_dms_acctnumber", + key: "cost_dms_acctnumber", + render: (text, record) => + record.costCenter && record.costCenter.dms_acctnumber, + }, + { + title: t("jobs.fields.dms.dms_wip_acctnumber"), + dataIndex: "dms_wip_acctnumber", + key: "dms_wip_acctnumber", + render: (text, record) => + record.costCenter && record.costCenter.dms_wip_acctnumber, + }, + ]; - return ( - { - socket.emit("cdk-calculate-allocations", jobId, (ack) => - setAllocationsSummary(ack) - ); - }} + return ( + { + socket.emit("cdk-calculate-allocations", jobId, (ack) => + setAllocationsSummary(ack) + ); + }} + > + + + } > - - - } - > - {bodyshop.pbs_configuration?.disablebillwip && ( - - )} -
{ - const totals = - allocationsSummary && - allocationsSummary.reduce( - (acc, val) => { - return { - totalSale: acc.totalSale.add(Dinero(val.sale)), - totalCost: acc.totalCost.add(Dinero(val.cost)), - }; - }, - { - totalSale: Dinero(), - totalCost: Dinero(), - } - ); + {bodyshop.pbs_configuration?.disablebillwip && ( + + )} +
{ + const totals = + allocationsSummary && + allocationsSummary.reduce( + (acc, val) => { + return { + totalSale: acc.totalSale.add(Dinero(val.sale)), + totalCost: acc.totalCost.add(Dinero(val.cost)), + }; + }, + { + totalSale: Dinero(), + totalCost: Dinero(), + } + ); - return ( - - - - {t("general.labels.totals")} - - - - {totals && totals.totalSale.toFormat()} - - - { - // totals.totalCost.toFormat() - } - - - - - ); - }} - /> - - ); + return ( + + + + {t("general.labels.totals")} + + + + {totals && totals.totalSale.toFormat()} + + + { + // totals.totalCost.toFormat() + } + + + + + ); + }} + /> + + ); } diff --git a/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx b/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx index 262d1720c..b0df8abb5 100644 --- a/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx +++ b/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx @@ -1,105 +1,105 @@ -import { useLazyQuery } from "@apollo/client"; -import { Button, Input, Modal, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { SEARCH_DMS_VEHICLES } from "../../graphql/dms.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useLazyQuery} from "@apollo/client"; +import {Button, Input, Modal, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {SEARCH_DMS_VEHICLES} from "../../graphql/dms.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(DmsCdkVehicles); -export function DmsCdkVehicles({ bodyshop, form, socket, job }) { - const [visible, setVisible] = useState(false); - const [selectedModel, setSelectedModel] = useState(null); - const { t } = useTranslation(); +export function DmsCdkVehicles({bodyshop, form, socket, job}) { + const [open, setOpen] = useState(false); + const [selectedModel, setSelectedModel] = useState(null); + const {t} = useTranslation(); - const [callSearch, { loading, error, data }] = - useLazyQuery(SEARCH_DMS_VEHICLES); - const columns = [ - { - title: t("vehicles.fields.v_make_desc"), - dataIndex: "make", - key: "make", - }, - { - title: t("vehicles.fields.v_model_desc"), - dataIndex: "model", - key: "model", - }, - { - title: t("jobs.fields.dms.dms_make"), - dataIndex: "makecode", - key: "makecode", - }, - { - title: t("jobs.fields.dms.dms_model"), - dataIndex: "modelcode", - key: "modelcode", - }, - ]; + const [callSearch, {loading, error, data}] = + useLazyQuery(SEARCH_DMS_VEHICLES); + const columns = [ + { + title: t("vehicles.fields.v_make_desc"), + dataIndex: "make", + key: "make", + }, + { + title: t("vehicles.fields.v_model_desc"), + dataIndex: "model", + key: "model", + }, + { + title: t("jobs.fields.dms.dms_make"), + dataIndex: "makecode", + key: "makecode", + }, + { + title: t("jobs.fields.dms.dms_model"), + dataIndex: "modelcode", + key: "modelcode", + }, + ]; - return ( - <> - setVisible(false)} - onOk={() => { - form.setFieldsValue({ - dms_make: selectedModel.makecode, - dms_model: selectedModel.modelcode, - }); - setVisible(false); - }} - > - {error && } -
( - callSearch({ variables: { search: val } })} - placeholder={t("general.labels.search")} - /> - )} - columns={columns} - loading={loading} - rowKey="id" - dataSource={data ? data.search_dms_vehicles : []} - onRow={(record) => { - return { - onClick: () => setSelectedModel(record), - }; - }} - rowSelection={{ - onSelect: (record) => { - setSelectedModel(record); - }, + return ( + <> + setOpen(false)} + onOk={() => { + form.setFieldsValue({ + dms_make: selectedModel.makecode, + dms_model: selectedModel.modelcode, + }); + setOpen(false); + }} + > + {error && } +
( + callSearch({variables: {search: val}})} + placeholder={t("general.labels.search")} + /> + )} + columns={columns} + loading={loading} + rowKey="id" + dataSource={data ? data.search_dms_vehicles : []} + onRow={(record) => { + return { + onClick: () => setSelectedModel(record), + }; + }} + rowSelection={{ + onSelect: (record) => { + setSelectedModel(record); + }, - type: "radio", - selectedRowKeys: [selectedModel && selectedModel.id], - }} - /> - - - - ); + type: "radio", + selectedRowKeys: [selectedModel && selectedModel.id], + }} + /> + + + + ); } diff --git a/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx b/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx index f0d9ba970..74a19ed34 100644 --- a/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx +++ b/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx @@ -1,40 +1,38 @@ -import { Button } from "antd"; +import {Button} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(DmsCdkMakesRefetch); -export function DmsCdkMakesRefetch({ currentUser, bodyshop, form, socket }) { - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); +export function DmsCdkMakesRefetch({currentUser, bodyshop, form, socket}) { + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); - if (!currentUser.email.includes("@imex.")) return null; + if (!currentUser.email.includes("@imex.")) return null; - const handleRefetch = async () => { - setLoading(true); - await axios.post("/cdk/getvehicles", { - cdk_dealerid: bodyshop.cdk_dealerid, - bodyshopid: bodyshop.id, - }); + const handleRefetch = async () => { + setLoading(true); + await axios.post("/cdk/getvehicles", { + cdk_dealerid: bodyshop.cdk_dealerid, + bodyshopid: bodyshop.id, + }); - setLoading(false); - }; - return ( - - ); + setLoading(false); + }; + return ( + + ); } diff --git a/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx b/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx index 438fe22ac..88df58895 100644 --- a/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx +++ b/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx @@ -1,161 +1,161 @@ -import { Button, Table, Col, Checkbox } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { socket } from "../../pages/dms/dms.container"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { alphaSort } from "../../utils/sorters"; +import {Button, Checkbox, Col, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {socket} from "../../pages/dms/dms.container"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {alphaSort} from "../../utils/sorters"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(DmsCustomerSelector); -export function DmsCustomerSelector({ bodyshop }) { - const { t } = useTranslation(); - const [customerList, setcustomerList] = useState([]); - const [visible, setVisible] = useState(false); - const [selectedCustomer, setSelectedCustomer] = useState(null); - const [dmsType, setDmsType] = useState("cdk"); +export function DmsCustomerSelector({bodyshop}) { + const {t} = useTranslation(); + const [customerList, setcustomerList] = useState([]); + const [open, setOpen] = useState(false); + const [selectedCustomer, setSelectedCustomer] = useState(null); + const [dmsType, setDmsType] = useState("cdk"); - socket.on("cdk-select-customer", (customerList, callback) => { - setVisible(true); - setDmsType("cdk"); - setcustomerList(customerList); - }); - socket.on("pbs-select-customer", (customerList, callback) => { - setVisible(true); - setDmsType("pbs"); - setcustomerList(customerList); - }); + socket.on("cdk-select-customer", (customerList, callback) => { + setOpen(true); + setDmsType("cdk"); + setcustomerList(customerList); + }); + socket.on("pbs-select-customer", (customerList, callback) => { + setOpen(true); + setDmsType("pbs"); + setcustomerList(customerList); + }); - const onUseSelected = () => { - setVisible(false); - socket.emit(`${dmsType}-selected-customer`, selectedCustomer); - setSelectedCustomer(null); - }; + const onUseSelected = () => { + setOpen(false); + socket.emit(`${dmsType}-selected-customer`, selectedCustomer); + setSelectedCustomer(null); + }; - const onUseGeneric = () => { - setVisible(false); - socket.emit( - `${dmsType}-selected-customer`, - bodyshop.cdk_configuration.generic_customer_number + const onUseGeneric = () => { + setOpen(false); + socket.emit( + `${dmsType}-selected-customer`, + bodyshop.cdk_configuration.generic_customer_number + ); + setSelectedCustomer(null); + }; + + const onCreateNew = () => { + setOpen(false); + socket.emit(`${dmsType}-selected-customer`, null); + setSelectedCustomer(null); + }; + + const cdkColumns = [ + { + title: t("jobs.fields.dms.id"), + dataIndex: ["id", "value"], + key: "id", + }, + { + title: t("jobs.fields.dms.vinowner"), + dataIndex: "vinOwner", + key: "vinOwner", + render: (text, record) => , + }, + { + title: t("jobs.fields.dms.name1"), + dataIndex: ["name1", "fullName"], + key: "name1", + sorter: (a, b) => + alphaSort(a.name1 && a.name1.fullName, b.name1 && b.name1.fullName), + }, + + { + title: t("jobs.fields.dms.address"), + //dataIndex: ["name2", "fullName"], + key: "address", + render: (record, value) => + `${ + record.address && + record.address.addressLine && + record.address.addressLine[0] + }, ${record.address && record.address.city} ${ + record.address && record.address.stateOrProvince + } ${record.address && record.address.postalCode}`, + }, + ]; + + const pbsColumns = [ + { + title: t("jobs.fields.dms.id"), + dataIndex: "ContactId", + key: "ContactId", + }, + { + title: t("jobs.fields.dms.name1"), + key: "name1", + sorter: (a, b) => alphaSort(a.LastName, b.LastName), + render: (text, record) => + `${record.FirstName || ""} ${record.LastName || ""}`, + }, + + { + title: t("jobs.fields.dms.address"), + key: "address", + render: (record, value) => + `${record.Address}, ${record.City} ${record.State} ${record.ZipCode}`, + }, + ]; + + if (!open) return null; + return ( + +
( +
+ + + +
+ )} + pagination={{position: "top"}} + columns={dmsType === "cdk" ? cdkColumns : pbsColumns} + rowKey={(record) => + dmsType === "cdk" ? record.id.value : record.ContactId + } + dataSource={customerList} + //onChange={handleTableChange} + rowSelection={{ + onSelect: (record) => { + setSelectedCustomer( + dmsType === "cdk" ? record.id.value : record.ContactId + ); + }, + type: "radio", + selectedRowKeys: [selectedCustomer], + }} + /> + ); - setSelectedCustomer(null); - }; - - const onCreateNew = () => { - setVisible(false); - socket.emit(`${dmsType}-selected-customer`, null); - setSelectedCustomer(null); - }; - - const cdkColumns = [ - { - title: t("jobs.fields.dms.id"), - dataIndex: ["id", "value"], - key: "id", - }, - { - title: t("jobs.fields.dms.vinowner"), - dataIndex: "vinOwner", - key: "vinOwner", - render: (text, record) => , - }, - { - title: t("jobs.fields.dms.name1"), - dataIndex: ["name1", "fullName"], - key: "name1", - sorter: (a, b) => - alphaSort(a.name1 && a.name1.fullName, b.name1 && b.name1.fullName), - }, - - { - title: t("jobs.fields.dms.address"), - //dataIndex: ["name2", "fullName"], - key: "address", - render: (record, value) => - `${ - record.address && - record.address.addressLine && - record.address.addressLine[0] - }, ${record.address && record.address.city} ${ - record.address && record.address.stateOrProvince - } ${record.address && record.address.postalCode}`, - }, - ]; - - const pbsColumns = [ - { - title: t("jobs.fields.dms.id"), - dataIndex: "ContactId", - key: "ContactId", - }, - { - title: t("jobs.fields.dms.name1"), - key: "name1", - sorter: (a, b) => alphaSort(a.LastName, b.LastName), - render: (text, record) => - `${record.FirstName || ""} ${record.LastName || ""}`, - }, - - { - title: t("jobs.fields.dms.address"), - key: "address", - render: (record, value) => - `${record.Address}, ${record.City} ${record.State} ${record.ZipCode}`, - }, - ]; - - if (!visible) return null; - return ( - -
( -
- - - -
- )} - pagination={{ position: "top" }} - columns={dmsType === "cdk" ? cdkColumns : pbsColumns} - rowKey={(record) => - dmsType === "cdk" ? record.id.value : record.ContactId - } - dataSource={customerList} - //onChange={handleTableChange} - rowSelection={{ - onSelect: (record) => { - setSelectedCustomer( - dmsType === "cdk" ? record.id.value : record.ContactId - ); - }, - type: "radio", - selectedRowKeys: [selectedCustomer], - }} - /> - - ); } diff --git a/client/src/components/dms-log-events/dms-log-events.component.jsx b/client/src/components/dms-log-events/dms-log-events.component.jsx index 8925262dd..b372df6e2 100644 --- a/client/src/components/dms-log-events/dms-log-events.component.jsx +++ b/client/src/components/dms-log-events/dms-log-events.component.jsx @@ -1,57 +1,56 @@ -import { Divider, Space, Tag, Timeline } from "antd"; -import moment from "moment"; +import {Divider, Space, Tag, Timeline} from "antd"; +import dayjs from "../../utils/day"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export default connect(mapStateToProps, mapDispatchToProps)(DmsLogEvents); -export function DmsLogEvents({ socket, logs, bodyshop }) { - return ( - - {logs.map((log, idx) => ( - - - {log.level} - {moment(log.timestamp).format("MM/DD/YYYY HH:mm:ss")} - - {log.message} - - - ))} - - ); +export function DmsLogEvents({socket, logs, bodyshop}) { + return ( + ({ + key: idx, + color: LogLevelHierarchy(log.level), + children: ( + + {log.level} + {dayjs(log.timestamp).format("MM/DD/YYYY HH:mm:ss")} + + {log.message} + + ), + }))} + /> + ); } function LogLevelHierarchy(level) { - switch (level) { - case "TRACE": - return "pink"; - case "DEBUG": - return "orange"; - case "INFO": - return "blue"; - case "WARNING": - return "yellow"; - case "ERROR": - return "red"; - default: - return 0; - } + switch (level) { + case "TRACE": + return "pink"; + case "DEBUG": + return "orange"; + case "INFO": + return "blue"; + case "WARNING": + return "yellow"; + case "ERROR": + return "red"; + default: + return 0; + } } diff --git a/client/src/components/dms-post-form/dms-post-form.component.jsx b/client/src/components/dms-post-form/dms-post-form.component.jsx index f575c096e..654a7ec79 100644 --- a/client/src/components/dms-post-form/dms-post-form.component.jsx +++ b/client/src/components/dms-post-form/dms-post-form.component.jsx @@ -1,27 +1,26 @@ -import { DeleteFilled, DownOutlined } from "@ant-design/icons"; +import {DeleteFilled, DownOutlined} from "@ant-design/icons"; import { - Button, - Card, - Divider, - Dropdown, - Form, - Input, - InputNumber, - Menu, - Select, - Space, - Statistic, - Switch, - Typography, + Button, + Card, + Divider, + Dropdown, + Form, + Input, + InputNumber, + Select, + Space, + Statistic, + Switch, + Typography, } from "antd"; import Dinero from "dinero.js"; -import moment from "moment"; +import dayjs from "../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { determineDmsType } from "../../pages/dms/dms.container"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {determineDmsType} from "../../pages/dms/dms.container"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import i18n from "../../translations/i18n"; import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component"; import DmsCdkMakesRefetch from "../dms-cdk-makes/dms-cdk-makes.refetch.component"; @@ -30,440 +29,425 @@ import CurrencyInput from "../form-items-formatted/currency-form-item.component" import LayoutFormRow from "../layout-form-row/layout-form-row.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(DmsPostForm); -export function DmsPostForm({ bodyshop, socket, job, logsRef }) { - const [form] = Form.useForm(); - const { t } = useTranslation(); +export function DmsPostForm({bodyshop, socket, job, logsRef}) { + const [form] = Form.useForm(); + const {t} = useTranslation(); - const handlePayerSelect = (value, index) => { - form.setFieldsValue({ - payers: form.getFieldValue("payers").map((payer, mapIndex) => { - if (index !== mapIndex) return payer; - const cdkPayer = - bodyshop.cdk_configuration.payers && - bodyshop.cdk_configuration.payers.find((i) => i.name === value); + const handlePayerSelect = (value, index) => { + form.setFieldsValue({ + payers: form.getFieldValue("payers").map((payer, mapIndex) => { + if (index !== mapIndex) return payer; + const cdkPayer = + bodyshop.cdk_configuration.payers && + bodyshop.cdk_configuration.payers.find((i) => i.name === value); - if (!cdkPayer) return payer; + if (!cdkPayer) return payer; - return { - ...cdkPayer, - dms_acctnumber: cdkPayer.dms_acctnumber, - controlnumber: job && job[cdkPayer.control_type], - }; - }), - }); - }; - - const handleFinish = (values) => { - socket.emit(`${determineDmsType(bodyshop)}-export-job`, { - jobid: job.id, - txEnvelope: values, - }); - console.log(logsRef); - if (logsRef) { - console.log("executing", logsRef); - logsRef.curent && - logsRef.current.scrollIntoView({ - behavior: "smooth", + return { + ...cdkPayer, + dms_acctnumber: cdkPayer.dms_acctnumber, + controlnumber: job && job[cdkPayer.control_type], + }; + }), }); - } - }; + }; - return ( - -
- - - - - - - - - - - + const handleFinish = (values) => { + socket.emit(`${determineDmsType(bodyshop)}-export-job`, { + jobid: job.id, + txEnvelope: values, + }); + console.log(logsRef); + if (logsRef) { + console.log("executing", logsRef); + logsRef.curent && + logsRef.current.scrollIntoView({ + behavior: "smooth", + }); + } + }; - {bodyshop.cdk_dealerid && ( -
- - - - - - - - - - - - - - - - - - - - - -
- )} - - - - - - - - - - - - {(fields, { add, remove }) => { - return ( -
- {fields.map((field, index) => ( - - - - - - - - - - - - - - - - {t("jobs.fields.dms.payer.controlnumber")}{" "} - - {bodyshop.cdk_configuration.controllist && - bodyshop.cdk_configuration.controllist.map( - (key, idx) => ( - { - form.setFieldsValue({ - payers: form - .getFieldValue("payers") - .map((row, mapIndex) => { - if (index !== mapIndex) - return row; - - return { - ...row, - controlnumber: - key.controlnumber, - }; - }), - }); - }} - > - {key.name} - - ) - )} - - } - > - e.preventDefault()}> - - - -
+ return ( + + + + - - + > + + + + + + + + + - - {() => { - const payers = form.getFieldValue("payers"); - - const row = payers && payers[index]; - - const cdkPayer = - bodyshop.cdk_configuration.payers && - bodyshop.cdk_configuration.payers.find( - (i) => i && row && i.name === row.name - ); - if ( - i18n.exists(`jobs.fields.${cdkPayer?.control_type}`) - ) - return ( -
- {cdkPayer && - t(`jobs.fields.${cdkPayer?.control_type}`)} -
- ); - else if ( - i18n.exists( - `jobs.fields.dms.control_type.${cdkPayer?.control_type}` - ) - ) { - return ( -
- {cdkPayer && - t( - `jobs.fields.dms.control_type.${cdkPayer?.control_type}` - )} -
- ); - } else { - return null; - } - }} -
- - { - remove(field.name); - }} - /> - - - ))} - - - - - ); - }} -
- - {() => { - //Perform Calculation to determine discrepancy. - let totalAllocated = Dinero(); - - const payers = form.getFieldValue("payers"); - payers && - payers.forEach((payer) => { - totalAllocated = totalAllocated.add( - Dinero({ amount: Math.round((payer?.amount || 0) * 100) }) - ); - }); - - const totals = - socket.allocationsSummary && - socket.allocationsSummary.reduce( - (acc, val) => { - return { - totalSale: acc.totalSale.add(Dinero(val.sale)), - totalCost: acc.totalCost.add(Dinero(val.cost)), - }; - }, - { - totalSale: Dinero(), - totalCost: Dinero(), - } - ); - const discrep = totals - ? totals.totalSale.subtract(totalAllocated) - : Dinero(); - return ( - - - - - - = - - - - ); - }} - - -
- ); + + + + + + + + + + + {(fields, {add, remove}) => { + return ( +
+ {fields.map((field, index) => ( + + + + + + + + + + + + + + + + {t("jobs.fields.dms.payer.controlnumber")}{" "} + ({ + key: idx, + label: key.name, + onClick: () => { + form.setFieldsValue({ + payers: form.getFieldValue("payers").map((row, mapIndex) => { + if (index !== mapIndex) return row; + return { + ...row, + controlnumber: key.controlnumber, + }; + }), + }); + }, + })) + }}> + e.preventDefault()}> + + + +
+ } + key={`${index}controlnumber`} + name={[field.name, "controlnumber"]} + rules={[ + { + required: true, + }, + ]} + > + + + + + {() => { + const payers = form.getFieldValue("payers"); + + const row = payers && payers[index]; + + const cdkPayer = + bodyshop.cdk_configuration.payers && + bodyshop.cdk_configuration.payers.find( + (i) => i && row && i.name === row.name + ); + if ( + i18n.exists(`jobs.fields.${cdkPayer?.control_type}`) + ) + return ( +
+ {cdkPayer && + t(`jobs.fields.${cdkPayer?.control_type}`)} +
+ ); + else if ( + i18n.exists( + `jobs.fields.dms.control_type.${cdkPayer?.control_type}` + ) + ) { + return ( +
+ {cdkPayer && + t( + `jobs.fields.dms.control_type.${cdkPayer?.control_type}` + )} +
+ ); + } else { + return null; + } + }} +
+ + { + remove(field.name); + }} + /> + + + ))} + + + + + ); + }} +
+ + {() => { + //Perform Calculation to determine discrepancy. + let totalAllocated = Dinero(); + + const payers = form.getFieldValue("payers"); + payers && + payers.forEach((payer) => { + totalAllocated = totalAllocated.add( + Dinero({amount: Math.round((payer?.amount || 0) * 100)}) + ); + }); + + const totals = + socket.allocationsSummary && + socket.allocationsSummary.reduce( + (acc, val) => { + return { + totalSale: acc.totalSale.add(Dinero(val.sale)), + totalCost: acc.totalCost.add(Dinero(val.cost)), + }; + }, + { + totalSale: Dinero(), + totalCost: Dinero(), + } + ); + const discrep = totals + ? totals.totalSale.subtract(totalAllocated) + : Dinero(); + return ( + + + - + + = + + + + ); + }} + + + + ); } diff --git a/client/src/components/document-editor/document-editor.component.jsx b/client/src/components/document-editor/document-editor.component.jsx index ab2733c13..d1d1df491 100644 --- a/client/src/components/document-editor/document-editor.component.jsx +++ b/client/src/components/document-editor/document-editor.component.jsx @@ -1,111 +1,110 @@ //import "tui-image-editor/dist/tui-image-editor.css"; -import { Result } from "antd"; +import {Result} from "antd"; import * as markerjs2 from "markerjs2"; -import React, { useCallback, useEffect, useRef, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { handleUpload } from "../documents-upload/documents-upload.utility"; -import { GenerateSrcUrl } from "../jobs-documents-gallery/job-documents.utility"; +import React, {useCallback, useEffect, useRef, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {handleUpload} from "../documents-upload/documents-upload.utility"; +import {GenerateSrcUrl} from "../jobs-documents-gallery/job-documents.utility"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function DocumentEditorComponent({ currentUser, bodyshop, document }) { - const imgRef = useRef(null); - const [loading, setLoading] = useState(false); - const [uploaded, setuploaded] = useState(false); - const markerArea = useRef(null); - const { t } = useTranslation(); +export function DocumentEditorComponent({currentUser, bodyshop, document}) { + const imgRef = useRef(null); + const [loading, setLoading] = useState(false); + const [uploaded, setuploaded] = useState(false); + const markerArea = useRef(null); + const {t} = useTranslation(); - const triggerUpload = useCallback( - async (dataUrl) => { - setLoading(true); - handleUpload( - { - filename: `${document.key.split("/").pop()}-${Date.now()}.jpg`, - file: await b64toBlob(dataUrl), - onSuccess: () => { - setLoading(false); - setuploaded(true); - }, - onError: () => setLoading(false), + const triggerUpload = useCallback( + async (dataUrl) => { + setLoading(true); + handleUpload( + { + filename: `${document.key.split("/").pop()}-${Date.now()}.jpg`, + file: await b64toBlob(dataUrl), + onSuccess: () => { + setLoading(false); + setuploaded(true); + }, + onError: () => setLoading(false), + }, + { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: document.jobid, + //billId: billId, + tagsArray: ["edited"], + //callback: callbackAfterUpload, + } + ); }, - { - bodyshop: bodyshop, - uploaded_by: currentUser.email, - jobId: document.jobid, - //billId: billId, - tagsArray: ["edited"], - //callback: callbackAfterUpload, + [bodyshop, currentUser, document] + ); + + useEffect(() => { + if (imgRef.current !== null) { + // create a marker.js MarkerArea + markerArea.current = new markerjs2.MarkerArea(imgRef.current); + + // attach an event handler to assign annotated image back to our image element + markerArea.current.addEventListener("close", (closeEvent) => { + }); + + markerArea.current.addEventListener("render", (event) => { + const dataUrl = event.dataUrl; + imgRef.current.src = dataUrl; + markerArea.current.close(); + triggerUpload(dataUrl); + }); + // launch marker.js + + markerArea.current.renderAtNaturalSize = true; + markerArea.current.renderImageType = "image/jpeg"; + markerArea.current.renderImageQuality = 1; + //markerArea.current.settings.displayMode = "inline"; + markerArea.current.show(); } - ); - }, - [bodyshop, currentUser, document] - ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [triggerUpload]); - useEffect(() => { - if (imgRef.current !== null) { - // create a marker.js MarkerArea - markerArea.current = new markerjs2.MarkerArea(imgRef.current); - - // attach an event handler to assign annotated image back to our image element - markerArea.current.addCloseEventListener((closeEvent) => {}); - - markerArea.current.addRenderEventListener((dataUrl) => { - imgRef.current.src = dataUrl; - markerArea.current.close(); - triggerUpload(dataUrl); - }); - // launch marker.js - - markerArea.current.renderAtNaturalSize = true; - markerArea.current.renderImageType = "image/jpeg"; - markerArea.current.renderImageQuality = 1; - //markerArea.current.settings.displayMode = "inline"; - markerArea.current.show(); + async function b64toBlob(url) { + const res = await fetch(url); + return await res.blob(); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [triggerUpload]); - async function b64toBlob(url) { - const res = await fetch(url); - return await res.blob(); - } - - return ( -
- {!loading && !uploaded && ( - sample - )} - {loading && } - {uploaded && ( - - )} -
- ); + return ( +
+ {!loading && !uploaded && ( + sample + )} + {loading && } + {uploaded && ( + + )} +
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(DocumentEditorComponent); diff --git a/client/src/components/document-editor/document-editor.container.jsx b/client/src/components/document-editor/document-editor.container.jsx index b7a51890c..fa79bc6c3 100644 --- a/client/src/components/document-editor/document-editor.container.jsx +++ b/client/src/components/document-editor/document-editor.container.jsx @@ -1,62 +1,62 @@ -import { useQuery } from "@apollo/client"; -import { Result } from "antd"; +import {useQuery} from "@apollo/client"; +import {Result} from "antd"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router"; -import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries"; -import { GET_DOCUMENT_BY_PK } from "../../graphql/documents.queries"; -import { setBodyshop } from "../../redux/user/user.actions"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {QUERY_BODYSHOP} from "../../graphql/bodyshop.queries"; +import {GET_DOCUMENT_BY_PK} from "../../graphql/documents.queries"; +import {setBodyshop} from "../../redux/user/user.actions"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import DocumentEditor from "./document-editor.component"; const mapDispatchToProps = (dispatch) => ({ - setBodyshop: (bs) => dispatch(setBodyshop(bs)), + setBodyshop: (bs) => dispatch(setBodyshop(bs)), }); export default connect(null, mapDispatchToProps)(DocumentEditorContainer); -export function DocumentEditorContainer({ setBodyshop }) { - //Get the image details for the image to be saved. - //Get the document id from the search string. - const { documentId } = queryString.parse(useLocation().search); - const { t } = useTranslation(); - const { - loading: loadingShop, - error: errorShop, - data: dataShop, - } = useQuery(QUERY_BODYSHOP, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +export function DocumentEditorContainer({setBodyshop}) { + //Get the image details for the image to be saved. + //Get the document id from the search string. + const {documentId} = queryString.parse(useLocation().search); + const {t} = useTranslation(); + const { + loading: loadingShop, + error: errorShop, + data: dataShop, + } = useQuery(QUERY_BODYSHOP, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - if (dataShop) setBodyshop(dataShop.bodyshops[0]); - }, [dataShop, setBodyshop]); + useEffect(() => { + if (dataShop) setBodyshop(dataShop.bodyshops[0]); + }, [dataShop, setBodyshop]); - const { loading, error, data } = useQuery(GET_DOCUMENT_BY_PK, { - variables: { documentId }, - skip: !documentId, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data} = useQuery(GET_DOCUMENT_BY_PK, { + variables: {documentId}, + skip: !documentId, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (loading || loadingShop) return ; - if (error || errorShop) + if (loading || loadingShop) return ; + if (error || errorShop) + return ( + + ); + + if (!data || !data.documents_by_pk) + return ; return ( - +
+ +
); - - if (!data || !data.documents_by_pk) - return ; - return ( -
- -
- ); } diff --git a/client/src/components/documents-local-upload/documents-local-upload.component.jsx b/client/src/components/documents-local-upload/documents-local-upload.component.jsx index 9d4e6ed2f..087c6f255 100644 --- a/client/src/components/documents-local-upload/documents-local-upload.component.jsx +++ b/client/src/components/documents-local-upload/documents-local-upload.component.jsx @@ -1,73 +1,71 @@ -import { UploadOutlined } from "@ant-design/icons"; -import { Upload } from "antd"; -import React, { useState } from "react"; +import {UploadOutlined} from "@ant-design/icons"; +import {Upload} from "antd"; +import React, {useState} from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { handleUpload } from "./documents-local-upload.utility"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {handleUpload} from "./documents-local-upload.utility"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, }); export function DocumentsLocalUploadComponent({ - children, - currentUser, - bodyshop, - job, - vendorid, - invoice_number, - callbackAfterUpload, - allowAllTypes, -}) { - const [fileList, setFileList] = useState([]); + children, + currentUser, + bodyshop, + job, + vendorid, + invoice_number, + callbackAfterUpload, + allowAllTypes, + }) { + const [fileList, setFileList] = useState([]); - const handleDone = (uid) => { - setTimeout(() => { - setFileList((fileList) => fileList.filter((x) => x.uid !== uid)); - }, 2000); - }; + const handleDone = (uid) => { + setTimeout(() => { + setFileList((fileList) => fileList.filter((x) => x.uid !== uid)); + }, 2000); + }; - return ( - { - if (f.event && f.event.percent === 100) handleDone(f.file.uid); + return ( + { + if (f.event && f.event.percent === 100) handleDone(f.file.uid); - setFileList(f.fileList); - }} - customRequest={(ev) => - handleUpload({ - ev, - context: { - jobid: job.id, - vendorid, - invoice_number, - callback: callbackAfterUpload, - }, - }) - } - {...(!allowAllTypes && { - accept: "audio/*, video/*, image/*, .pdf, .doc, .docx, .xls, .xlsx", - })} - > - {children || ( - <> -

- -

-

- Click or drag files to this area to upload. -

- - )} -
- ); + setFileList(f.fileList); + }} + customRequest={(ev) => + handleUpload({ + ev, + context: { + jobid: job.id, + vendorid, + invoice_number, + callback: callbackAfterUpload, + }, + }) + } + {...(!allowAllTypes && { + accept: "audio/*, video/*, image/*, .pdf, .doc, .docx, .xls, .xlsx", + })} + > + {children || ( + <> +

+ +

+

+ Click or drag files to this area to upload. +

+ + )} +
+ ); } + export default connect(mapStateToProps, null)(DocumentsLocalUploadComponent); diff --git a/client/src/components/documents-local-upload/documents-local-upload.utility.js b/client/src/components/documents-local-upload/documents-local-upload.utility.js index eba5e96fb..eb9a97ed7 100644 --- a/client/src/components/documents-local-upload/documents-local-upload.utility.js +++ b/client/src/components/documents-local-upload/documents-local-upload.utility.js @@ -1,80 +1,80 @@ import cleanAxios from "../../utils/CleanAxios"; -import { store } from "../../redux/store"; -import { addMediaForJob } from "../../redux/media/media.actions"; +import {store} from "../../redux/store"; +import {addMediaForJob} from "../../redux/media/media.actions"; import normalizeUrl from "normalize-url"; -import { notification } from "antd"; +import {notification} from "antd"; import i18n from "i18next"; -export const handleUpload = async ({ ev, context }) => { - const { onError, onSuccess, onProgress, file } = ev; - const { jobid, invoice_number, vendorid, callbackAfterUpload } = context; +export const handleUpload = async ({ev, context}) => { + const {onError, onSuccess, onProgress, file} = ev; + const {jobid, invoice_number, vendorid, callbackAfterUpload} = context; - const bodyshop = store.getState().user.bodyshop; - var options = { - headers: { - "X-Requested-With": "XMLHttpRequest", - ims_token: bodyshop.localmediatoken, - }, - onUploadProgress: (e) => { - if (!!onProgress) onProgress({ percent: (e.loaded / e.total) * 100 }); - }, - }; + const bodyshop = store.getState().user.bodyshop; + var options = { + headers: { + "X-Requested-With": "XMLHttpRequest", + ims_token: bodyshop.localmediatoken, + }, + onUploadProgress: (e) => { + if (!!onProgress) onProgress({percent: (e.loaded / e.total) * 100}); + }, + }; - const formData = new FormData(); + const formData = new FormData(); - formData.append("jobid", jobid); - if (invoice_number) { - formData.append("invoice_number", invoice_number); - formData.append("vendorid", vendorid); - } - formData.append("file", file); - - const imexMediaServerResponse = await cleanAxios.post( - normalizeUrl( - `${bodyshop.localmediaserverhttp}/${ - invoice_number ? "bills" : "jobs" - }/upload` - ), - formData, - { - ...options, + formData.append("jobid", jobid); + if (invoice_number) { + formData.append("invoice_number", invoice_number); + formData.append("vendorid", vendorid); } - ); + formData.append("file", file); - if (imexMediaServerResponse.status !== 200) { - if (!!onError) { - onError(imexMediaServerResponse.statusText); - } - } else { - onSuccess && onSuccess(file); - notification.open({ - type: "success", - key: "docuploadsuccess", - message: i18n.t("documents.successes.insert"), - }); - store.dispatch( - addMediaForJob({ - jobid, - media: imexMediaServerResponse.data.map((d) => { - return { - ...d, - selected: false, - src: normalizeUrl(`${bodyshop.localmediaserverhttp}/${d.src}`), - ...(d.optimized && { - optimized: normalizeUrl( - `${bodyshop.localmediaserverhttp}/${d.optimized}` - ), - }), - thumbnail: normalizeUrl( - `${bodyshop.localmediaserverhttp}/${d.thumbnail}` - ), - }; - }), - }) + const imexMediaServerResponse = await cleanAxios.post( + normalizeUrl( + `${bodyshop.localmediaserverhttp}/${ + invoice_number ? "bills" : "jobs" + }/upload` + ), + formData, + { + ...options, + } ); - } - if (callbackAfterUpload) { - callbackAfterUpload(); - } + if (imexMediaServerResponse.status !== 200) { + if (!!onError) { + onError(imexMediaServerResponse.statusText); + } + } else { + onSuccess && onSuccess(file); + notification.open({ + type: "success", + key: "docuploadsuccess", + message: i18n.t("documents.successes.insert"), + }); + store.dispatch( + addMediaForJob({ + jobid, + media: imexMediaServerResponse.data.map((d) => { + return { + ...d, + selected: false, + src: normalizeUrl(`${bodyshop.localmediaserverhttp}/${d.src}`), + ...(d.optimized && { + optimized: normalizeUrl( + `${bodyshop.localmediaserverhttp}/${d.optimized}` + ), + }), + thumbnail: normalizeUrl( + `${bodyshop.localmediaserverhttp}/${d.thumbnail}` + ), + }; + }), + }) + ); + } + + if (callbackAfterUpload) { + callbackAfterUpload(); + } }; diff --git a/client/src/components/documents-upload/documents-upload.component.jsx b/client/src/components/documents-upload/documents-upload.component.jsx index d5c139ce9..37537f251 100644 --- a/client/src/components/documents-upload/documents-upload.component.jsx +++ b/client/src/components/documents-upload/documents-upload.component.jsx @@ -1,118 +1,117 @@ -import { UploadOutlined } from "@ant-design/icons"; -import { notification, Progress, Result, Space, Upload } from "antd"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {UploadOutlined} from "@ant-design/icons"; +import {notification, Progress, Result, Space, Upload} from "antd"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import formatBytes from "../../utils/formatbytes"; -import { handleUpload } from "./documents-upload.utility"; +import {handleUpload} from "./documents-upload.utility"; + const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, }); export function DocumentsUploadComponent({ - children, - currentUser, - bodyshop, - jobId, - tagsArray, - billId, - callbackAfterUpload, - totalSize, - ignoreSizeLimit = false, -}) { - const { t } = useTranslation(); - const [fileList, setFileList] = useState([]); + children, + currentUser, + bodyshop, + jobId, + tagsArray, + billId, + callbackAfterUpload, + totalSize, + ignoreSizeLimit = false, + }) { + const {t} = useTranslation(); + const [fileList, setFileList] = useState([]); - const pct = useMemo(() => { - return parseInt( - (totalSize / ((bodyshop && bodyshop.jobsizelimit) || 1)) * 100 - ); - }, [bodyshop, totalSize]); + const pct = useMemo(() => { + return parseInt( + (totalSize / ((bodyshop && bodyshop.jobsizelimit) || 1)) * 100 + ); + }, [bodyshop, totalSize]); + + if (pct > 100 && !ignoreSizeLimit) + return ( + + ); + + const handleDone = (uid) => { + setTimeout(() => { + setFileList((fileList) => fileList.filter((x) => x.uid !== uid)); + }, 2000); + }; - if (pct > 100 && !ignoreSizeLimit) return ( - - ); + { + if (f.event && f.event.percent === 100) handleDone(f.file.uid); + setFileList(f.fileList); + }} + beforeUpload={(file, fileList) => { + if (ignoreSizeLimit) return true; + const newFiles = fileList.reduce((acc, val) => acc + val.size, 0); + const shouldStopUpload = + (totalSize + newFiles) / ((bodyshop && bodyshop.jobsizelimit) || 1) >= + 1; - const handleDone = (uid) => { - setTimeout(() => { - setFileList((fileList) => fileList.filter((x) => x.uid !== uid)); - }, 2000); - }; - - return ( - { - if (f.event && f.event.percent === 100) handleDone(f.file.uid); - setFileList(f.fileList); - }} - beforeUpload={(file, fileList) => { - if (ignoreSizeLimit) return true; - const newFiles = fileList.reduce((acc, val) => acc + val.size, 0); - const shouldStopUpload = - (totalSize + newFiles) / ((bodyshop && bodyshop.jobsizelimit) || 1) >= - 1; - - //Check to see if old files plus newly uploaded ones will be too much. - if (shouldStopUpload) { - notification.open({ - key: "cannotuploaddocuments", - type: "error", - message: t("documents.labels.upload_limitexceeded_title"), - description: t("documents.labels.upload_limitexceeded"), - }); - return Upload.LIST_IGNORE; - } - return true; - }} - customRequest={(ev) => - handleUpload(ev, { - bodyshop: bodyshop, - uploaded_by: currentUser.email, - jobId: jobId, - billId: billId, - tagsArray: tagsArray, - callback: callbackAfterUpload, - }) - } - accept="audio/*, video/*, image/*, .pdf, .doc, .docx, .xls, .xlsx" - // showUploadList={false} - > - {children || ( - <> -

- -

-

- Click or drag files to this area to upload. -

- {!ignoreSizeLimit && ( - - - + //Check to see if old files plus newly uploaded ones will be too much. + if (shouldStopUpload) { + notification.open({ + key: "cannotuploaddocuments", + type: "error", + message: t("documents.labels.upload_limitexceeded_title"), + description: t("documents.labels.upload_limitexceeded"), + }); + return Upload.LIST_IGNORE; + } + return true; + }} + customRequest={(ev) => + handleUpload(ev, { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: jobId, + billId: billId, + tagsArray: tagsArray, + callback: callbackAfterUpload, + }) + } + accept="audio/*, video/*, image/*, .pdf, .doc, .docx, .xls, .xlsx" + // showUploadList={false} + > + {children || ( + <> +

+ +

+

+ Click or drag files to this area to upload. +

+ {!ignoreSizeLimit && ( + + + {t("documents.labels.usage", { - percent: pct, - used: formatBytes(totalSize), - total: formatBytes(bodyshop && bodyshop.jobsizelimit), + percent: pct, + used: formatBytes(totalSize), + total: formatBytes(bodyshop && bodyshop.jobsizelimit), })} - - )} - - )} -
- ); + + )} + + )} +
+ ); } + export default connect(mapStateToProps, null)(DocumentsUploadComponent); diff --git a/client/src/components/documents-upload/documents-upload.utility.js b/client/src/components/documents-upload/documents-upload.utility.js index 48a83c7de..d45de27ca 100644 --- a/client/src/components/documents-upload/documents-upload.utility.js +++ b/client/src/components/documents-upload/documents-upload.utility.js @@ -1,12 +1,12 @@ -import { notification } from "antd"; +import {notification} from "antd"; import axios from "axios"; import i18n from "i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_NEW_DOCUMENT } from "../../graphql/documents.queries"; -import { axiosAuthInterceptorId } from "../../utils/CleanAxios"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_NEW_DOCUMENT} from "../../graphql/documents.queries"; +import {axiosAuthInterceptorId} from "../../utils/CleanAxios"; import client from "../../utils/GraphQLClient"; import exifr from "exifr"; -import { store } from "../../redux/store"; +import {store} from "../../redux/store"; //Context: currentUserEmail, bodyshop, jobid, invoiceid @@ -15,218 +15,219 @@ var cleanAxios = axios.create(); cleanAxios.interceptors.request.eject(axiosAuthInterceptorId); export const handleUpload = (ev, context) => { - logImEXEvent("document_upload", { filetype: ev.file.type }); + logImEXEvent("document_upload", {filetype: ev.file.type}); - const { onError, onSuccess, onProgress } = ev; - const { bodyshop, jobId } = context; + const {onError, onSuccess, onProgress} = ev; + const {bodyshop, jobId} = context; - const fileName = ev.file.name || ev.filename; + const fileName = ev.file.name || ev.filename; - let key = `${bodyshop.id}/${jobId}/${replaceAccents(fileName).replace( - /[^A-Z0-9]+/gi, - "_" - )}-${new Date().getTime()}`; - let extension = fileName.split(".").pop(); - uploadToCloudinary( + let key = `${bodyshop.id}/${jobId}/${replaceAccents(fileName).replace( + /[^A-Z0-9]+/gi, + "_" + )}-${new Date().getTime()}`; + let extension = fileName.split(".").pop(); + uploadToCloudinary( + key, + extension, + ev.file.type, + ev.file, + onError, + onSuccess, + onProgress, + context + ); +}; + +export const uploadToCloudinary = async ( key, extension, - ev.file.type, - ev.file, + fileType, + file, onError, onSuccess, onProgress, context - ); -}; - -export const uploadToCloudinary = async ( - key, - extension, - fileType, - file, - onError, - onSuccess, - onProgress, - context ) => { - const { bodyshop, jobId, billId, uploaded_by, callback, tagsArray } = context; + const {bodyshop, jobId, billId, uploaded_by, callback, tagsArray} = context; - //Set variables for getting the signed URL. - let timestamp = Math.floor(Date.now() / 1000); - let public_id = key; - let tags = `${bodyshop.imexshopid},${ - tagsArray ? tagsArray.map((tag) => `${tag},`) : "" - }`; - // let eager = process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS; + //Set variables for getting the signed URL. + let timestamp = Math.floor(Date.now() / 1000); + let public_id = key; + let tags = `${bodyshop.imexshopid},${ + tagsArray ? tagsArray.map((tag) => `${tag},`) : "" + }`; + // let eager = process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS; - //Get the signed url. + //Get the signed url. - const upload_preset = fileType.startsWith("video") - ? "incoming_upload_video" - : "incoming_upload"; + const upload_preset = fileType.startsWith("video") + ? "incoming_upload_video" + : "incoming_upload"; - const signedURLResponse = await axios.post("/media/sign", { - public_id: public_id, - tags: tags, - timestamp: timestamp, - upload_preset: upload_preset, - }); - - if (signedURLResponse.status !== 200) { - if (!!onError) onError(signedURLResponse.statusText); - notification["error"]({ - message: i18n.t("documents.errors.getpresignurl", { - message: signedURLResponse.statusText, - }), + const signedURLResponse = await axios.post("/media/sign", { + public_id: public_id, + tags: tags, + timestamp: timestamp, + upload_preset: upload_preset, }); - return; - } - //Build request to end to cloudinary. - var signature = signedURLResponse.data; - var options = { - headers: { "X-Requested-With": "XMLHttpRequest" }, - onUploadProgress: (e) => { - if (!!onProgress) onProgress({ percent: (e.loaded / e.total) * 100 }); - }, - }; - - const formData = new FormData(); - formData.append("file", file); - - formData.append("upload_preset", upload_preset); - - formData.append("api_key", process.env.REACT_APP_CLOUDINARY_API_KEY); - formData.append("public_id", public_id); - formData.append("tags", tags); - formData.append("timestamp", timestamp); - formData.append("signature", signature); - - const cloudinaryUploadResponse = await cleanAxios.post( - `${process.env.REACT_APP_CLOUDINARY_ENDPOINT_API}/${DetermineFileType( - fileType - )}/upload`, - formData, - { - ...options, - } - ); - - if (cloudinaryUploadResponse.status !== 200) { - if (!!onError) { - onError(cloudinaryUploadResponse.statusText); + if (signedURLResponse.status !== 200) { + if (!!onError) onError(signedURLResponse.statusText); + notification["error"]({ + message: i18n.t("documents.errors.getpresignurl", { + message: signedURLResponse.statusText, + }), + }); + return; } - try { - axios.post("/newlog", { - message: "client-cloudinary-upload-error", - type: "error", - user: store.getState().user.email, - object: cloudinaryUploadResponse, - }); - } catch (error) {} - - notification["error"]({ - message: i18n.t("documents.errors.insert", { - message: cloudinaryUploadResponse.statusText, - }), - }); - return; - } - - //Insert the document with the matching key. - let takenat; - if (fileType.includes("image")) { - try { - const exif = await exifr.parse(file); - - takenat = exif && exif.DateTimeOriginal; - } catch (error) { - console.log("Unable to parse image file for EXIF Data"); - } - } - const documentInsert = await client.mutate({ - mutation: INSERT_NEW_DOCUMENT, - variables: { - docInput: [ - { - ...(jobId ? { jobid: jobId } : {}), - ...(billId ? { billid: billId } : {}), - uploaded_by: uploaded_by, - key: key, - type: fileType, - extension: cloudinaryUploadResponse.data.format || extension, - bodyshopid: bodyshop.id, - size: cloudinaryUploadResponse.data.bytes || file.size, - takenat, + //Build request to end to cloudinary. + var signature = signedURLResponse.data; + var options = { + headers: {"X-Requested-With": "XMLHttpRequest"}, + onUploadProgress: (e) => { + if (!!onProgress) onProgress({percent: (e.loaded / e.total) * 100}); }, - ], - }, - }); - if (!documentInsert.errors) { - if (!!onSuccess) - onSuccess({ - uid: documentInsert.data.insert_documents.returning[0].id, - name: documentInsert.data.insert_documents.returning[0].name, - status: "done", - key: documentInsert.data.insert_documents.returning[0].key, - }); - notification.open({ - type: "success", - key: "docuploadsuccess", - message: i18n.t("documents.successes.insert"), - }); - if (callback) { - callback(); + }; + + const formData = new FormData(); + formData.append("file", file); + + formData.append("upload_preset", upload_preset); + + formData.append("api_key", process.env.REACT_APP_CLOUDINARY_API_KEY); + formData.append("public_id", public_id); + formData.append("tags", tags); + formData.append("timestamp", timestamp); + formData.append("signature", signature); + + const cloudinaryUploadResponse = await cleanAxios.post( + `${process.env.REACT_APP_CLOUDINARY_ENDPOINT_API}/${DetermineFileType( + fileType + )}/upload`, + formData, + { + ...options, + } + ); + + if (cloudinaryUploadResponse.status !== 200) { + if (!!onError) { + onError(cloudinaryUploadResponse.statusText); + } + + try { + axios.post("/newlog", { + message: "client-cloudinary-upload-error", + type: "error", + user: store.getState().user.email, + object: cloudinaryUploadResponse, + }); + } catch (error) { + } + + notification["error"]({ + message: i18n.t("documents.errors.insert", { + message: cloudinaryUploadResponse.statusText, + }), + }); + return; } - } else { - if (!!onError) onError(JSON.stringify(documentInsert.errors)); - notification["error"]({ - message: i18n.t("documents.errors.insert", { - message: JSON.stringify(documentInsert.errors), - }), + + //Insert the document with the matching key. + let takenat; + if (fileType.includes("image")) { + try { + const exif = await exifr.parse(file); + + takenat = exif && exif.DateTimeOriginal; + } catch (error) { + console.log("Unable to parse image file for EXIF Data"); + } + } + const documentInsert = await client.mutate({ + mutation: INSERT_NEW_DOCUMENT, + variables: { + docInput: [ + { + ...(jobId ? {jobid: jobId} : {}), + ...(billId ? {billid: billId} : {}), + uploaded_by: uploaded_by, + key: key, + type: fileType, + extension: cloudinaryUploadResponse.data.format || extension, + bodyshopid: bodyshop.id, + size: cloudinaryUploadResponse.data.bytes || file.size, + takenat, + }, + ], + }, }); - return; - } + if (!documentInsert.errors) { + if (!!onSuccess) + onSuccess({ + uid: documentInsert.data.insert_documents.returning[0].id, + name: documentInsert.data.insert_documents.returning[0].name, + status: "done", + key: documentInsert.data.insert_documents.returning[0].key, + }); + notification.open({ + type: "success", + key: "docuploadsuccess", + message: i18n.t("documents.successes.insert"), + }); + if (callback) { + callback(); + } + } else { + if (!!onError) onError(JSON.stringify(documentInsert.errors)); + notification["error"]({ + message: i18n.t("documents.errors.insert", { + message: JSON.stringify(documentInsert.errors), + }), + }); + + } }; //Also needs to be updated in media JS and mobile app. export function DetermineFileType(filetype) { - if (!filetype) return "auto"; - else if (filetype.startsWith("image")) return "image"; - else if (filetype.startsWith("video")) return "video"; - else if (filetype.startsWith("application/pdf")) return "image"; - else if (filetype.startsWith("application")) return "raw"; + if (!filetype) return "auto"; + else if (filetype.startsWith("image")) return "image"; + else if (filetype.startsWith("video")) return "video"; + else if (filetype.startsWith("application/pdf")) return "image"; + else if (filetype.startsWith("application")) return "raw"; - return "auto"; + return "auto"; } function replaceAccents(str) { - // Verifies if the String has accents and replace them - if (str.search(/[\xC0-\xFF]/g) > -1) { - str = str - .replace(/[\xC0-\xC5]/g, "A") - .replace(/[\xC6]/g, "AE") - .replace(/[\xC7]/g, "C") - .replace(/[\xC8-\xCB]/g, "E") - .replace(/[\xCC-\xCF]/g, "I") - .replace(/[\xD0]/g, "D") - .replace(/[\xD1]/g, "N") - .replace(/[\xD2-\xD6\xD8]/g, "O") - .replace(/[\xD9-\xDC]/g, "U") - .replace(/[\xDD]/g, "Y") - .replace(/[\xDE]/g, "P") - .replace(/[\xE0-\xE5]/g, "a") - .replace(/[\xE6]/g, "ae") - .replace(/[\xE7]/g, "c") - .replace(/[\xE8-\xEB]/g, "e") - .replace(/[\xEC-\xEF]/g, "i") - .replace(/[\xF1]/g, "n") - .replace(/[\xF2-\xF6\xF8]/g, "o") - .replace(/[\xF9-\xFC]/g, "u") - .replace(/[\xFE]/g, "p") - .replace(/[\xFD\xFF]/g, "y"); - } + // Verifies if the String has accents and replace them + if (str.search(/[\xC0-\xFF]/g) > -1) { + str = str + .replace(/[\xC0-\xC5]/g, "A") + .replace(/[\xC6]/g, "AE") + .replace(/[\xC7]/g, "C") + .replace(/[\xC8-\xCB]/g, "E") + .replace(/[\xCC-\xCF]/g, "I") + .replace(/[\xD0]/g, "D") + .replace(/[\xD1]/g, "N") + .replace(/[\xD2-\xD6\xD8]/g, "O") + .replace(/[\xD9-\xDC]/g, "U") + .replace(/[\xDD]/g, "Y") + .replace(/[\xDE]/g, "P") + .replace(/[\xE0-\xE5]/g, "a") + .replace(/[\xE6]/g, "ae") + .replace(/[\xE7]/g, "c") + .replace(/[\xE8-\xEB]/g, "e") + .replace(/[\xEC-\xEF]/g, "i") + .replace(/[\xF1]/g, "n") + .replace(/[\xF2-\xF6\xF8]/g, "o") + .replace(/[\xF9-\xFC]/g, "u") + .replace(/[\xFE]/g, "p") + .replace(/[\xFD\xFF]/g, "y"); + } - return str; + return str; } diff --git a/client/src/components/email-documents/email-documents.component.jsx b/client/src/components/email-documents/email-documents.component.jsx index f1171f98e..5ca6eae75 100644 --- a/client/src/components/email-documents/email-documents.component.jsx +++ b/client/src/components/email-documents/email-documents.component.jsx @@ -1,73 +1,74 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries"; -import { selectEmailConfig } from "../../redux/email/email.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {GET_DOCUMENTS_BY_JOB} from "../../graphql/documents.queries"; +import {selectEmailConfig} from "../../redux/email/email.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component"; -import JobsDocumentsLocalGalleryExternalComponent from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component"; +import JobsDocumentsLocalGalleryExternalComponent + from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, - emailConfig: selectEmailConfig, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, + emailConfig: selectEmailConfig, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(EmailDocumentsComponent); export function EmailDocumentsComponent({ - emailConfig, - form, - selectedMediaState, - bodyshop, -}) { - const { t } = useTranslation(); + emailConfig, + form, + selectedMediaState, + bodyshop, + }) { + const {t} = useTranslation(); - const [selectedMedia, setSelectedMedia] = selectedMediaState; - const { loading, error, data } = useQuery(GET_DOCUMENTS_BY_JOB, { - variables: { - jobId: emailConfig.jobid, - }, - skip: !emailConfig.jobid, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const [selectedMedia, setSelectedMedia] = selectedMediaState; + const {loading, error, data} = useQuery(GET_DOCUMENTS_BY_JOB, { + variables: { + jobId: emailConfig.jobid, + }, + skip: !emailConfig.jobid, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - return ( -
- {loading && } - {error && } - {selectedMedia.filter((s) => s.isSelected).length >= 10 ? ( -
{t("messaging.labels.maxtenimages")}
- ) : null} - {selectedMedia && - selectedMedia - .filter((s) => s.isSelected) - .reduce((acc, val) => (acc = acc + val.size), 0) >= - 10485760 - new Blob([form.getFieldValue("html")]).size ? ( -
{t("general.errors.sizelimit")}
- ) : null} - {!bodyshop.uselocalmediaserver && data && ( - - )} - {bodyshop.uselocalmediaserver && ( - - )} -
- ); + return ( +
+ {loading && } + {error && } + {selectedMedia.filter((s) => s.isSelected).length >= 10 ? ( +
{t("messaging.labels.maxtenimages")}
+ ) : null} + {selectedMedia && + selectedMedia + .filter((s) => s.isSelected) + .reduce((acc, val) => (acc = acc + val.size), 0) >= + 10485760 - new Blob([form.getFieldValue("html")]).size ? ( +
{t("general.errors.sizelimit")}
+ ) : null} + {!bodyshop.uselocalmediaserver && data && ( + + )} + {bodyshop.uselocalmediaserver && ( + + )} +
+ ); } diff --git a/client/src/components/email-overlay/email-overlay.component.jsx b/client/src/components/email-overlay/email-overlay.component.jsx index 362d973b4..d648eddb0 100644 --- a/client/src/components/email-overlay/email-overlay.component.jsx +++ b/client/src/components/email-overlay/email-overlay.component.jsx @@ -1,267 +1,262 @@ -import { UploadOutlined, UserAddOutlined } from "@ant-design/icons"; -import { - Button, - Divider, - Dropdown, - Form, - Input, - Menu, - Select, - Space, - Tabs, - Upload, -} from "antd"; +import {UploadOutlined, UserAddOutlined} from "@ant-design/icons"; +import {Button, Divider, Dropdown, Form, Input, Select, Space, Tabs, Upload,} from "antd"; import _ from "lodash"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectEmailConfig } from "../../redux/email/email.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { CreateExplorerLinkForJob } from "../../utils/localmedia"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectEmailConfig} from "../../redux/email/email.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {CreateExplorerLinkForJob} from "../../utils/localmedia"; import EmailDocumentsComponent from "../email-documents/email-documents.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, - emailConfig: selectEmailConfig, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + emailConfig: selectEmailConfig, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(EmailOverlayComponent); export function EmailOverlayComponent({ - emailConfig, - form, - selectedMediaState, - bodyshop, - currentUser, -}) { - const { t } = useTranslation(); - const handleClick = ({ item, key, keyPath }) => { - const email = item.props.value; - form.setFieldsValue({ - to: _.uniq([ - ...form.getFieldValue("to"), - ...(typeof email === "string" ? [email] : email), - ]), - }); - }; - const handle_CC_Click = ({ item, key, keyPath }) => { - const email = item.props.value; - form.setFieldsValue({ - cc: _.uniq([ - ...(form.getFieldValue("cc") || ""), - ...(typeof email === "string" ? [email] : email), - ]), - }); - }; + emailConfig, + form, + selectedMediaState, + bodyshop, + currentUser, + }) { + const {t} = useTranslation(); + const handleClick = ({item, key, keyPath}) => { + const email = item.props.value; + form.setFieldsValue({ + to: _.uniq([ + ...form.getFieldValue("to"), + ...(typeof email === "string" ? [email] : email), + ]), + }); + }; + const handle_CC_Click = ({item, key, keyPath}) => { + const email = item.props.value; + form.setFieldsValue({ + cc: _.uniq([ + ...(form.getFieldValue("cc") || ""), + ...(typeof email === "string" ? [email] : email), + ]), + }); + }; - const menu = ( -
- - {bodyshop.employees - .filter((e) => e.user_email) - .map((e, idx) => ( - - {`${e.first_name} ${e.last_name}`} - - ))} - {bodyshop.md_to_emails.map((e, idx) => ( - - {e.label} - - ))} - -
- ); + const emailsToMenu = { + items: [ + ...bodyshop.employees + .filter((e) => e.user_email) + .map((e, idx) => ({ + key: idx, + label: `${e.first_name} ${e.last_name}`, + value: e.user_email, + })), + ...bodyshop.md_to_emails.map((e, idx) => ({ + key: idx + "group", + label: e.label, + value: e.emails, + })), + ], + onClick: handleClick, + }; + const menuCC = { + items: [ + ...bodyshop.employees + .filter((e) => e.user_email) + .map((e, idx) => ({ + key: idx, + label: `${e.first_name} ${e.last_name}`, + value: e.user_email, + })), + ...bodyshop.md_to_emails.map((e, idx) => ({ + key: idx + "group", + label: e.label, + value: e.emails, + })), + ], + onClick: handle_CC_Click, + }; - const menuCC = ( -
- - {bodyshop.employees - .filter((e) => e.user_email) - .map((e, idx) => ( - - {`${e.first_name} ${e.last_name}`} - - ))} - {bodyshop.md_to_emails.map((e, idx) => ( - - {e.label} - - ))} - -
- ); - - return ( -
- - - - - {t("emails.fields.to")} - - e.preventDefault()} - > - - - - - } - name="to" - rules={[ - { - required: true, - //message: t("general.validation.required"), - }, - ]} - > - - - - - - - {t("emails.labels.preview")} - {bodyshop.attach_pdf_to_email && ( - {t("emails.labels.pdfcopywillbeattached")} - )} - - - {() => { - return ( -
- ); - }} - - - - - - - - - {bodyshop.uselocalmediaserver && emailConfig.jobid && ( - - - - )} - { - if (Array.isArray(e)) { - return e; - } - return e && e.fileList; - }} - rules={[ - ({ getFieldValue }) => ({ - validator(rule, value) { - const totalSize = value.reduce( - (acc, val) => (acc = acc + val.size), - 0 - ); - - const limit = - 10485760 - new Blob([form.getFieldValue("html")]).size; - - if (totalSize > limit) { - return Promise.reject(t("general.errors.sizelimit")); - } - return Promise.resolve(); - }, - }), - ]} - > - + - <> -

- -

-

- Click or drag files to this area to upload. -

- -
-
-
-
-
- ); + +
+ + {t("emails.fields.to")} + + e.preventDefault()} + > + + + + + } + name="to" + rules={[ + { + required: true, + //message: t("general.validation.required"), + }, + ]} + > + + + + + + + {t("emails.labels.preview")} + {bodyshop.attach_pdf_to_email && ( + {t("emails.labels.pdfcopywillbeattached")} + )} + + + {() => { + return ( +
+ ); + }} + + + + ), + }, + { + key: "attachments", + label: t("emails.labels.attachments"), + children: ( + <> + {bodyshop.uselocalmediaserver && emailConfig.jobid && ( + + + + )} + { + if (Array.isArray(e)) { + return e; + } + return e && e.fileList; + }} + rules={[ + ({getFieldValue}) => ({ + validator(rule, value) { + const totalSize = value.reduce( + (acc, val) => (acc = acc + val.size), + 0 + ); + + const limit = + 10485760 - new Blob([form.getFieldValue("html")]).size; + + if (totalSize > limit) { + return Promise.reject(t("general.errors.sizelimit")); + } + return Promise.resolve(); + }, + }), + ]} + > + + <> +

+ +

+

+ Click or drag files to this area to upload. +

+ +
+
+ + ), + }, + ]} + /> +
+ ); } diff --git a/client/src/components/email-overlay/email-overlay.container.jsx b/client/src/components/email-overlay/email-overlay.container.jsx index 706fa6211..da51ea1c4 100644 --- a/client/src/components/email-overlay/email-overlay.container.jsx +++ b/client/src/components/email-overlay/email-overlay.container.jsx @@ -1,266 +1,260 @@ -import { Button, Divider, Form, Modal, notification, Space } from "antd"; +import {Button, Divider, Form, Modal, notification, Space} from "antd"; import axios from "axios"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { toggleEmailOverlayVisible } from "../../redux/email/email.actions"; -import { - selectEmailConfig, - selectEmailVisible, -} from "../../redux/email/email.selectors.js"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {toggleEmailOverlayVisible} from "../../redux/email/email.actions"; +import {selectEmailConfig, selectEmailVisible,} from "../../redux/email/email.selectors.js"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import RenderTemplate from "../../utils/RenderTemplate"; -import { EmailSettings } from "../../utils/TemplateConstants"; +import {EmailSettings} from "../../utils/TemplateConstants"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import EmailOverlayComponent from "./email-overlay.component"; const mapStateToProps = createStructuredSelector({ - modalVisible: selectEmailVisible, - emailConfig: selectEmailConfig, - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + modalVisible: selectEmailVisible, + emailConfig: selectEmailConfig, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - toggleEmailOverlayVisible: () => dispatch(toggleEmailOverlayVisible()), + toggleEmailOverlayVisible: () => dispatch(toggleEmailOverlayVisible()), }); export function EmailOverlayContainer({ - emailConfig, - modalVisible, - toggleEmailOverlayVisible, - bodyshop, - currentUser, -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const [sending, setSending] = useState(false); - const [rawHtml, setRawHtml] = useState(""); - const [pdfCopytoAttach, setPdfCopytoAttach] = useState({ - filename: null, - pdf: null, - }); - const [selectedMedia, setSelectedMedia] = useState([]); + emailConfig, + modalVisible, + toggleEmailOverlayVisible, + bodyshop, + currentUser, + }) { + const {t} = useTranslation(); + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [sending, setSending] = useState(false); + const [rawHtml, setRawHtml] = useState(""); + const [pdfCopytoAttach, setPdfCopytoAttach] = useState({ + filename: null, + pdf: null, + }); + const [selectedMedia, setSelectedMedia] = useState([]); - const defaultEmailFrom = { - from: { - name: currentUser.displayName - ? `${currentUser.displayName} @ ${bodyshop.shopname}` - : bodyshop.shopname, - address: EmailSettings.fromAddress, - }, - }; - - const handleFinish = async (allValues) => { - logImEXEvent("email_send_from_modal"); - - //const attachments = []; - - // if (values.fileList) - // await asyncForEach(values.fileList, async (f) => { - // const t = { - // ContentType: f.type, - // Filename: f.name, - // Base64Content: (await toBase64(f.originFileObj)).split(",")[1], - // }; - // attachments.push(t); - // }); - - const { from, ...values } = allValues; - setSending(true); - try { - await axios.post("/sendemail", { - bodyshopid: bodyshop.id, - jobid: emailConfig.jobid, - - ...defaultEmailFrom, - ReplyTo: { - Email: from, - Name: currentUser.displayName, + const defaultEmailFrom = { + from: { + name: currentUser.displayName + ? `${currentUser.displayName} @ ${bodyshop.shopname}` + : bodyshop.shopname, + address: EmailSettings.fromAddress, }, - ...values, - html: rawHtml, - attachments: [ - ...(values.fileList - ? await Promise.all( - values.fileList.map(async (f) => { - return { - filename: f.name, - path: await toBase64(f.originFileObj), - }; - }) - ) - : []), - ...(pdfCopytoAttach.pdf - ? [ - { - path: pdfCopytoAttach.pdf, - filename: - pdfCopytoAttach.filename && - `${pdfCopytoAttach.filename}.pdf`, + }; + + const handleFinish = async (allValues) => { + logImEXEvent("email_send_from_modal"); + + //const attachments = []; + + // if (values.fileList) + // await asyncForEach(values.fileList, async (f) => { + // const t = { + // ContentType: f.type, + // Filename: f.name, + // Base64Content: (await toBase64(f.originFileObj)).split(",")[1], + // }; + // attachments.push(t); + // }); + + const {from, ...values} = allValues; + setSending(true); + try { + await axios.post("/sendemail", { + bodyshopid: bodyshop.id, + jobid: emailConfig.jobid, + + ...defaultEmailFrom, + ReplyTo: { + Email: from, + Name: currentUser.displayName, }, - ] - : []), - ], - media: selectedMedia.filter((m) => m.isSelected).map((m) => m.fullsize), - //attachments, - }); - notification["success"]({ message: t("emails.successes.sent") }); - toggleEmailOverlayVisible(); - } catch (error) { - notification["error"]({ - message: t("emails.errors.notsent", { message: error.message }), - }); - } - setSending(false); - }; + ...values, + html: rawHtml, + attachments: [ + ...(values.fileList + ? await Promise.all( + values.fileList.map(async (f) => { + return { + filename: f.name, + path: await toBase64(f.originFileObj), + }; + }) + ) + : []), + ...(pdfCopytoAttach.pdf + ? [ + { + path: pdfCopytoAttach.pdf, + filename: + pdfCopytoAttach.filename && + `${pdfCopytoAttach.filename}.pdf`, + }, + ] + : []), + ], + media: selectedMedia.filter((m) => m.isSelected).map((m) => m.fullsize), + //attachments, + }); + notification["success"]({message: t("emails.successes.sent")}); + toggleEmailOverlayVisible(); + } catch (error) { + notification["error"]({ + message: t("emails.errors.notsent", {message: error.message}), + }); + } + setSending(false); + }; - const render = async () => { - logImEXEvent("email_render_template", { template: emailConfig.template }); - setLoading(true); - let { html, pdf, filename } = await RenderTemplate( - emailConfig.template, - bodyshop, - true - ); + const render = async () => { + logImEXEvent("email_render_template", {template: emailConfig.template}); + setLoading(true); + let {html, pdf, filename} = await RenderTemplate( + emailConfig.template, + bodyshop, + true + ); - const response = await axios.post("/render/inlinecss", { - html: html, - url: `${window.location.protocol}://${window.location.host}/`, - }); - setRawHtml(response.data); + const response = await axios.post("/render/inlinecss", { + html: html, + url: `${window.location.protocol}://${window.location.host}/`, + }); + setRawHtml(response.data); - if (pdf) { - setPdfCopytoAttach({ pdf, filename }); - } + if (pdf) { + setPdfCopytoAttach({pdf, filename}); + } - form.setFieldsValue({ - from: currentUser.validemail ? currentUser.email : bodyshop.email, - ...emailConfig.messageOptions, - cc: - emailConfig.messageOptions.cc && - emailConfig.messageOptions.cc.filter((x) => x), - to: - emailConfig.messageOptions.to && - emailConfig.messageOptions.to.filter((x) => x), - html: response.data, - fileList: [], - }); + form.setFieldsValue({ + from: currentUser.validemail ? currentUser.email : bodyshop.email, + ...emailConfig.messageOptions, + cc: + emailConfig.messageOptions.cc && + emailConfig.messageOptions.cc.filter((x) => x), + to: + emailConfig.messageOptions.to && + emailConfig.messageOptions.to.filter((x) => x), + html: response.data, + fileList: [], + }); - if ( - bodyshop.md_email_cc[emailConfig.template.name] && - bodyshop.md_email_cc[emailConfig.template.name].length > 0 - ) { - form.setFieldsValue({ - cc: [ - ...(form.getFieldValue("cc") || []), - ...bodyshop.md_email_cc[emailConfig.template.name], - ], - }); - } - setLoading(false); - }; + if ( + bodyshop.md_email_cc[emailConfig.template.name] && + bodyshop.md_email_cc[emailConfig.template.name].length > 0 + ) { + form.setFieldsValue({ + cc: [ + ...(form.getFieldValue("cc") || []), + ...bodyshop.md_email_cc[emailConfig.template.name], + ], + }); + } + setLoading(false); + }; - useEffect(() => { - if (modalVisible) render(); - }, [modalVisible]); // eslint-disable-line react-hooks/exhaustive-deps - return ( - form.submit()} - title={t("emails.labels.emailpreview")} - onCancel={() => { - toggleEmailOverlayVisible(); - }} - //closeIcon={() => null} - okText={t("general.actions.send")} - okButtonProps={{ - loading: sending, - - disabled: - selectedMedia && - (selectedMedia - .filter((s) => s.isSelected) - .reduce((acc, val) => (acc = acc + val.size), 0) >= - 10485760 - new Blob([form.getFieldValue("html")]).size || - selectedMedia.filter((s) => s.isSelected).length > 10), - }} - > -
-
- - - - -
-
- {loading && ( + }} + //closeIcon={() => null} + okText={t("general.actions.send")} + okButtonProps={{ + loading: sending, + disabled: + selectedMedia && + (selectedMedia + .filter((s) => s.isSelected) + .reduce((acc, val) => (acc = acc + val.size), 0) >= + 10485760 - new Blob([form.getFieldValue("html")]).size || + selectedMedia.filter((s) => s.isSelected).length > 10), + }} + >
- - {t("emails.labels.preview")} - -
- )} +
+ + + + +
+ + {loading && ( +
+ + {t("emails.labels.preview")} + +
+ )} - {!loading && ( - - )} - -
-
- ); + {!loading && ( + + )} + +
+ + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(EmailOverlayContainer); const toBase64 = (file) => - new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => resolve(reader.result); - reader.onerror = (error) => reject(error); - }); + new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = (error) => reject(error); + }); // const asyncForEach = async (array, callback) => { // for (let index = 0; index < array.length; index++) { diff --git a/client/src/components/email-test/email-test-component.jsx b/client/src/components/email-test/email-test-component.jsx index ea891785c..122315afb 100644 --- a/client/src/components/email-test/email-test-component.jsx +++ b/client/src/components/email-test/email-test-component.jsx @@ -1,114 +1,115 @@ -import { Button, Form, Input, Select, Switch } from "antd"; +import {Button, Form, Input, Select, Switch} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import moment from "moment"; +import dayjs from "../../utils/day"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setEmailOptions: (e) => dispatch(setEmailOptions(e)), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), }); -export function EmailTestComponent({ currentUser, setEmailOptions }) { - const [form] = Form.useForm(); +export function EmailTestComponent({currentUser, setEmailOptions}) { + const [form] = Form.useForm(); - const handleFinish = (values) => { - GenerateDocument( - { - name: values.key, - variables: { - ...(values.start - ? { - start: moment(values.start).startOf("day").format("YYYY-MM-DD"), - } - : {}), - ...(values.end - ? { end: moment(values.end).endOf("day").format("YYYY-MM-DD") } - : {}), - ...(values.start - ? { starttz: moment(values.start).startOf("day") } - : {}), - ...(values.end ? { endtz: moment(values.end).endOf("day") } : {}), + const handleFinish = (values) => { + GenerateDocument( + { + name: values.key, + variables: { + ...(values.start + ? { + start: dayjs(values.start).startOf("day").format("YYYY-MM-DD"), + } + : {}), + ...(values.end + ? {end: dayjs(values.end).endOf("day").format("YYYY-MM-DD")} + : {}), + ...(values.start + ? {starttz: dayjs(values.start).startOf("day")} + : {}), + ...(values.end ? {endtz: dayjs(values.end).endOf("day")} : {}), - ...(values.id ? { id: values.id } : {}), - }, - }, - { - to: values.to, - }, - values.email ? "e" : "p" + ...(values.id ? {id: values.id} : {}), + }, + }, + { + to: values.to, + }, + values.email ? "e" : "p" + ); + }; + + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + +
); - }; - - return ( -
-
- - - - - - - - - - - - - - - - - - - - - -
- ); } + export default connect(mapStateToProps, mapDispatchToProps)(EmailTestComponent); diff --git a/client/src/components/employee-search-select/employee-search-select.component.jsx b/client/src/components/employee-search-select/employee-search-select.component.jsx index 659a3556e..1388ef981 100644 --- a/client/src/components/employee-search-select/employee-search-select.component.jsx +++ b/client/src/components/employee-search-select/employee-search-select.component.jsx @@ -1,42 +1,43 @@ -import { Select, Space, Tag } from "antd"; +import {Select, Space, Tag} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -const { Option } = Select; +import {useTranslation} from "react-i18next"; + +const {Option} = Select; //To be used as a form element only. -const EmployeeSearchSelect = ({ options, ...props }) => { - const { t } = useTranslation(); +const EmployeeSearchSelect = ({options, ...props}) => { + const {t} = useTranslation(); - return ( - + {options + ? options.map((o) => ( + - )) - : null} - - ); + + {o.flat_rate + ? t("timetickets.labels.flat_rate") + : t("timetickets.labels.straight_time")} + + + + )) + : null} + + ); }; export default EmployeeSearchSelect; diff --git a/client/src/components/employee-team-search-select/employee-team-search-select.component.jsx b/client/src/components/employee-team-search-select/employee-team-search-select.component.jsx index 3166a35d0..eef1a88cc 100644 --- a/client/src/components/employee-team-search-select/employee-team-search-select.component.jsx +++ b/client/src/components/employee-team-search-select/employee-team-search-select.component.jsx @@ -1,33 +1,33 @@ -import { useQuery } from "@apollo/client"; -import { Select } from "antd"; -import React, { forwardRef } from "react"; -import { QUERY_TEAMS } from "../../graphql/employee_teams.queries"; +import {useQuery} from "@apollo/client"; +import {Select} from "antd"; +import React, {forwardRef} from "react"; +import {QUERY_TEAMS} from "../../graphql/employee_teams.queries"; import AlertComponent from "../alert/alert.component"; //To be used as a form element only. -const EmployeeTeamSearchSelect = ({ ...props }, ref) => { - const { loading, error, data } = useQuery(QUERY_TEAMS); +const EmployeeTeamSearchSelect = ({...props}, ref) => { + const {loading, error, data} = useQuery(QUERY_TEAMS); - if (error) return ; - return ( - ({ + value: JSON.stringify(e), + label: e.name, + })) + : [] + } + {...props} + /> + ); }; export default forwardRef(EmployeeTeamSearchSelect); diff --git a/client/src/components/error-boundary/error-boundary.component.jsx b/client/src/components/error-boundary/error-boundary.component.jsx index cc464c7dd..06fc2417c 100644 --- a/client/src/components/error-boundary/error-boundary.component.jsx +++ b/client/src/components/error-boundary/error-boundary.component.jsx @@ -1,144 +1,141 @@ -import { Button, Col, Collapse, Result, Row, Space } from "antd"; +import {Button, Col, Collapse, Result, Row, Space} from "antd"; import React from "react"; -import { withTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {withTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); class ErrorBoundary extends React.Component { - constructor() { - super(); - this.state = { - hasErrored: false, - error: null, - info: null, - }; - } - - static getDerivedStateFromError(error) { - console.log("ErrorBoundary -> getDerivedStateFromError -> error", error); - - return { hasErrored: true, error: error }; - } - - componentDidCatch(error, info) { - console.log("Exception Caught by Error Boundary.", error, info); - this.setState({ ...this.state, error, info }); - } - - handleErrorSubmit = () => { - // window.$crisp.push([ - // "do", - // "message:send", - // [ - // "text", - // `I hit the following error: \n\n - // ${this.state.error.message}\n\n - // ${this.state.error.stack}\n\n - // URL:${window.location} as ${this.props.currentUser.email} for ${ - // this.props.bodyshop && this.props.bodyshop.name - // } - // `, - // ], - // ]); - - // window.$crisp.push(["do", "chat:open"]); - // const errorDescription = `**Please add relevant details about what you were doing before you encountered this issue** - - // ---- - // System Generated Log: - // ${this.state.error.message} - // ${this.state.error.stack} - // `; - - // const URL = `https://bodyshop.atlassian.net/servicedesk/customer/portal/3/group/8/create/26?summary=123&description=${encodeURI( - // errorDescription - // )}&customfield_10049=${window.location}&email=${ - // this.props.currentUser.email - // }`; - // console.log(`URL`, URL); - // window.open(URL, "_blank"); - }; - - render() { - const { t } = this.props; - const { error, info } = this.state; - if (this.state.hasErrored === true) { - logImEXEvent("error_boundary_rendered", { error, info }); - - window.$crisp.push([ - "set", - "session:event", - [ - [ - [ - "error_boundary", - { - error: this.state.error.message, - stack: this.state.error.stack, - }, - "red", - ], - ], - ], - ]); - - return ( -
- - - - - } - /> - -
- - -
- {this.state.error.message} -
-
{this.state.error.stack}
-
-
- - - - ); - } else { - return this.props.children; + constructor() { + super(); + this.state = { + hasErrored: false, + error: null, + info: null, + }; + } + + static getDerivedStateFromError(error) { + console.log("ErrorBoundary -> getDerivedStateFromError -> error", error); + + return {hasErrored: true, error: error}; + } + + componentDidCatch(error, info) { + console.log("Exception Caught by Error Boundary.", error, info); + this.setState({...this.state, error, info}); + } + + handleErrorSubmit = () => { + // window.$crisp.push([ + // "do", + // "message:send", + // [ + // "text", + // `I hit the following error: \n\n + // ${this.state.error.message}\n\n + // ${this.state.error.stack}\n\n + // URL:${window.location} as ${this.props.currentUser.email} for ${ + // this.props.bodyshop && this.props.bodyshop.name + // } + // `, + // ], + // ]); + + // window.$crisp.push(["do", "chat:open"]); + // const errorDescription = `**Please add relevant details about what you were doing before you encountered this issue** + + // ---- + // System Generated Log: + // ${this.state.error.message} + // ${this.state.error.stack} + // `; + + // const URL = `https://bodyshop.atlassian.net/servicedesk/customer/portal/3/group/8/create/26?summary=123&description=${encodeURI( + // errorDescription + // )}&customfield_10049=${window.location}&email=${ + // this.props.currentUser.email + // }`; + // console.log(`URL`, URL); + // window.open(URL, "_blank"); + }; + + render() { + const {t} = this.props; + const {error, info} = this.state; + if (this.state.hasErrored === true) { + logImEXEvent("error_boundary_rendered", {error, info}); + + window.$crisp.push([ + "set", + "session:event", + [ + [ + [ + "error_boundary", + { + error: this.state.error.message, + stack: this.state.error.stack, + }, + "red", + ], + ], + ], + ]); + + return ( +
+ + + + + } + /> + +
+ + +
+ {this.state.error.message} +
+
{this.state.error.stack}
+
+
+ + + + ); + } else { + return this.props.children; + } } - } } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(withTranslation()(ErrorBoundary)); diff --git a/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx b/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx index d0ad34dc5..2fe64c8a2 100644 --- a/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx +++ b/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx @@ -1,25 +1,25 @@ import React from "react"; -import { WarningOutlined } from "@ant-design/icons"; -import { Space, Tooltip } from "antd"; -import { useTranslation } from "react-i18next"; +import {WarningOutlined} from "@ant-design/icons"; +import {Space, Tooltip} from "antd"; +import {useTranslation} from "react-i18next"; const style = { - fontWeight: "bold", - color: "green", + fontWeight: "bold", + color: "green", }; -export default function ExportLogsCountDisplay({ logs }) { - const success = logs.filter((e) => e.successful).length; - const attempts = logs.length; - const { t } = useTranslation(); - return ( - 0 ? style : {}}> - {`${success}/${attempts}`} - {success > 0 && ( - - - - )} - - ); +export default function ExportLogsCountDisplay({logs}) { + const success = logs.filter((e) => e.successful).length; + const attempts = logs.length; + const {t} = useTranslation(); + return ( + 0 ? style : {}}> + {`${success}/${attempts}`} + {success > 0 && ( + + + + )} + + ); } diff --git a/client/src/components/fcm-notification/fcm-notification.component.jsx b/client/src/components/fcm-notification/fcm-notification.component.jsx index 5f283d5a8..a54bb04d9 100644 --- a/client/src/components/fcm-notification/fcm-notification.component.jsx +++ b/client/src/components/fcm-notification/fcm-notification.component.jsx @@ -1,44 +1,44 @@ -import { withApollo } from "@apollo/client/react/hoc"; -import React, { Component } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {withApollo} from "@apollo/client/react/hoc"; +import React, {Component} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; //import { logImEXEvent, messaging } from "../../firebase/firebase.utils"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); class FcmNotificationComponent extends Component { - async componentDidMount() { - //const { client, currentUser } = this.props; - // if (!!!messaging) return; //Skip all of the notification functionality if the firebase SDK could not start. - // messaging - // .requestPermission() - // .then(async function () { - // // const token = await messaging.getToken(); - // // client.mutate({ - // // mutation: UPDATE_FCM_TOKEN, - // // variables: { authEmail: currentUser.email, token: { [token]: true } }, - // // }); - // }) - // .catch(function (err) { - // console.log("Unable to get permission to notify.", err); - // logImEXEvent("fcm_permission_denied", { message: err }); - // }); - } + async componentDidMount() { + //const { client, currentUser } = this.props; + // if (!!!messaging) return; //Skip all of the notification functionality if the firebase SDK could not start. + // messaging + // .requestPermission() + // .then(async function () { + // // const token = await messaging.getToken(); + // // client.mutate({ + // // mutation: UPDATE_FCM_TOKEN, + // // variables: { authEmail: currentUser.email, token: { [token]: true } }, + // // }); + // }) + // .catch(function (err) { + // console.log("Unable to get permission to notify.", err); + // logImEXEvent("fcm_permission_denied", { message: err }); + // }); + } - render() { - return ; - } + render() { + return ; + } } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(withApollo(FcmNotificationComponent)); //Firebase Service Worker Register diff --git a/client/src/components/feature-wrapper/feature-wrapper.component.jsx b/client/src/components/feature-wrapper/feature-wrapper.component.jsx index af609ac1f..c456bcf25 100644 --- a/client/src/components/feature-wrapper/feature-wrapper.component.jsx +++ b/client/src/components/feature-wrapper/feature-wrapper.component.jsx @@ -1,41 +1,41 @@ -import moment from "moment"; +import dayjs from "../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); function FeatureWrapper({ - bodyshop, - featureName, - noauth, - children, - ...restProps -}) { - const { t } = useTranslation(); + bodyshop, + featureName, + noauth, + children, + ...restProps + }) { + const {t} = useTranslation(); - if (HasFeatureAccess({ featureName, bodyshop })) return children; + if (HasFeatureAccess({featureName, bodyshop})) return children; - return ( - noauth || ( - - ) - ); + return ( + noauth || ( + + ) + ); } -export function HasFeatureAccess({ featureName, bodyshop }) { - return ( - bodyshop.features.allAccess || - moment(bodyshop.features[featureName]).isAfter(moment()) - ); +export function HasFeatureAccess({featureName, bodyshop}) { + return ( + bodyshop.features.allAccess || + dayjs(bodyshop.features[featureName]).isAfter(dayjs()) + ); } export default connect(mapStateToProps, null)(FeatureWrapper); diff --git a/client/src/components/form-date-picker/form-date-picker.component.jsx b/client/src/components/form-date-picker/form-date-picker.component.jsx index 05a894e8b..bb87e8c56 100644 --- a/client/src/components/form-date-picker/form-date-picker.component.jsx +++ b/client/src/components/form-date-picker/form-date-picker.component.jsx @@ -1,98 +1,97 @@ -import { DatePicker } from "antd"; -import moment from "moment"; -import React, { useRef } from "react"; -//To be used as a form element only. +import {DatePicker} from "antd"; +import dayjs from "../../utils/day"; +import React, {useRef} from "react"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(FormDatePicker); const dateFormat = "MM/DD/YYYY"; -export function FormDatePicker({ - bodyshop, - value, - onChange, - onBlur, - onlyFuture, - isDateOnly = true, - ...restProps -}) { - const ref = useRef(); +export function FormDatePicker({bodyshop, value, onChange, onBlur, onlyFuture, isDateOnly = true, ...restProps}) { + const ref = useRef(); - const handleChange = (newDate) => { - if (value !== newDate && onChange) { - onChange(isDateOnly ? newDate && newDate.format("YYYY-MM-DD") : newDate); - } - }; - - const handleKeyDown = (e) => { - if (e.key.toLowerCase() === "t") { - if (onChange) { - onChange(isDateOnly ? moment().format("YYYY-MM-DD") : moment()); - // if (ref.current && ref.current.blur) ref.current.blur(); - } - } else if (e.key.toLowerCase() === "enter") { - if (ref.current && ref.current.blur) ref.current.blur(); - } - }; - - const handleBlur = (e) => { - const v = e.target.value; - if (!v) return; - - const _a = moment( - v, - ["MMDDYY", "MMDDYYYY", "MMDD", "MM/DD/YY"], - "en", - false - ); - - if (_a.isValid() && value && value.isValid && value.isValid()) { - _a.set({ - hours: value.hours(), - minutes: value.minutes(), - seconds: value.seconds(), - milliseconds: value.milliseconds(), - }); - } - - if (_a.isValid() && onChange) { - if (onlyFuture) { - if (moment().subtract(1, "day").isBefore(_a)) { - onChange(isDateOnly ? _a.format("YYYY-MM-DD") : _a); - } else { - onChange(isDateOnly ? moment().format("YYYY-MM-DD") : moment()); + const handleChange = (newDate) => { + if (value !== newDate && onChange) { + onChange(isDateOnly ? newDate && newDate.format("YYYY-MM-DD") : newDate); } - } else { - onChange(isDateOnly ? _a.format("YYYY-MM-DD") : _a); - } - } - }; + }; - return ( -
- moment().subtract(1, "day").isAfter(d), - })} - {...restProps} - /> -
- ); -} + const handleKeyDown = (e) => { + if (e.key.toLowerCase() === "t") { + if (onChange) { + onChange(isDateOnly ? dayjs().format("YYYY-MM-DD") : dayjs()); + } + } else if (e.key.toLowerCase() === "enter") { + if (ref.current && ref.current.blur) ref.current.blur(); + } + }; + + const handleBlur = (e) => { + const v = e.target.value; + if (!v) return; + + const formats = ["MMDDYY", "MMDDYYYY", "MMDD", "MM/DD/YY", "MM/DD/YYYY"]; + let _a; + + // Iterate through formats to find the correct one + for (let format of formats) { + _a = dayjs(v, format); + if (v === _a.format(format)) { + break; + } + } + + if ( + _a.isValid() + && value + && value.isValid + && value.isValid() + ) { + _a.set({ + hours: value.hours(), + minutes: value.minutes(), + seconds: value.seconds(), + milliseconds: value.milliseconds(), + }); + } + + if (_a.isValid() && onChange) { + if (onlyFuture) { + if (dayjs().subtract(1, "day").isBefore(_a)) { + onChange(isDateOnly ? _a.format("YYYY-MM-DD") : _a); + } else { + onChange(isDateOnly ? dayjs().format("YYYY-MM-DD") : dayjs()); + } + } else { + onChange(isDateOnly ? _a.format("YYYY-MM-DD") : _a); + } + } + }; + + return ( +
+ dayjs().subtract(1, "day").isAfter(d), + })} + {...restProps} + /> +
+ ); +} \ No newline at end of file diff --git a/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx index a086c253e..8fb4b6607 100644 --- a/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx +++ b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx @@ -1,49 +1,49 @@ -import React, { forwardRef } from "react"; +import React, {forwardRef} from "react"; //import DatePicker from "react-datepicker"; //import "react-datepicker/src/stylesheets/datepicker.scss"; -import { TimePicker } from "antd"; -import moment from "moment"; +import {TimePicker} from "antd"; +import dayjs from "../../utils/day"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; //To be used as a form element only. const DateTimePicker = ( - { value, onChange, onBlur, id, onlyFuture, ...restProps }, - ref + {value, onChange, onBlur, id, onlyFuture, ...restProps}, + ref ) => { - // const handleChange = (newDate) => { - // if (value !== newDate && onChange) { - // onChange(newDate); - // } - // }; + // const handleChange = (newDate) => { + // if (value !== newDate && onChange) { + // onChange(newDate); + // } + // }; - return ( -
- moment().subtract(1, "day").isAfter(d), - })} - value={value} - onBlur={onBlur} - onChange={onChange} - onlyFuture={onlyFuture} - isDateOnly={false} - /> + return ( +
+ dayjs().subtract(1, "day").isAfter(d), + })} + value={value} + onBlur={onBlur} + onChange={onChange} + onlyFuture={onlyFuture} + isDateOnly={false} + /> - moment().isAfter(d), - })} - onChange={onChange} - showSecond={false} - minuteStep={15} - onBlur={onBlur} - format="hh:mm a" - {...restProps} - /> -
- ); + dayjs().isAfter(d), + })} + onChange={onChange} + showSecond={false} + minuteStep={15} + onBlur={onBlur} + format="hh:mm a" + {...restProps} + /> +
+ ); }; export default forwardRef(DateTimePicker); diff --git a/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx b/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx index a1d0eb7af..1d5576720 100644 --- a/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx +++ b/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx @@ -1,73 +1,70 @@ import React from "react"; -import { Form, Space } from "antd"; -import { useTranslation } from "react-i18next"; +import {Form, Space} from "antd"; +import {useTranslation} from "react-i18next"; import AlertComponent from "../alert/alert.component"; -import { Prompt, useLocation } from "react-router-dom"; import "./form-fields-changed.styles.scss"; +import Prompt from "../../utils/prompt"; -export default function FormsFieldChanged({ form, skipPrompt }) { - const { t } = useTranslation(); +export default function FormsFieldChanged({form, skipPrompt}) { + const {t} = useTranslation(); - const handleReset = () => { - form.resetFields(); - }; - const loc = useLocation(); - //if (!form.isFieldsTouched()) return <>; - return ( - - {() => { - const errors = form.getFieldsError().filter((e) => e.errors.length > 0); - if (form.isFieldsTouched()) - return ( - - { - if (loc.pathname === location.pathname) return false; - return t("general.messages.unsavedchangespopup"); - }} - /> - - {t("general.messages.unsavedchanges")} - + const handleReset = () => { + form.resetFields(); + }; + //if (!form.isFieldsTouched()) return <>; + return ( + + {() => { + const errors = form.getFieldsError().filter((e) => e.errors.length > 0); + if (form.isFieldsTouched()) + return ( + + + + {t("general.messages.unsavedchanges")} + {t("general.actions.reset")} - - } - /> - {errors.length > 0 && ( - -
    - {errors.map((e, idx) => - e.errors.map((e2, idx2) => ( -
  • {e2}
  • - )) - )} -
- - } - /> - )} -
- ); - return
; - }} -
- ); + + } + /> + {errors.length > 0 && ( + +
    + {errors.map((e, idx) => + e.errors.map((e2, idx2) => ( +
  • {e2}
  • + )) + )} +
+ + } + /> + )} +
+ ); + return
; + }} +
+ ); } diff --git a/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx b/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx index 5f34a43b1..9f73becaf 100644 --- a/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx +++ b/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx @@ -1,111 +1,111 @@ -import { InputNumber, Popover } from "antd"; -import React, { forwardRef, useEffect, useRef, useState } from "react"; +import {InputNumber, Popover} from "antd"; +import React, {forwardRef, useEffect, useRef, useState} from "react"; const FormInputNUmberCalculator = ( - { value: formValue, onChange: formOnChange, ...restProps }, - refProp + {value: formValue, onChange: formOnChange, ...restProps}, + refProp ) => { - const [value, setValue] = useState(formValue); - const [total, setTotal] = useState(0); - const [history, setHistory] = useState([]); + const [value, setValue] = useState(formValue); + const [total, setTotal] = useState(0); + const [history, setHistory] = useState([]); - const ref = useRef(null); + const ref = useRef(null); - const handleKeyDown = (e) => { - const { key } = e; - let action; - switch (key) { - case "/": - case "*": - case "+": - case "-": - action = key; - break; - case "Enter": - action = "="; - break; - default: - setValue(e.currentTarget.value); - return; - } - const val = parseFloat(value); - setValue(null); - ref.current.blur(); - ref.current.focus(); - if (!isNaN(val)) { - setHistory([...history, val, action]); - } - }; - - useEffect(() => { - if (value !== formValue && formOnChange) formOnChange(value); - }, [formOnChange, formValue, value]); - - useEffect(() => { - if (history.length > 2) { - const subTotal = history.reduce((acc, val, idx) => { - if (idx === 0) { - return val; + const handleKeyDown = (e) => { + const {key} = e; + let action; + switch (key) { + case "/": + case "*": + case "+": + case "-": + action = key; + break; + case "Enter": + action = "="; + break; + default: + setValue(e.currentTarget.value); + return; } - switch (val) { - case "/": - case "*": - case "+": - case "-": - return acc; - - default: - //Weve got math on our hands. Find the last operator, and apply it accordingly. - switch (history[idx - 1]) { - case "/": - return acc / val; - case "*": - return acc * val; - case "+": - return acc + val; - case "-": - return acc - val; - default: - return acc; - } - } - }, 0); - setTotal(subTotal); - if (history[history.length - 1] === "=") { - setValue(subTotal); + const val = parseFloat(value); + setValue(null); ref.current.blur(); ref.current.focus(); - setHistory([]); - } - } - }, [history]); + if (!isNaN(val)) { + setHistory([...history, val, action]); + } + }; - const popContent = ( -
- History - {history.map((h, idx) => ( -
- {h} + useEffect(() => { + if (value !== formValue && formOnChange) formOnChange(value); + }, [formOnChange, formValue, value]); + + useEffect(() => { + if (history.length > 2) { + const subTotal = history.reduce((acc, val, idx) => { + if (idx === 0) { + return val; + } + switch (val) { + case "/": + case "*": + case "+": + case "-": + return acc; + + default: + //Weve got math on our hands. Find the last operator, and apply it accordingly. + switch (history[idx - 1]) { + case "/": + return acc / val; + case "*": + return acc * val; + case "+": + return acc + val; + case "-": + return acc - val; + default: + return acc; + } + } + }, 0); + setTotal(subTotal); + if (history[history.length - 1] === "=") { + setValue(subTotal); + ref.current.blur(); + ref.current.focus(); + setHistory([]); + } + } + }, [history]); + + const popContent = ( +
+ History + {history.map((h, idx) => ( +
+ {h} +
+ ))} +
{total}
- ))} -
{total}
-
- ); + ); - return ( -
- 0}> - setHistory([])} - {...restProps} - /> - -
- ); + return ( +
+ 0}> + setHistory([])} + {...restProps} + /> + +
+ ); }; export default forwardRef(FormInputNUmberCalculator); diff --git a/client/src/components/form-items-formatted/colorpicker-form-item.component.jsx b/client/src/components/form-items-formatted/colorpicker-form-item.component.jsx index 10734e291..cd7c1bc16 100644 --- a/client/src/components/form-items-formatted/colorpicker-form-item.component.jsx +++ b/client/src/components/form-items-formatted/colorpicker-form-item.component.jsx @@ -1,20 +1,20 @@ import React from "react"; -import { SliderPicker } from "react-color"; +import {SliderPicker} from "react-color"; //To be used as a form element only. -const ColorPickerFormItem = ({ value, onChange, style, ...restProps }) => { - const handleChangeComplete = (color) => { - if (onChange) onChange(color); - }; +const ColorPickerFormItem = ({value, onChange, style, ...restProps}) => { + const handleChangeComplete = (color) => { + if (onChange) onChange(color); + }; - return ( - - ); + return ( + + ); }; export default ColorPickerFormItem; diff --git a/client/src/components/form-items-formatted/currency-form-item.component.jsx b/client/src/components/form-items-formatted/currency-form-item.component.jsx index 8d142372d..3e45c2ff1 100644 --- a/client/src/components/form-items-formatted/currency-form-item.component.jsx +++ b/client/src/components/form-items-formatted/currency-form-item.component.jsx @@ -1,5 +1,5 @@ -import { InputNumber } from "antd"; -import React, { forwardRef } from "react"; +import {InputNumber} from "antd"; +import React, {forwardRef} from "react"; // const locale = "en-us"; // const currencyFormatter = (value) => { @@ -42,16 +42,16 @@ import React, { forwardRef } from "react"; // }; function FormItemCurrency(props, ref) { - return ( - `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")} - // parser={(value) => value.replace(/\$\s?|(,*)/g, "")} - precision={2} - /> - ); + return ( + `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")} + // parser={(value) => value.replace(/\$\s?|(,*)/g, "")} + precision={2} + /> + ); } export default forwardRef(FormItemCurrency); diff --git a/client/src/components/form-items-formatted/email-form-item.component.jsx b/client/src/components/form-items-formatted/email-form-item.component.jsx index 96e091923..5d5db588e 100644 --- a/client/src/components/form-items-formatted/email-form-item.component.jsx +++ b/client/src/components/form-items-formatted/email-form-item.component.jsx @@ -1,22 +1,23 @@ -import { MailFilled } from "@ant-design/icons"; -import { Input } from "antd"; -import React, { forwardRef } from "react"; +import {MailFilled} from "@ant-design/icons"; +import {Input} from "antd"; +import React, {forwardRef} from "react"; + function FormItemEmail(props, ref) { - return ( - - - - ) : ( - - ) - } - /> - ); + return ( + + + + ) : ( + + ) + } + /> + ); } export default forwardRef(FormItemEmail); diff --git a/client/src/components/form-items-formatted/labor-type-form-item.component.jsx b/client/src/components/form-items-formatted/labor-type-form-item.component.jsx index f1f4d8265..6066a1133 100644 --- a/client/src/components/form-items-formatted/labor-type-form-item.component.jsx +++ b/client/src/components/form-items-formatted/labor-type-form-item.component.jsx @@ -1,11 +1,11 @@ -import React, { forwardRef } from "react"; -import { useTranslation } from "react-i18next"; +import React, {forwardRef} from "react"; +import {useTranslation} from "react-i18next"; -const LaborTypeFormItem = ({ value, onChange }, ref) => { - const { t } = useTranslation(); +const LaborTypeFormItem = ({value, onChange}, ref) => { + const {t} = useTranslation(); - if (!value) return null; + if (!value) return null; - return
{t(`joblines.fields.lbr_types.${value}`)}
; + return
{t(`joblines.fields.lbr_types.${value}`)}
; }; export default forwardRef(LaborTypeFormItem); diff --git a/client/src/components/form-items-formatted/part-type-form-item.component.jsx b/client/src/components/form-items-formatted/part-type-form-item.component.jsx index 3226483ca..8aea0d9aa 100644 --- a/client/src/components/form-items-formatted/part-type-form-item.component.jsx +++ b/client/src/components/form-items-formatted/part-type-form-item.component.jsx @@ -1,11 +1,11 @@ -import React, { forwardRef } from "react"; -import { useTranslation } from "react-i18next"; +import React, {forwardRef} from "react"; +import {useTranslation} from "react-i18next"; -const PartTypeFormItem = ({ value, onChange }, ref) => { - const { t } = useTranslation(); +const PartTypeFormItem = ({value, onChange}, ref) => { + const {t} = useTranslation(); - if (!value) return null; + if (!value) return null; - return
{t(`joblines.fields.part_types.${value}`)}
; + return
{t(`joblines.fields.part_types.${value}`)}
; }; export default forwardRef(PartTypeFormItem); diff --git a/client/src/components/form-items-formatted/phone-form-item.component.jsx b/client/src/components/form-items-formatted/phone-form-item.component.jsx index aba9e3ab8..b8f4d38b1 100644 --- a/client/src/components/form-items-formatted/phone-form-item.component.jsx +++ b/client/src/components/form-items-formatted/phone-form-item.component.jsx @@ -1,31 +1,31 @@ -import { Input } from "antd"; +import {Input} from "antd"; import i18n from "i18next"; import parsePhoneNumber from "libphonenumber-js"; -import React, { forwardRef } from "react"; +import React, {forwardRef} from "react"; import "./phone-form-item.styles.scss"; function FormItemPhone(props, ref) { - return ( - - ); + return ( + + ); } export default forwardRef(FormItemPhone); export const PhoneItemFormatterValidation = (getFieldValue, name) => ({ - async validator(rule, value) { - if (!value) { - return Promise.resolve(); - } else { - const p = parsePhoneNumber(value, "CA"); - if (p && p.isValid()) { - return Promise.resolve(); - } else { - return Promise.reject(i18n.t("general.validation.invalidphone")); - } - } - }, + async validator(rule, value) { + if (!value) { + return Promise.resolve(); + } else { + const p = parsePhoneNumber(value, "CA"); + if (p && p.isValid()) { + return Promise.resolve(); + } else { + return Promise.reject(i18n.t("general.validation.invalidphone")); + } + } + }, }); diff --git a/client/src/components/form-items-formatted/read-only-form-item.component.jsx b/client/src/components/form-items-formatted/read-only-form-item.component.jsx index c27944691..e606fb3aa 100644 --- a/client/src/components/form-items-formatted/read-only-form-item.component.jsx +++ b/client/src/components/form-items-formatted/read-only-form-item.component.jsx @@ -1,38 +1,39 @@ import Dinero from "dinero.js"; -import React, { forwardRef } from "react"; +import React, {forwardRef} from "react"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); const ReadOnlyFormItem = ( - { bodyshop, value, type = "text", onChange }, - ref + {bodyshop, value, type = "text", onChange}, + ref ) => { - if (!value) return null; - switch (type) { - case "employee": - const emp = bodyshop.employees.find((e) => e.id === value); - return `${emp?.first_name} ${emp?.last_name}`; + if (!value) return null; + switch (type) { + case "employee": + const emp = bodyshop.employees.find((e) => e.id === value); + return `${emp?.first_name} ${emp?.last_name}`; - case "text": - return
{value}
; - case "currency": - return ( -
{Dinero({ amount: Math.round(value * 100) }).toFormat()}
- ); - default: - return
{value}
; - } + case "text": + return
{value}
; + case "currency": + return ( +
{Dinero({amount: Math.round(value * 100)}).toFormat()}
+ ); + default: + return
{value}
; + } }; export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(forwardRef(ReadOnlyFormItem)); diff --git a/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx b/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx index 1c4bf21e6..44a5980c3 100644 --- a/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx +++ b/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx @@ -1,22 +1,23 @@ -import { DownOutlined, UpOutlined } from "@ant-design/icons"; -import { Space } from "antd"; +import {DownOutlined, UpOutlined} from "@ant-design/icons"; +import {Space} from "antd"; import React from "react"; -export default function FormListMoveArrows({ move, index, total }) { - const upDisabled = index === 0; - const downDisabled = index === total - 1; - const handleUp = () => { - move(index, index - 1); - }; +export default function FormListMoveArrows({move, index, total}) { + const upDisabled = index === 0; + const downDisabled = index === total - 1; - const handleDown = () => { - move(index, index + 1); - }; + const handleUp = () => { + move(index, index - 1); + }; - return ( - - - - - ); + const handleDown = () => { + move(index, index + 1); + }; + + return ( + + + + + ); } diff --git a/client/src/components/global-loading-bar/global-loading-bar.component.jsx b/client/src/components/global-loading-bar/global-loading-bar.component.jsx index 89ebcb372..d59535512 100644 --- a/client/src/components/global-loading-bar/global-loading-bar.component.jsx +++ b/client/src/components/global-loading-bar/global-loading-bar.component.jsx @@ -1,54 +1,54 @@ //import { useNProgress } from "@tanem/react-nprogress"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectLoading } from "../../redux/application/application.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectLoading} from "../../redux/application/application.selectors"; const mapStateToProps = createStructuredSelector({ - loading: selectLoading, + loading: selectLoading, }); export default connect(mapStateToProps, null)(GlobalLoadingHeader); -function GlobalLoadingHeader({ loading }) { - return ; - // const { animationDuration, isFinished, progress } = useNProgress({ - // isAnimating: loading, - // }); - // return ( - //
- //
- //
- //
- //
- // ); +function GlobalLoadingHeader({loading}) { + return ; + // const { animationDuration, isFinished, progress } = useNProgress({ + // isAnimating: loading, + // }); + // return ( + //
+ //
+ //
+ //
+ //
+ // ); } diff --git a/client/src/components/global-search/global-search-os.component.jsx b/client/src/components/global-search/global-search-os.component.jsx index 82e5152b4..7174b4f94 100644 --- a/client/src/components/global-search/global-search-os.component.jsx +++ b/client/src/components/global-search/global-search-os.component.jsx @@ -1,217 +1,215 @@ -import { AutoComplete, Divider, Input, Space } from "antd"; +import {AutoComplete, Divider, Input, Space} from "antd"; import axios from "axios"; import _ from "lodash"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory } from "react-router-dom"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link, useNavigate} from "react-router-dom"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; -import OwnerNameDisplay, { - OwnerNameDisplayFunction, -} from "../owner-name-display/owner-name-display.component"; +import OwnerNameDisplay, {OwnerNameDisplayFunction,} from "../owner-name-display/owner-name-display.component"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; export default function GlobalSearchOs() { - const { t } = useTranslation(); - const history = useHistory(); - const [loading, setLoading] = useState(false); - const [data, setData] = useState(false); + const {t} = useTranslation(); + const history = useNavigate(); + const [loading, setLoading] = useState(false); + const [data, setData] = useState(false); - const executeSearch = async (v) => { - if (v && v && v !== "" && v.length >= 3) { - try { - setLoading(true); - const searchData = await axios.post("/search", { - search: v, - }); + const executeSearch = async (v) => { + if (v && v && v !== "" && v.length >= 3) { + try { + setLoading(true); + const searchData = await axios.post("/search", { + search: v, + }); - const resultsByType = { - payments: [], - jobs: [], - bills: [], - owners: [], - vehicles: [], - }; + const resultsByType = { + payments: [], + jobs: [], + bills: [], + owners: [], + vehicles: [], + }; - searchData.data.hits.hits.forEach((hit) => { - resultsByType[hit._index].push(hit._source); - }); - setData([ - { - label: renderTitle(t("menus.header.search.jobs")), - options: resultsByType.jobs.map((job) => { - return { - key: job.id, - value: job.ro_number || "N/A", - label: ( - - }> - {job.ro_number || t("general.labels.na")} - {`${job.status || ""}`} - - + searchData.data.hits.hits.forEach((hit) => { + resultsByType[hit._index].push(hit._source); + }); + setData([ + { + label: renderTitle(t("menus.header.search.jobs")), + options: resultsByType.jobs.map((job) => { + return { + key: job.id, + value: job.ro_number || "N/A", + label: ( + + }> + {job.ro_number || t("general.labels.na")} + {`${job.status || ""}`} + + - {`${job.v_model_yr || ""} ${ - job.v_make_desc || "" - } ${job.v_model_desc || ""}`} - {`${job.clm_no || ""}`} - {`${job.plate_no || ""}`} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.owners")), - options: resultsByType.owners.map((owner) => { - return { - key: owner.id, - value: OwnerNameDisplayFunction(owner), - label: ( - - } - wrap - > + {`${job.v_model_yr || ""} ${ + job.v_make_desc || "" + } ${job.v_model_desc || ""}`} + {`${job.clm_no || ""}`} + {`${job.plate_no || ""}`} + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.owners")), + options: resultsByType.owners.map((owner) => { + return { + key: owner.id, + value: OwnerNameDisplayFunction(owner), + label: ( + + } + wrap + > - + - - {owner.ownr_ph1} - - - {owner.ownr_ph2} - - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.vehicles")), - options: resultsByType.vehicles.map((vehicle) => { - return { - key: vehicle.id, - value: `${vehicle.v_model_yr || ""} ${ - vehicle.v_make_desc || "" - } ${vehicle.v_model_desc || ""}`, - label: ( - - }> + + {owner.ownr_ph1} + + + {owner.ownr_ph2} + + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.vehicles")), + options: resultsByType.vehicles.map((vehicle) => { + return { + key: vehicle.id, + value: `${vehicle.v_model_yr || ""} ${ + vehicle.v_make_desc || "" + } ${vehicle.v_model_desc || ""}`, + label: ( + + }> {`${vehicle.v_model_yr || ""} ${ - vehicle.v_make_desc || "" + vehicle.v_make_desc || "" } ${vehicle.v_model_desc || ""}`} - {vehicle.plate_no || ""} - + {vehicle.plate_no || ""} + {vehicle.v_vin || ""} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.payments")), - options: resultsByType.payments.map((payment) => { - return { - key: payment.id, - value: `${payment.job?.ro_number} ${payment.amount}`, - label: ( - - }> - {payment.paymentnum} - {payment.job?.ro_number} - {payment.memo || ""} - {payment.amount || ""} - {payment.transactionid || ""} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.bills")), - options: resultsByType.bills.map((bill) => { - return { - key: bill.id, - value: `${bill.invoice_number} - ${bill.vendor.name}`, - label: ( - - }> - {bill.invoice_number} - {bill.vendor.name} - {bill.date} - - - ), - }; - }), - }, - // { - // label: renderTitle(t("menus.header.search.phonebook")), - // options: resultsByType.search_phonebook.map((pb) => { - // return { - // key: pb.id, - // value: `${pb.firstname || ""} ${pb.lastname || ""} ${ - // pb.company || "" - // }`, - // label: ( - // - // }> - // {`${pb.firstname || ""} ${pb.lastname || ""} ${ - // pb.company || "" - // }`} - // {pb.phone1} - // {pb.email} - // - // - // ), - // }; - // }), - // }, - ]); - } catch (error) { - console.log("Error while fetching search results", error); - } finally { - setLoading(false); - } - } - }; - const debouncedExecuteSearch = _.debounce(executeSearch, 750); + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.payments")), + options: resultsByType.payments.map((payment) => { + return { + key: payment.id, + value: `${payment.job?.ro_number} ${payment.amount}`, + label: ( + + }> + {payment.paymentnum} + {payment.job?.ro_number} + {payment.memo || ""} + {payment.amount || ""} + {payment.transactionid || ""} + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.bills")), + options: resultsByType.bills.map((bill) => { + return { + key: bill.id, + value: `${bill.invoice_number} - ${bill.vendor.name}`, + label: ( + + }> + {bill.invoice_number} + {bill.vendor.name} + {bill.date} + + + ), + }; + }), + }, + // { + // label: renderTitle(t("menus.header.search.phonebook")), + // options: resultsByType.search_phonebook.map((pb) => { + // return { + // key: pb.id, + // value: `${pb.firstname || ""} ${pb.lastname || ""} ${ + // pb.company || "" + // }`, + // label: ( + // + // }> + // {`${pb.firstname || ""} ${pb.lastname || ""} ${ + // pb.company || "" + // }`} + // {pb.phone1} + // {pb.email} + // + // + // ), + // }; + // }), + // }, + ]); + } catch (error) { + console.log("Error while fetching search results", error); + } finally { + setLoading(false); + } + } + }; + const debouncedExecuteSearch = _.debounce(executeSearch, 750); - const handleSearch = (value) => { - debouncedExecuteSearch(value); - }; + const handleSearch = (value) => { + debouncedExecuteSearch(value); + }; - const renderTitle = (title) => { - return {title}; - }; + const renderTitle = (title) => { + return {title}; + }; - return ( - { - history.push(opt.label.props.to); - }} - onClear={() => setData([])} - > - - - ); + return ( + { + history(opt.label.props.to); + }} + onClear={() => setData([])} + > + + + ); } diff --git a/client/src/components/global-search/global-search.component.jsx b/client/src/components/global-search/global-search.component.jsx index 787583d66..036463522 100644 --- a/client/src/components/global-search/global-search.component.jsx +++ b/client/src/components/global-search/global-search.component.jsx @@ -1,201 +1,200 @@ -import { useLazyQuery } from "@apollo/client"; -import { AutoComplete, Divider, Input, Space } from "antd"; +import {useLazyQuery} from "@apollo/client"; +import {AutoComplete, Divider, Input, Space} from "antd"; import _ from "lodash"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory } from "react-router-dom"; -import { GLOBAL_SEARCH_QUERY } from "../../graphql/search.queries"; +import {useTranslation} from "react-i18next"; +import {Link, useNavigate} from "react-router-dom"; +import {GLOBAL_SEARCH_QUERY} from "../../graphql/search.queries"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; import AlertComponent from "../alert/alert.component"; -import OwnerNameDisplay, { - OwnerNameDisplayFunction, -} from "../owner-name-display/owner-name-display.component"; +import OwnerNameDisplay, {OwnerNameDisplayFunction,} from "../owner-name-display/owner-name-display.component"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; + export default function GlobalSearch() { - const { t } = useTranslation(); - const history = useHistory(); - const [callSearch, { loading, error, data }] = - useLazyQuery(GLOBAL_SEARCH_QUERY); + const {t} = useTranslation(); + const history = useNavigate(); + const [callSearch, {loading, error, data}] = + useLazyQuery(GLOBAL_SEARCH_QUERY); - const executeSearch = (v) => { - if ( - v && - v.variables.search && - v.variables.search !== "" && - v.variables.search.length >= 3 - ) - callSearch(v); - }; - const debouncedExecuteSearch = _.debounce(executeSearch, 750); + const executeSearch = (v) => { + if ( + v && + v.variables.search && + v.variables.search !== "" && + v.variables.search.length >= 3 + ) + callSearch(v); + }; + const debouncedExecuteSearch = _.debounce(executeSearch, 750); - const handleSearch = (value) => { - console.log("Handle Search"); - debouncedExecuteSearch({ variables: { search: value } }); - }; + const handleSearch = (value) => { + console.log("Handle Search"); + debouncedExecuteSearch({variables: {search: value}}); + }; - const renderTitle = (title) => { - return {title}; - }; + const renderTitle = (title) => { + return {title}; + }; - const options = data - ? [ - { - label: renderTitle(t("menus.header.search.jobs")), - options: data.search_jobs.map((job) => { - return { - key: job.id, - value: job.ro_number || "N/A", - label: ( - - }> - {job.ro_number || t("general.labels.na")} - {`${job.status || ""}`} - - + const options = data + ? [ + { + label: renderTitle(t("menus.header.search.jobs")), + options: data.search_jobs.map((job) => { + return { + key: job.id, + value: job.ro_number || "N/A", + label: ( + + }> + {job.ro_number || t("general.labels.na")} + {`${job.status || ""}`} + + - {`${job.v_model_yr || ""} ${job.v_make_desc || ""} ${ - job.v_model_desc || "" - }`} - {`${job.clm_no || ""}`} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.owners")), - options: data.search_owners.map((owner) => { - return { - key: owner.id, - value: OwnerNameDisplayFunction(owner), - label: ( - - } wrap> + {`${job.v_model_yr || ""} ${job.v_make_desc || ""} ${ + job.v_model_desc || "" + }`} + {`${job.clm_no || ""}`} + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.owners")), + options: data.search_owners.map((owner) => { + return { + key: owner.id, + value: OwnerNameDisplayFunction(owner), + label: ( + + } wrap> - + - - {owner.ownr_ph1} - - - {owner.ownr_ph2} - - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.vehicles")), - options: data.search_vehicles.map((vehicle) => { - return { - key: vehicle.id, - value: `${vehicle.v_model_yr || ""} ${ - vehicle.v_make_desc || "" - } ${vehicle.v_model_desc || ""}`, - label: ( - - }> + + {owner.ownr_ph1} + + + {owner.ownr_ph2} + + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.vehicles")), + options: data.search_vehicles.map((vehicle) => { + return { + key: vehicle.id, + value: `${vehicle.v_model_yr || ""} ${ + vehicle.v_make_desc || "" + } ${vehicle.v_model_desc || ""}`, + label: ( + + }> {`${vehicle.v_model_yr || ""} ${ - vehicle.v_make_desc || "" + vehicle.v_make_desc || "" } ${vehicle.v_model_desc || ""}`} - {vehicle.plate_no || ""} - + {vehicle.plate_no || ""} + {vehicle.v_vin || ""} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.payments")), - options: data.search_payments.map((payment) => { - return { - key: payment.id, - value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`, - label: ( - - }> - {payment.paymentnum} - {payment.job.ro_number} - {payment.memo || ""} - {payment.amount || ""} - {payment.transactionid || ""} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.bills")), - options: data.search_bills.map((bill) => { - return { - key: bill.id, - value: `${bill.invoice_number} - ${bill.vendor.name}`, - label: ( - - }> - {bill.invoice_number} - {bill.vendor.name} - {bill.date} - - - ), - }; - }), - }, - { - label: renderTitle(t("menus.header.search.phonebook")), - options: data.search_phonebook.map((pb) => { - return { - key: pb.id, - value: `${pb.firstname || ""} ${pb.lastname || ""} ${ - pb.company || "" - }`, - label: ( - - }> + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.payments")), + options: data.search_payments.map((payment) => { + return { + key: payment.id, + value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`, + label: ( + + }> + {payment.paymentnum} + {payment.job.ro_number} + {payment.memo || ""} + {payment.amount || ""} + {payment.transactionid || ""} + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.bills")), + options: data.search_bills.map((bill) => { + return { + key: bill.id, + value: `${bill.invoice_number} - ${bill.vendor.name}`, + label: ( + + }> + {bill.invoice_number} + {bill.vendor.name} + {bill.date} + + + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.phonebook")), + options: data.search_phonebook.map((pb) => { + return { + key: pb.id, + value: `${pb.firstname || ""} ${pb.lastname || ""} ${ + pb.company || "" + }`, + label: ( + + }> {`${pb.firstname || ""} ${pb.lastname || ""} ${ - pb.company || "" + pb.company || "" }`} - {pb.phone1} - {pb.email} - - - ), - }; - }), - }, - ] - : []; + {pb.phone1} + {pb.email} + + + ), + }; + }), + }, + ] + : []; - if (error) return ; + if (error) return ; - return ( - { - history.push(opt.label.props.to); - }} - > - - - ); + return ( + { + history(opt.label.props.to); + }} + > + + + ); } diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index dcb6eff92..0a35f62a6 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -1,438 +1,528 @@ import Icon, { - BankFilled, - BarChartOutlined, - CarFilled, - CheckCircleOutlined, - ClockCircleFilled, - DashboardFilled, - DollarCircleFilled, - ExportOutlined, - FieldTimeOutlined, - FileAddFilled, - FileAddOutlined, - FileFilled, - //GlobalOutlined, - HomeFilled, - ImportOutlined, - LineChartOutlined, - PaperClipOutlined, - PhoneOutlined, - QuestionCircleFilled, - ScheduleOutlined, - SettingOutlined, - TeamOutlined, - ToolFilled, - UnorderedListOutlined, - UserOutlined, + BankFilled, + BarChartOutlined, + CarFilled, + CheckCircleOutlined, + ClockCircleFilled, + DashboardFilled, + DollarCircleFilled, + ExportOutlined, + FieldTimeOutlined, + FileAddFilled, + FileAddOutlined, + FileFilled, + HomeFilled, + ImportOutlined, + InfoCircleOutlined, + LineChartOutlined, + PaperClipOutlined, + PhoneOutlined, + QuestionCircleFilled, + ScheduleOutlined, + SettingOutlined, + TeamOutlined, + ToolFilled, + UnorderedListOutlined, + UserOutlined, } from "@ant-design/icons"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Layout, Menu } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import { BsKanban } from "react-icons/bs"; -import { - FaCalendarAlt, - FaCarCrash, - FaCreditCard, - FaFileInvoiceDollar, -} from "react-icons/fa"; -import { GiPayMoney, GiPlayerTime, GiSettingsKnobs } from "react-icons/gi"; -import { IoBusinessOutline } from "react-icons/io5"; -import { RiSurveyLine } from "react-icons/ri"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { - selectRecentItems, - selectSelectedHeader, -} from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { signOutStart } from "../../redux/user/user.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Layout, Menu, Switch, Tooltip} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {BsKanban} from "react-icons/bs"; +import {FaCalendarAlt, FaCarCrash, FaCreditCard, FaFileInvoiceDollar,} from "react-icons/fa"; +import {GiPayMoney, GiPlayerTime, GiSettingsKnobs} from "react-icons/gi"; +import {IoBusinessOutline} from "react-icons/io5"; +import {RiSurveyLine} from "react-icons/ri"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectRecentItems, selectSelectedHeader,} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {signOutStart} from "../../redux/user/user.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {FiLogOut} from "react-icons/fi"; +import {checkBeta, handleBeta, setBeta} from "../../utils/betaHandler"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - recentItems: selectRecentItems, - selectedHeader: selectSelectedHeader, - bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + recentItems: selectRecentItems, + selectedHeader: selectSelectedHeader, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), - setTimeTicketContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicket" })), - setPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "payment" })), - setReportCenterContext: (context) => - dispatch(setModalContext({ context: context, modal: "reportCenter" })), - signOutStart: () => dispatch(signOutStart()), - setCardPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "cardPayment" })), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), + setTimeTicketContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicket"})), + setPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "payment"})), + setReportCenterContext: (context) => + dispatch(setModalContext({context: context, modal: "reportCenter"})), + signOutStart: () => dispatch(signOutStart()), + setCardPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "cardPayment"})), }); function Header({ - handleMenuClick, - currentUser, - bodyshop, - selectedHeader, - signOutStart, - setBillEnterContext, - setTimeTicketContext, - setPaymentContext, - setReportCenterContext, - recentItems, - setCardPaymentContext, -}) { - const { Simple_Inventory } = useTreatments( - ["Simple_Inventory"], - {}, - bodyshop && bodyshop.imexshopid - ); - const { DmsAp } = useTreatments( - ["DmsAp"], - {}, - bodyshop && bodyshop.imexshopid - ); - const { ImEXPay } = useTreatments( - ["ImEXPay"], - {}, - bodyshop && bodyshop.imexshopid - ); + handleMenuClick, + currentUser, + bodyshop, + selectedHeader, + signOutStart, + setBillEnterContext, + setTimeTicketContext, + setPaymentContext, + setReportCenterContext, + recentItems, + setCardPaymentContext + }) { - const { t } = useTranslation(); + const {treatments: {ImEXPay, DmsAp, Simple_Inventory}} = useSplitTreatments({ + attributes: {}, + names: ["ImEXPay", "DmsAp", "Simple_Inventory"], + splitKey: bodyshop && bodyshop.imexshopid, + }); + const [betaSwitch, setBetaSwitch] = useState(false); + const {t} = useTranslation(); - return ( - - - }> - {t("menus.header.home")} - - }> - {t("menus.header.schedule")} - - } - title={t("menus.header.jobs")} - > - }> - {t("menus.header.activejobs")} - - }> - {t("menus.header.readyjobs")} - - }> - {t("menus.header.parts-queue")} - - }> - - {t("menus.header.availablejobs")} - - - }> - {t("menus.header.newjob")} - - - }> - {t("menus.header.alljobs")} - - - }> - - {t("menus.header.productionlist")} - - - }> - - {t("menus.header.productionboard")} - - - - }> - {t("menus.header.scoreboard")} - - - } - title={t("menus.header.customers")} - > - }> - {t("menus.header.owners")} - - }> - {t("menus.header.vehicles")} - - - } - title={t("menus.header.courtesycars")} - > - }> - - {t("menus.header.courtesycars-all")} - - - }> - - {t("menus.header.courtesycars-contracts")} - - - }> - - {t("menus.header.courtesycars-newcontract")} - - - - } - title={t("menus.header.accounting")} - > - } - > - {t("menus.header.bills")} - - } - onClick={() => { - setBillEnterContext({ - actions: {}, - context: {}, - }); - }} - > - {t("menus.header.enterbills")} - - {Simple_Inventory.treatment === "on" && ( - <> - - } - > - - {t("menus.header.inventory")} - - - - )} - - }> - {t("menus.header.allpayments")} - - { - setPaymentContext({ - actions: {}, - context: null, - }); - }} - icon={} - > - {t("menus.header.enterpayment")} - - {ImEXPay.treatment === "on" && ( - { - setCardPaymentContext({ - actions: {}, - context: {}, + useEffect(() => { + const isBeta = checkBeta(); + setBetaSwitch(isBeta); + }, []); + + + const betaSwitchChange = (checked) => { + setBeta(checked); + setBetaSwitch(checked); + handleBeta(); + } + + const accountingChildren = [ + { + key: 'bills', + icon: , + label: ({t("menus.header.bills")}) + }, + { + key: 'enterbills', + icon: , + label: t("menus.header.enterbills"), + onClick: () => { + setBillEnterContext({ + actions: {}, + context: {}, }); - }} - icon={} - > - {t("menus.header.entercardpayment")} - - )} - - }> - - {t("menus.header.timetickets")} - - - {bodyshop?.md_tasks_presets?.use_approvals && ( - }> - - {t("menus.header.ttapprovals")} - - - )} - } - onClick={() => { - setTimeTicketContext({ - actions: {}, - context: { - created_by: currentUser.displayName - ? currentUser.email.concat(" | ", currentUser.displayName) - : currentUser.email, + } + }, + ]; + + if (Simple_Inventory.treatment === "on") { + accountingChildren.push( + { + type: 'divider', + }, + { + key: 'inventory', + icon: , + label: ({t("menus.header.inventory")}) + } + ); + } + accountingChildren.push( + { + type: 'divider' + }, + { + key: 'allpayments', + icon: , + label: ({t("menus.header.allpayments")}) + }, + { + key: 'enterpayments', + icon: , + label: t("menus.header.enterpayment"), + onClick: () => { + setPaymentContext({ + actions: {}, + context: null, + }); + }, + } + ); + + if (ImEXPay.treatment === "on") { + accountingChildren.push({ + key: 'entercardpayments', + icon: , + label: t("menus.header.entercardpayment"), + onClick: () => { + setCardPaymentContext({ + actions: {}, + context: {}, + }); + }, + }); + } + + accountingChildren.push( + { + type: 'divider', + }, + { + key: 'timetickets', + icon: , + label: ({t("menus.header.timetickets")}) + }); + + if (bodyshop?.md_tasks_presets?.use_approvals) { + accountingChildren.push({ + key: 'ttapprovals', + icon: , + label: + + {t("menus.header.ttapprovals")} + + }); + } + + accountingChildren.push({ + key: 'entertimetickets', + icon: , + label: t("menus.header.entertimeticket"), + onClick: () => { + setTimeTicketContext({ + actions: {}, + context: { + created_by: currentUser.displayName + ? currentUser.email.concat(" | ", currentUser.displayName) + : currentUser.email, + }, + }); + }, + }, + { + type: 'divider', + } + ); + + const accountingExportChildren = [ + { + key: 'receivables', + label: ({t("menus.header.accounting-receivables")}) + }, + ] + + if (!((bodyshop && bodyshop.cdk_dealerid) || (bodyshop && bodyshop.pbs_serialnumber)) || DmsAp.treatment === "on") { + accountingExportChildren.push({ + key: 'payables', + label: ({t("menus.header.accounting-payables")}) + }); + } + + if (!( + (bodyshop && bodyshop.cdk_dealerid) || + (bodyshop && bodyshop.pbs_serialnumber) + )) { + accountingExportChildren.push({ + key: 'payments', + label: ({t("menus.header.accounting-payments")}) + }); + } + + accountingExportChildren.push({ + type: 'divider', + }, { + key: 'exportlogs', + label: ({t("menus.header.export-logs")}) + }); + + accountingChildren.push( + { + key: 'accountingexport', + icon: , + label: t("menus.header.export"), + children: accountingExportChildren + }, + ); + + const menuItems = [ + { + key: 'home', + icon: , + label: ({t("menus.header.home")}) + }, + { + key: 'schedule', + icon: , + label: ({t("menus.header.schedule")}) + }, + { + key: 'jobssubmenu', + icon: , + label: t("menus.header.jobs"), + children: [ + { + key: 'activejobs', + icon: , + label: ({t("menus.header.activejobs")}) }, - }); - }} - > - {t("menus.header.entertimeticket")} - - - } - > - - - {t("menus.header.accounting-receivables")} - - - {(!( - (bodyshop && bodyshop.cdk_dealerid) || - (bodyshop && bodyshop.pbs_serialnumber) - ) || - DmsAp.treatment === "on") && ( - - - {t("menus.header.accounting-payables")} - - - )} - {!( - (bodyshop && bodyshop.cdk_dealerid) || - (bodyshop && bodyshop.pbs_serialnumber) - ) && ( - - - {t("menus.header.accounting-payments")} - - - )} - - - {t("menus.header.export-logs")} - - - - - }> - {t("menus.header.phonebook")} - - }> - - {t("menus.header.temporarydocs")} - - - } - > - }> - - {t("menus.header.shop_config")} - - - }> - {t("menus.header.dashboard")} - - } - onClick={() => { - setReportCenterContext({ - actions: {}, - context: {}, - }); - }} - > - {t("menus.header.reportcenter")} - - } - > - - {t("menus.header.shop_vendors")} - - - }> - {t("menus.header.shop_csi")} - - - - signOutStart()}> - {t("user.actions.signout")} - - { - window.open("https://rometech.com/", "_blank"); - }} - icon={} - > - {t("menus.header.help")} - - - {t("menus.header.shiftclock")} - - - {t("menus.currentuser.profile")} - - { - // - // - // {t("menus.currentuser.languageselector")} - // - // } - // > - // - // {t("general.languages.english")} - // - // - // {t("general.languages.french")} - // - // - // {t("general.languages.spanish")} - // - // - } - - }> - {recentItems.map((i, idx) => ( - - {i.label} - - ))} - - - - ); + { + key: 'readyjobs', + icon: , + label: ({t("menus.header.readyjobs")}) + }, + { + key: 'parts-queue', + icon: , + label: ({t("menus.header.parts-queue")}) + }, + { + key: 'availablejobs', + icon: , + label: ({t("menus.header.availablejobs")}) + }, + { + key: 'newjob', + icon: , + label: ({t("menus.header.newjob")}) + }, + { + type: 'divider', + }, + { + key: 'alljobs', + icon: , + label: ({t("menus.header.alljobs")}) + }, + { + type: 'divider', + }, + { + key: 'productionlist', + icon: , + label: ({t("menus.header.productionlist")}) + }, + { + key: 'productionboard', + icon: , + label: ({t("menus.header.productionboard")}) + }, + { + type: 'divider', + }, + { + key: 'scoreboard', + icon: , + label: ({t("menus.header.scoreboard")}) + }, + ] + }, + { + key: 'customers', + icon: , + label: t("menus.header.customers"), + children: [ + { + key: 'owners', + icon: , + label: ({t("menus.header.owners")}) + }, + { + key: 'vehicles', + icon: , + label: ({t("menus.header.vehicles")}) + }, + ] + }, + { + key: 'ccs', + icon: , + label: t("menus.header.courtesycars"), + children: [ + { + key: 'courtesycarsall', + icon: , + label: ({t("menus.header.courtesycars-all")}) + }, + { + key: 'contracts', + icon: , + label: ({t("menus.header.courtesycars-contracts")}) + }, + { + key: 'newcontract', + icon: , + label: ({t("menus.header.courtesycars-newcontract")}) + }, + ] + }, + { + key: 'accounting', + icon: , + label: t("menus.header.accounting"), + children: accountingChildren, + }, + { + key: 'phonebook', + icon: , + label: ({t("menus.header.phonebook")}) + }, + { + key: 'temporarydocs', + icon: , + label: ({t("menus.header.temporarydocs")}) + }, + { + key: 'shopsubmenu', + icon: , + label: t("menus.header.shop"), + children: [ + { + key: 'shop', + icon: , + label: ({t("menus.header.shop_config")}) + }, + { + key: 'dashboard', + icon: , + label: ({t("menus.header.dashboard")}) + }, + { + key: 'reportcenter', + icon: , + label: t("menus.header.reportcenter"), + onClick: () => { + setReportCenterContext({ + actions: {}, + context: {}, + }); + } + }, + { + key: 'shop-vendors', + icon: , + label: ({t("menus.header.shop_vendors")}) + }, + { + key: 'shop-csi', + icon: , + label: ({t("menus.header.shop_csi")}) + }, + ] + }, + { + key: 'user', + label: ( + currentUser.displayName || + currentUser.email || + t("general.labels.unknown") + ), + children: [ + { + key: 'signout', + icon: , + danger: true, + label: t("user.actions.signout"), + onClick: () => signOutStart() + }, + { + key: 'help', + icon: , + label: t("menus.header.help"), + onClick: () => { + window.open("https://rometech.com//", "_blank"); + } + }, + // { + // key: 'rescue', + // icon: , + // label: t("menus.header.rescueme"), + // onClick: () => { + // window.open("https://imexrescue.com/", "_blank"); + // } + // }, + { + key: 'shiftclock', + icon: , + label: ({t("menus.header.shiftclock")}) + }, + { + key: 'profile', + icon: , + label: ({t("menus.currentuser.profile")}) + }, + // { + // key: 'langselecter', + // label: t("menus.currentuser.languageselector"), + // children: [ + // { + // key: 'en-US', + // label: t("general.languages.english"), + // onClick: () => { + // window.location.href = "/?lang=en-US"; + // } + // }, + // { + // key: 'fr-CA', + // label: t("general.languages.french"), + // onClick: () => { + // window.location.href = "/?lang=fr-CA"; + // } + // }, + // { + // key: 'es-MX', + // label: t("general.languages.spanish"), + // onClick: () => { + // window.location.href = "/?lang=es-MX"; + // } + // }, + // ] + // }, + ] + }, + { + key: 'recent', + icon: , + children: recentItems.map((i, idx) => ({ + key: idx, + label: ({i.label}) + + })), + } + ]; + + + menuItems.push({ + key: 'beta-switch', + style: {marginLeft: 'auto'}, + label: ( + + + Try the new ImEX Online + + + ) + }); + + return ( + + + + + ); } export default connect(mapStateToProps, mapDispatchToProps)(Header); diff --git a/client/src/components/header/header.container.jsx b/client/src/components/header/header.container.jsx index 7cedc6b13..64a00ebe7 100644 --- a/client/src/components/header/header.container.jsx +++ b/client/src/components/header/header.container.jsx @@ -1,31 +1,31 @@ import i18next from "i18next"; import React from "react"; -import { connect } from "react-redux"; -import { setUserLanguage } from "../../redux/user/user.actions"; +import {connect} from "react-redux"; +import {setUserLanguage} from "../../redux/user/user.actions"; import HeaderComponent from "./header.component"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {logImEXEvent} from "../../firebase/firebase.utils"; const mapDispatchToProps = (dispatch) => ({ - setUserLanguage: (language) => dispatch(setUserLanguage(language)), + setUserLanguage: (language) => dispatch(setUserLanguage(language)), }); -export function HeaderContainer({ setUserLanguage }) { - const handleMenuClick = (e) => { - if (e.item.props.actiontype === "lang-select") { - i18next.changeLanguage(e.key, (err, t) => { - if (err) { - logImEXEvent("language_change_error", { error: err }); +export function HeaderContainer({setUserLanguage}) { + const handleMenuClick = (e) => { + if (e.item.props.actiontype === "lang-select") { + i18next.changeLanguage(e.key, (err, t) => { + if (err) { + logImEXEvent("language_change_error", {error: err}); - return console.log("Error encountered when changing languages.", err); + return console.log("Error encountered when changing languages.", err); + } + logImEXEvent("language_change", {language: e.key}); + + setUserLanguage(e.key); + }); } - logImEXEvent("language_change", { language: e.key }); + }; - setUserLanguage(e.key); - }); - } - }; - - return ; + return ; } export default connect(null, mapDispatchToProps)(HeaderContainer); diff --git a/client/src/components/help-rescue/help-rescue.component.jsx b/client/src/components/help-rescue/help-rescue.component.jsx index 1c3dd5ba0..b9a8ac9bc 100644 --- a/client/src/components/help-rescue/help-rescue.component.jsx +++ b/client/src/components/help-rescue/help-rescue.component.jsx @@ -1,53 +1,53 @@ -import { Button, Input, Space } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Button, Input, Space} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; export default function HelpRescue() { - const { t } = useTranslation(); - const [code, setCode] = useState(""); + const {t} = useTranslation(); + const [code, setCode] = useState(""); - const handleClick = async () => { - var bodyFormData = new FormData(); - bodyFormData.append("Code", code); - bodyFormData.append("hostederrorhandling", 1); - await fetch("https://secure.logmeinrescue.com/Customer/Code.aspx", { - mode: "no-cors", - method: "POST", - body: bodyFormData, - }); - }; + const handleClick = async () => { + var bodyFormData = new FormData(); + bodyFormData.append("Code", code); + bodyFormData.append("hostederrorhandling", 1); + await fetch("https://secure.logmeinrescue.com/Customer/Code.aspx", { + mode: "no-cors", + method: "POST", + body: bodyFormData, + }); + }; - return ( -
- -
{t("help.labels.rescuedesc")}
- setCode(e.target.value)} - value={code} - placeholder={t("help.labels.codeplacholder")} - /> - + return ( +
+ +
{t("help.labels.rescuedesc")}
+ setCode(e.target.value)} + value={code} + placeholder={t("help.labels.codeplacholder")} + /> + -
{ - alert(); - }} - > - Enter your 6-digit code: - -
- - - - - -
-
- ); +
{ + alert(); + }} + > + Enter your 6-digit code: + +
+ + + + + +
+
+ ); } diff --git a/client/src/components/indefinite-loading/indefinite-loading.component.jsx b/client/src/components/indefinite-loading/indefinite-loading.component.jsx index 37171a989..d38edeaa9 100644 --- a/client/src/components/indefinite-loading/indefinite-loading.component.jsx +++ b/client/src/components/indefinite-loading/indefinite-loading.component.jsx @@ -1,43 +1,43 @@ -import { useNProgress } from "@tanem/react-nprogress"; +import {useNProgress} from "@tanem/react-nprogress"; import React from "react"; -export default function IndefiniteLoading({ loading }) { - const { animationDuration, isFinished, progress } = useNProgress({ - isAnimating: loading, - }); +export default function IndefiniteLoading({loading}) { + const {animationDuration, isFinished, progress} = useNProgress({ + isAnimating: loading, + }); - return ( -
-
+ return (
-
-
- ); + style={{ + opacity: isFinished ? 0 : 1, + pointerEvents: "none", + transition: `opacity ${animationDuration}ms linear`, + }}> +
+
+
+
+ ); } diff --git a/client/src/components/inventory-bill-ro/inventory-bill-ro.component.jsx b/client/src/components/inventory-bill-ro/inventory-bill-ro.component.jsx index 033192dbd..fca8815d1 100644 --- a/client/src/components/inventory-bill-ro/inventory-bill-ro.component.jsx +++ b/client/src/components/inventory-bill-ro/inventory-bill-ro.component.jsx @@ -1,65 +1,67 @@ -import { Button } from "antd"; +import {Button} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import moment from "moment"; -import { useTranslation } from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import {useTranslation} from "react-i18next"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), }); export default connect(mapStateToProps, mapDispatchToProps)(InventoryBillRo); + export function InventoryBillRo({ - bodyshop, - setBillEnterContext, - inventoryline, -}) { - const { t } = useTranslation(); - return ( - - ); + bodyshop, + setBillEnterContext, + inventoryline, + }) { + const {t} = useTranslation(); + return ( + + ); } diff --git a/client/src/components/inventory-line-delete/inventory-line-delete.component.jsx b/client/src/components/inventory-line-delete/inventory-line-delete.component.jsx index d31be9384..ec7e8c20f 100644 --- a/client/src/components/inventory-line-delete/inventory-line-delete.component.jsx +++ b/client/src/components/inventory-line-delete/inventory-line-delete.component.jsx @@ -1,67 +1,67 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, notification, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { DELETE_INVENTORY_LINE } from "../../graphql/inventory.queries"; +import {DeleteFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, notification, Popconfirm} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {DELETE_INVENTORY_LINE} from "../../graphql/inventory.queries"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; export default function InventoryLineDelete({ - inventoryline, - disabled, - refetch, -}) { - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const [deleteInventoryLine] = useMutation(DELETE_INVENTORY_LINE); + inventoryline, + disabled, + refetch, + }) { + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const [deleteInventoryLine] = useMutation(DELETE_INVENTORY_LINE); - const handleDelete = async () => { - setLoading(true); - const result = await deleteInventoryLine({ - variables: { lineId: inventoryline.id }, - // update(cache, { errors }) { - // cache.modify({ - // fields: { - // inventory(existingInventory, { readField }) { - // console.log(existingInventory); - // return existingInventory.filter( - // (invRef) => inventoryline.id !== readField("id", invRef) - // ); - // }, - // }, - // }); - // }, - }); + const handleDelete = async () => { + setLoading(true); + const result = await deleteInventoryLine({ + variables: {lineId: inventoryline.id}, + // update(cache, { errors }) { + // cache.modify({ + // fields: { + // inventory(existingInventory, { readField }) { + // console.log(existingInventory); + // return existingInventory.filter( + // (invRef) => inventoryline.id !== readField("id", invRef) + // ); + // }, + // }, + // }); + // }, + }); - if (!!!result.errors) { - notification["success"]({ message: t("inventory.successes.deleted") }); - } else { - //Check if it's an fkey violation. + if (!!!result.errors) { + notification["success"]({message: t("inventory.successes.deleted")}); + } else { + //Check if it's an fkey violation. - notification["error"]({ - message: t("bills.errors.deleting", { - error: JSON.stringify(result.errors), - }), - }); - } - if (refetch) refetch(); - setLoading(false); - }; + notification["error"]({ + message: t("bills.errors.deleting", { + error: JSON.stringify(result.errors), + }), + }); + } + if (refetch) refetch(); + setLoading(false); + }; - return ( - }> - - - - - ); + return ( + }> + + + + + ); } diff --git a/client/src/components/inventory-list/inventory-list.component.jsx b/client/src/components/inventory-list/inventory-list.component.jsx index 1e3bce8d7..96a5e64de 100644 --- a/client/src/components/inventory-list/inventory-list.component.jsx +++ b/client/src/components/inventory-list/inventory-list.component.jsx @@ -1,229 +1,224 @@ -import { EditFilled, SyncOutlined, FileAddFilled } from "@ant-design/icons"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {EditFilled, FileAddFilled, SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import InventoryBillRo from "../inventory-bill-ro/inventory-bill-ro.component"; import InventoryLineDelete from "../inventory-line-delete/inventory-line-delete.component"; import {pageLimit} from "../../utils/config"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setInventoryUpsertContext: (context) => - dispatch(setModalContext({ context: context, modal: "inventoryUpsert" })), + setInventoryUpsertContext: (context) => + dispatch(setModalContext({context: context, modal: "inventoryUpsert"})), }); -export function JobsList({ - bodyshop, - refetch, - loading, - jobs, - total, - setInventoryUpsertContext, -}) { - const search = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder } = search; - const history = useHistory(); +export function JobsList({bodyshop, refetch, loading, jobs, total, setInventoryUpsertContext,}) { + const search = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder} = search; + const history = useNavigate(); - const { t } = useTranslation(); - const columns = [ - { - title: t("billlines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", + const {t} = useTranslation(); + const columns = [ + { + title: t("billlines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", - sorter: true, //(a, b) => alphaSort(a.line_desc, b.line_desc), - sortOrder: sortcolumn === "line_desc" && sortorder, - render: (text, record) => - record.billline?.bill?.job ? ( -
-
{text}
- {`(${record.billline?.bill?.job?.v_model_yr} ${record.billline?.bill?.job?.v_make_desc} ${record.billline?.bill?.job?.v_model_desc})`} -
- ) : ( - text - ), - }, - { - title: t("inventory.labels.frombillinvoicenumber"), - dataIndex: "vendorname", - key: "vendorname", - ellipsis: true, - //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sorter: true, //(a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: sortcolumn === "line_desc" && sortorder, + render: (text, record) => + record.billline?.bill?.job ? ( +
+
{text}
+ {`(${record.billline?.bill?.job?.v_model_yr} ${record.billline?.bill?.job?.v_make_desc} ${record.billline?.bill?.job?.v_model_desc})`} +
+ ) : ( + text + ), + }, + { + title: t("inventory.labels.frombillinvoicenumber"), + dataIndex: "vendorname", + key: "vendorname", + ellipsis: true, + //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - //sortOrder: sortcolumn === "ownr_ln" && sortorder, - render: (text, record) => - ( - (record.billline?.bill?.invoice_number || "") + - " " + - (record.manualinvoicenumber || "") - ).trim(), - }, - { - title: t("inventory.labels.fromvendor"), - dataIndex: "vendorname", - key: "vendorname", - ellipsis: true, - //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + //sortOrder: sortcolumn === "ownr_ln" && sortorder, + render: (text, record) => + ( + (record.billline?.bill?.invoice_number || "") + + " " + + (record.manualinvoicenumber || "") + ).trim(), + }, + { + title: t("inventory.labels.fromvendor"), + dataIndex: "vendorname", + key: "vendorname", + ellipsis: true, + //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - //sortOrder: sortcolumn === "ownr_ln" && sortorder, - render: (text, record) => - ( - (record.billline?.bill?.vendor?.name || "") + - " " + - (record.manualvendor || "") - ).trim(), - }, - { - title: t("billlines.fields.actual_price"), - dataIndex: "actual_price", - key: "actual_price", + //sortOrder: sortcolumn === "ownr_ln" && sortorder, + render: (text, record) => + ( + (record.billline?.bill?.vendor?.name || "") + + " " + + (record.manualvendor || "") + ).trim(), + }, + { + title: t("billlines.fields.actual_price"), + dataIndex: "actual_price", + key: "actual_price", - render: (text, record) => ( - {record.actual_price} - ), - }, - { - title: t("billlines.fields.actual_cost"), - dataIndex: "actual_cost", - key: "actual_cost", + render: (text, record) => ( + {record.actual_price} + ), + }, + { + title: t("billlines.fields.actual_cost"), + dataIndex: "actual_cost", + key: "actual_cost", - render: (text, record) => ( - {record.actual_cost} - ), - }, - { - title: t("inventory.fields.comment"), - dataIndex: "comment", - key: "comment", - }, - { - title: t("inventory.labels.consumedbyjob"), - dataIndex: "consumedbyjob", - key: "consumedbyjob", + render: (text, record) => ( + {record.actual_cost} + ), + }, + { + title: t("inventory.fields.comment"), + dataIndex: "comment", + key: "comment", + }, + { + title: t("inventory.labels.consumedbyjob"), + dataIndex: "consumedbyjob", + key: "consumedbyjob", - ellipsis: true, - render: (text, record) => - record.bill?.job?.ro_number ? ( - - {record.bill?.job?.ro_number} - - ) : ( - - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", + ellipsis: true, + render: (text, record) => + record.bill?.job?.ro_number ? ( + + {record.bill?.job?.ro_number} + + ) : ( + + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", - ellipsis: true, - render: (text, record) => ( - - - - - ), - }, - ]; + ellipsis: true, + render: (text, record) => ( + + + + + ), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - search.page = pagination.current; - search.sortcolumn = sorter.column && sorter.column.key; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + search.page = pagination.current; + search.sortcolumn = sorter.column && sorter.column.key; + search.sortorder = sorter.order; + history({search: queryString.stringify(search)}); + }; - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - + + )} + + + + + { + search.search = value; + history({search: queryString.stringify(search)}); + }} + enterButton + /> + + } + > +
- {t("general.actions.clear")} - - - )} - - - - - { - search.search = value; - history.push({ search: queryString.stringify(search) }); - }} - enterButton - /> - - } - > -
- - ); + columns={columns} + rowKey="id" + dataSource={jobs} + onChange={handleTableChange} + /> + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsList); diff --git a/client/src/components/inventory-list/inventory-list.container.jsx b/client/src/components/inventory-list/inventory-list.container.jsx index e98266464..3990cdfce 100644 --- a/client/src/components/inventory-list/inventory-list.container.jsx +++ b/client/src/components/inventory-list/inventory-list.container.jsx @@ -1,65 +1,62 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; import React from "react"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_INVENTORY_PAGINATED } from "../../graphql/inventory.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_INVENTORY_PAGINATED} from "../../graphql/inventory.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import AlertComponent from "../alert/alert.component"; import InventoryListPaginated from "./inventory-list.component"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - //bodyshop: selectBodyshop, + //bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function InventoryList({ setBreadcrumbs, setSelectedHeader }) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, search, showall } = searchParams; +export function InventoryList({setBreadcrumbs, setSelectedHeader}) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, search, showall} = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_INVENTORY_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - consumedIsNull: showall === "true" ? null : true, - order: [ - { - [sortcolumn || "created_at"]: - sortorder && sortorder !== "false" - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); + const {loading, error, data, refetch} = useQuery( + QUERY_INVENTORY_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + search: search || "", + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + consumedIsNull: showall === "true" ? null : true, + order: [ + { + [sortcolumn || "created_at"]: + sortorder && sortorder !== "false" + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); - if (error) return ; - return ( - - ); + if (error) return ; + return ( + + ); } export default connect(mapStateToProps, mapDispatchToProps)(InventoryList); diff --git a/client/src/components/inventory-upsert-modal/inventory-upsert-modal.component.jsx b/client/src/components/inventory-upsert-modal/inventory-upsert-modal.component.jsx index 7d5d28ebb..dcf7fb4a7 100644 --- a/client/src/components/inventory-upsert-modal/inventory-upsert-modal.component.jsx +++ b/client/src/components/inventory-upsert-modal/inventory-upsert-modal.component.jsx @@ -1,68 +1,69 @@ -import { Form, Input, Space } from "antd"; +import {Form, Input, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectInventoryUpsert } from "../../redux/modals/modals.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectInventoryUpsert} from "../../redux/modals/modals.selectors"; import FormItemCurrency from "../form-items-formatted/currency-form-item.component"; + const mapStateToProps = createStructuredSelector({ - inventoryUpsertModal: selectInventoryUpsert, + inventoryUpsertModal: selectInventoryUpsert, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(NoteUpsertModalComponent); -export function NoteUpsertModalComponent({ form, inventoryUpsertModal }) { - const { t } = useTranslation(); - const { existingInventory } = inventoryUpsertModal.context; +export function NoteUpsertModalComponent({form, inventoryUpsertModal}) { + const {t} = useTranslation(); + const {existingInventory} = inventoryUpsertModal.context; - return ( - - - - - - - + return ( + + + + + + + - {!existingInventory && ( - <> - - - - - - - - - - - - - - )} - - ); + {!existingInventory && ( + <> + + + + + + + + + + + + + + )} + + ); } diff --git a/client/src/components/inventory-upsert-modal/inventory-upsert-modal.container.jsx b/client/src/components/inventory-upsert-modal/inventory-upsert-modal.container.jsx index 715131b02..819aca650 100644 --- a/client/src/components/inventory-upsert-modal/inventory-upsert-modal.container.jsx +++ b/client/src/components/inventory-upsert-modal/inventory-upsert-modal.container.jsx @@ -1,126 +1,120 @@ -import { useMutation } from "@apollo/client"; -import { Form, Modal, notification } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - INSERT_INVENTORY_LINE, - UPDATE_INVENTORY_LINE, -} from "../../graphql/inventory.queries"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectInventoryUpsert } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Form, Modal, notification} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_INVENTORY_LINE, UPDATE_INVENTORY_LINE,} from "../../graphql/inventory.queries"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectInventoryUpsert} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import InventoryUpsertModal from "./inventory-upsert-modal.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, - inventoryUpsertModal: selectInventoryUpsert, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + inventoryUpsertModal: selectInventoryUpsert, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("inventoryUpsert")), + toggleModalVisible: () => dispatch(toggleModalVisible("inventoryUpsert")), }); export function InventoryUpsertModalContainer({ - currentUser, - bodyshop, - inventoryUpsertModal, - toggleModalVisible, -}) { - const { t } = useTranslation(); - const [insertInventory] = useMutation(INSERT_INVENTORY_LINE); - const [updateInventoryLine] = useMutation(UPDATE_INVENTORY_LINE); + currentUser, + bodyshop, + inventoryUpsertModal, + toggleModalVisible, + }) { + const {t} = useTranslation(); + const [insertInventory] = useMutation(INSERT_INVENTORY_LINE); + const [updateInventoryLine] = useMutation(UPDATE_INVENTORY_LINE); - const { visible, context, actions } = inventoryUpsertModal; - const { existingInventory } = context; - const { refetch } = actions; + const {open, context, actions} = inventoryUpsertModal; + const {existingInventory} = context; + const {refetch} = actions; - const [form] = Form.useForm(); + const [form] = Form.useForm(); - useEffect(() => { - //Required to prevent infinite looping. - if (existingInventory && visible) { - form.setFieldsValue(existingInventory); - } else if (!existingInventory && visible) { - form.resetFields(); - } - }, [existingInventory, form, visible]); + useEffect(() => { + //Required to prevent infinite looping. + if (existingInventory && open) { + form.setFieldsValue(existingInventory); + } else if (!existingInventory && open) { + form.resetFields(); + } + }, [existingInventory, form, open]); - const handleFinish = async (formValues) => { - const values = formValues; + const handleFinish = async (formValues) => { + const values = formValues; - if (existingInventory) { - logImEXEvent("inventory_update"); + if (existingInventory) { + logImEXEvent("inventory_update"); - updateInventoryLine({ - variables: { - inventoryId: existingInventory.id, - inventoryItem: values, - }, - }).then((r) => { - notification["success"]({ - message: t("inventory.successes.updated"), - }); - }); - // if (refetch) refetch(); - toggleModalVisible(); - } else { - logImEXEvent("inventory_insert"); + updateInventoryLine({ + variables: { + inventoryId: existingInventory.id, + inventoryItem: values, + }, + }).then((r) => { + notification["success"]({ + message: t("inventory.successes.updated"), + }); + }); + // if (refetch) refetch(); + toggleModalVisible(); + } else { + logImEXEvent("inventory_insert"); - await insertInventory({ - variables: { - inventoryItem: { shopid: bodyshop.id, ...values }, - }, - update(cache, { data }) { - cache.modify({ - fields: { - inventory(existingInv) { - return [...existingInv, data.insert_inventory_one]; - }, - }, - }); - }, - }); + await insertInventory({ + variables: { + inventoryItem: {shopid: bodyshop.id, ...values}, + }, + update(cache, {data}) { + cache.modify({ + fields: { + inventory(existingInv) { + return [...existingInv, data.insert_inventory_one]; + }, + }, + }); + }, + }); - if (refetch) refetch(); - form.resetFields(); - toggleModalVisible(); - notification["success"]({ - message: t("inventory.successes.inserted"), - }); - } - }; + if (refetch) refetch(); + form.resetFields(); + toggleModalVisible(); + notification["success"]({ + message: t("inventory.successes.inserted"), + }); + } + }; - return ( - { - form.submit(); - }} - onCancel={() => { - toggleModalVisible(); - }} - destroyOnClose - > -
- - -
- ); + return ( + { + form.submit(); + }} + onCancel={() => { + toggleModalVisible(); + }} + destroyOnClose + > +
+ + +
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(InventoryUpsertModalContainer); diff --git a/client/src/components/job-3rd-party-modal/job-3rd-party-modal.component.jsx b/client/src/components/job-3rd-party-modal/job-3rd-party-modal.component.jsx index b0657d270..2ae6bcdac 100644 --- a/client/src/components/job-3rd-party-modal/job-3rd-party-modal.component.jsx +++ b/client/src/components/job-3rd-party-modal/job-3rd-party-modal.component.jsx @@ -1,227 +1,227 @@ -import { useQuery } from "@apollo/client"; -import { Button, Form, Input, InputNumber, Modal, Radio, Select } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { SEARCH_VENDOR_AUTOCOMPLETE_WITH_ADDR } from "../../graphql/vendors.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {useQuery} from "@apollo/client"; +import {Button, Form, Input, InputNumber, Modal, Radio, Select} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {SEARCH_VENDOR_AUTOCOMPLETE_WITH_ADDR} from "../../graphql/vendors.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(Jobd3RdPartyModal); -export function Jobd3RdPartyModal({ bodyshop, jobId, job, technician }) { - const [isModalVisible, setIsModalVisible] = useState(false); - const { t } = useTranslation(); - const [form] = Form.useForm(); - const { data: VendorAutoCompleteData } = useQuery( - SEARCH_VENDOR_AUTOCOMPLETE_WITH_ADDR, - { - skip: !isModalVisible, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); - - const showModal = () => { - form.setFieldsValue({ - ded_amt: job.ded_amt, - depreciation: job.depreciation_taxes, - custgst: job.ca_customer_gst, - }); - setIsModalVisible(true); - }; - - const handleOk = () => { - form.submit(); - setIsModalVisible(false); - }; - - const handleCancel = () => { - form.resetFields(); - setIsModalVisible(false); - }; - const handleFinish = (values) => { - const { sendtype, ...restVals } = values; - - GenerateDocument( - { - name: TemplateList("job_special").special_thirdpartypayer.key, - variables: { id: jobId }, - context: restVals, - }, - { subject: TemplateList("job_special").special_thirdpartypayer.subject }, - sendtype +export function Jobd3RdPartyModal({bodyshop, jobId, job, technician}) { + const [isModalVisible, setIsModalVisible] = useState(false); + const {t} = useTranslation(); + const [form] = Form.useForm(); + const {data: VendorAutoCompleteData} = useQuery( + SEARCH_VENDOR_AUTOCOMPLETE_WITH_ADDR, + { + skip: !isModalVisible, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } ); - }; - const handleInsSelect = (value, option) => { - form.setFieldsValue({ - addr1: option.obj.name, - addr2: option.obj.street1, - addr3: option.obj.street2, - city: option.obj.city, - state: option.obj.state, - zip: option.obj.zip, - vendorid: null, - }); - }; + const showModal = () => { + form.setFieldsValue({ + ded_amt: job.ded_amt, + depreciation: job.depreciation_taxes, + custgst: job.ca_customer_gst, + }); + setIsModalVisible(true); + }; - const handleVendorSelect = (vendorid, opt) => { - const vendor = VendorAutoCompleteData.vendors.filter( - (v) => v.id === vendorid - )[0]; - if (vendor) { - form.setFieldsValue({ - addr1: vendor.name, - addr2: vendor.street1, - addr3: vendor.street2, - city: vendor.city, - state: vendor.state, - zip: vendor.zip, - ins_co_id: null, - }); - } - }; + const handleOk = () => { + form.submit(); + setIsModalVisible(false); + }; - return ( - <> - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {!technician ? ( - {t("parts_orders.labels.email")} - ) : null} - {t("parts_orders.labels.print")} - - - -
- - ); + const handleCancel = () => { + form.resetFields(); + setIsModalVisible(false); + }; + const handleFinish = (values) => { + const {sendtype, ...restVals} = values; + + GenerateDocument( + { + name: TemplateList("job_special").special_thirdpartypayer.key, + variables: {id: jobId}, + context: restVals, + }, + {subject: TemplateList("job_special").special_thirdpartypayer.subject}, + sendtype + ); + }; + + const handleInsSelect = (value, option) => { + form.setFieldsValue({ + addr1: option.obj.name, + addr2: option.obj.street1, + addr3: option.obj.street2, + city: option.obj.city, + state: option.obj.state, + zip: option.obj.zip, + vendorid: null, + }); + }; + + const handleVendorSelect = (vendorid, opt) => { + const vendor = VendorAutoCompleteData.vendors.filter( + (v) => v.id === vendorid + )[0]; + if (vendor) { + form.setFieldsValue({ + addr1: vendor.name, + addr2: vendor.street1, + addr3: vendor.street2, + city: vendor.city, + state: vendor.state, + zip: vendor.zip, + ins_co_id: null, + }); + } + }; + + return ( + <> + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {!technician ? ( + {t("parts_orders.labels.email")} + ) : null} + {t("parts_orders.labels.print")} + + + +
+ + ); } diff --git a/client/src/components/job-at-change/job-at-change.component.jsx b/client/src/components/job-at-change/job-at-change.component.jsx index bd6c556ef..26f581d10 100644 --- a/client/src/components/job-at-change/job-at-change.component.jsx +++ b/client/src/components/job-at-change/job-at-change.component.jsx @@ -1,61 +1,65 @@ import React from "react"; -import { useMutation } from "@apollo/client"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { Dropdown, Menu, notification } from "antd"; -import { DownOutlined } from "@ant-design/icons"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {Dropdown, notification} from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JobAltTransportChange({ bodyshop, job }) { - const [updateJob] = useMutation(UPDATE_JOB); - const { t } = useTranslation(); +export function JobAltTransportChange({bodyshop, job}) { + const [updateJob] = useMutation(UPDATE_JOB); + const {t} = useTranslation(); - const onClick = async ({ key }) => { - const result = await updateJob({ - variables: { - jobId: job.id, - job: { alt_transport: key === "null" ? null : key }, - }, - }); + const onClick = async ({key}) => { + const result = await updateJob({ + variables: { + jobId: job.id, + job: {alt_transport: key === "null" ? null : key}, + }, + }); - if (!!!result.errors) { - // notification["success"]({ message: t("appointments.successes.saved") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - }; - const menu = ( - - {bodyshop.appt_alt_transport && - bodyshop.appt_alt_transport.map((alt) => ( - {alt} - ))} - - {t("general.actions.clear")} - - ); - return ( - - e.preventDefault()}> - - - - ); + if (!!!result.errors) { + // notification["success"]({ message: t("appointments.successes.saved") }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + }; + + const menu = { + items: [ + ...(bodyshop.appt_alt_transport || []).map((alt) => ({ + key: alt, + label: alt, + })), + {key: "null", label: t("general.actions.clear")}, + ], + onClick: onClick, + defaultSelectedKeys: [job && job.alt_transport] + }; + + return ( + + e.preventDefault()}> + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobAltTransportChange); diff --git a/client/src/components/job-at-change/schedule-event.color.component.jsx b/client/src/components/job-at-change/schedule-event.color.component.jsx index 632bbdfcf..5de77c758 100644 --- a/client/src/components/job-at-change/schedule-event.color.component.jsx +++ b/client/src/components/job-at-change/schedule-event.color.component.jsx @@ -1,69 +1,72 @@ import React from "react"; -import { useMutation } from "@apollo/client"; -import { UPDATE_APPOINTMENT } from "../../graphql/appointments.queries"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { Dropdown, Menu, notification } from "antd"; -import { DownOutlined } from "@ant-design/icons"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {UPDATE_APPOINTMENT} from "../../graphql/appointments.queries"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {Dropdown, notification} from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ScheduleEventColor({ bodyshop, event }) { - const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); - const { t } = useTranslation(); +export function ScheduleEventColor({bodyshop, event}) { + const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); + const {t} = useTranslation(); - const onClick = async ({ key }) => { - const result = await updateAppointment({ - variables: { - appid: event.id, - app: { color: key === "null" ? null : key }, - }, - }); + const onClick = async ({key}) => { + const result = await updateAppointment({ + variables: { + appid: event.id, + app: {color: key === "null" ? null : key}, + }, + }); - if (!!!result.errors) { - notification["success"]({ message: t("appointments.successes.saved") }); - } else { - notification["error"]({ - message: t("appointments.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - }; + if (!!!result.errors) { + notification["success"]({message: t("appointments.successes.saved")}); + } else { + notification["error"]({ + message: t("appointments.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + }; - const selectedColor = - event.color && - bodyshop.appt_colors && - bodyshop.appt_colors.filter((color) => color.color.hex === event.color)[0] - ?.label; + const selectedColor = + event.color && + bodyshop.appt_colors && + bodyshop.appt_colors.filter((color) => color.color.hex === event.color)[0] + ?.label; - const menu = ( - - {bodyshop.appt_colors && - bodyshop.appt_colors.map((color) => ( - - {color.label} - - ))} - - {t("general.actions.clear")} - - ); - return ( - - e.preventDefault()}> - {selectedColor} - - - - ); + const menu = { + defaultSelectedKeys: [event.color], + onClick: onClick, + items: [ + ...(bodyshop.appt_colors || []).map((color) => ({ + key: color.color.hex, + label: color.label, + style: {color: color.color.hex}, + })), + {type: "divider"}, + {key: "null", label: t("general.actions.clear")}, + ] + }; + + return ( + + e.preventDefault()}> + {selectedColor} + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ScheduleEventColor); diff --git a/client/src/components/job-at-change/schedule-event.component.jsx b/client/src/components/job-at-change/schedule-event.component.jsx index 61739c9b1..d09938940 100644 --- a/client/src/components/job-at-change/schedule-event.component.jsx +++ b/client/src/components/job-at-change/schedule-event.component.jsx @@ -1,33 +1,19 @@ -import { AlertFilled } from "@ant-design/icons"; -import { - Button, - Divider, - Dropdown, - Form, - Input, - Menu, - notification, - Popover, - Select, - Space, -} from "antd"; +import {AlertFilled} from "@ant-design/icons"; +import {Button, Divider, Dropdown, Form, Input, notification, Popover, Select, Space,} from "antd"; import parsePhoneNumber from "libphonenumber-js"; -import moment from "moment"; +import dayjs from "../../utils/day"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { - openChatByPhone, - setMessage, -} from "../../redux/messaging/messaging.actions"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {openChatByPhone, setMessage,} from "../../redux/messaging/messaging.actions"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import ChatOpenButton from "../chat-open-button/chat-open-button.component"; import DataLabel from "../data-label/data-label.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; @@ -35,357 +21,358 @@ import ScheduleManualEvent from "../schedule-manual-event/schedule-manual-event. import ScheduleAtChange from "./job-at-change.component"; import ScheduleEventColor from "./schedule-event.color.component"; import ScheduleEventNote from "./schedule-event.note.component"; -import { useMutation } from "@apollo/client"; -import { UPDATE_APPOINTMENT } from "../../graphql/appointments.queries"; +import {useMutation} from "@apollo/client"; +import {UPDATE_APPOINTMENT} from "../../graphql/appointments.queries"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setScheduleContext: (context) => - dispatch(setModalContext({ context: context, modal: "schedule" })), - openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), - setMessage: (text) => dispatch(setMessage(text)), + setScheduleContext: (context) => + dispatch(setModalContext({context: context, modal: "schedule"})), + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), + setMessage: (text) => dispatch(setMessage(text)), }); export function ScheduleEventComponent({ - bodyshop, - setMessage, - openChatByPhone, - event, - refetch, - handleCancel, - setScheduleContext, -}) { - const { t } = useTranslation(); - const [visible, setVisible] = useState(false); - const history = useHistory(); - const searchParams = queryString.parse(useLocation().search); - const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); - const [title, setTitle] = useState(event.title); - const blockContent = ( - - setTitle(e.currentTarget.value)} - onBlur={async () => { - await updateAppointment({ - variables: { - appid: event.id, - app: { - title: title, - }, - }, - optimisticResponse: { - update_appointments: { - __typename: "appointments_mutation_response", - returning: [ - { - ...event, - title: title, - __typename: "appointments", - }, - ], - }, - }, - }); - }} - /> + bodyshop, + setMessage, + openChatByPhone, + event, + refetch, + handleCancel, + setScheduleContext, + }) { + const {t} = useTranslation(); + const [open, setOpen] = useState(false); + const history = useNavigate(); + const searchParams = queryString.parse(useLocation().search); + const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); + const [title, setTitle] = useState(event.title); + const blockContent = ( + + setTitle(e.currentTarget.value)} + onBlur={async () => { + await updateAppointment({ + variables: { + appid: event.id, + app: { + title: title, + }, + }, + optimisticResponse: { + update_appointments: { + __typename: "appointments_mutation_response", + returning: [ + { + ...event, + title: title, + __typename: "appointments", + }, + ], + }, + }, + }); + }} + /> - - - ); - - const popoverContent = ( -
- {!event.isintake ? ( - - {event.title} - + - ) : ( - - - - - + ); + + const popoverContent = ( +
+ {!event.isintake ? ( + + {event.title} + + + ) : ( + + + + + {`${(event.job && event.job.v_model_yr) || ""} ${ - (event.job && event.job.v_make_desc) || "" + (event.job && event.job.v_make_desc) || "" } ${(event.job && event.job.v_model_desc) || ""}`} - - - )} + + + )} - {event.job ? ( -
- - {(event.job && event.job.ro_number) || ""} - - - - {(event.job && event.job.clm_total) || ""} - - - - {(event.job && event.job.ins_co_nm) || ""} - - - {(event.job && event.job.clm_no) || ""} - - - {(event.job && event.job.ownr_ea) || ""} - - - - - - - - - {(event.job && event.job.alt_transport) || ""} - - - + {event.job ? ( +
+ + {(event.job && event.job.ro_number) || ""} + + + + {(event.job && event.job.clm_total) || ""} + + + + {(event.job && event.job.ins_co_nm) || ""} + + + {(event.job && event.job.clm_no) || ""} + + + {(event.job && event.job.ownr_ea) || ""} + + + + + + + + + {(event.job && event.job.alt_transport) || ""} + + + +
+ ) : ( +
{event.note || ""}
+ )} + + + {event.job ? ( + + + + ) : null} + {event.job ? ( + + ) : null} + {event.job ? ( + { + const Template = TemplateList("job").appointment_reminder; + GenerateDocument( + { + name: Template.key, + variables: {id: event.job.id}, + }, + { + to: event.job && event.job.ownr_ea, + subject: Template.subject, + }, + "e", + event.job && event.job.id + ); + }, + }, + { + key: "sms", + label: t("general.labels.sms"), + disabled: event.arrived || !bodyshop.messagingservicesid, + onClick: () => { + const p = parsePhoneNumber(event.job.ownr_ph1, "CA"); + if (p && p.isValid()) { + openChatByPhone({ + phone_num: p.formatInternational(), + jobid: event.job.id, + }); + setMessage( + t("appointments.labels.reminder", { + shopname: bodyshop.shopname, + date: dayjs(event.start).format("MM/DD/YYYY"), + time: dayjs(event.start).format("HH:mm a"), + }) + ); + setOpen(false); + } else { + notification["error"]({ + message: t("messaging.error.invalidphone"), + }); + } + }, + }, + ] + }} + > + + + ) : null} + {event.arrived ? ( + + ) : ( + { + handleCancel({id: event.id, lost_sale_reason}); + }} + > + + ({ - label: lsr, - value: lsr, - }))} - /> - - - - } - > - - - )} + content={event.block ? blockContent : popoverContent} + style={{ + height: "100%", + width: "100%", - {event.isintake ? ( - - ) : ( - - )} - {event.isintake ? ( - - - - ) : null} - -
- ); - - const RegularEvent = event.isintake ? ( - - {event.note && } - {`${event.job.ro_number || t("general.labels.na")}`} - - - - {`${(event.job && event.job.v_model_yr) || ""} ${ - (event.job && event.job.v_make_desc) || "" - } ${(event.job && event.job.v_model_desc) || ""}`} - - {`(${(event.job && event.job.labhrs.aggregate.sum.mod_lb_hrs) || "0"} / ${ - (event.job && event.job.larhrs.aggregate.sum.mod_lb_hrs) || "0" - })`} - - {event.job && event.job.alt_transport && ( -
{event.job.alt_transport}
- )} -
- ) : ( -
- {`${event.title || ""}`} -
- ); - - return ( - !event.vacation && setVisible(vis)} - trigger="click" - content={event.block ? blockContent : popoverContent} - style={{ - height: "100%", - width: "100%", - - backgroundColor: - event.color && event.color.hex ? event.color.hex : event.color, - }} - > - {RegularEvent} - - ); + > + {RegularEvent} + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleEventComponent); diff --git a/client/src/components/job-at-change/schedule-event.container.jsx b/client/src/components/job-at-change/schedule-event.container.jsx index 60abf9c61..755520627 100644 --- a/client/src/components/job-at-change/schedule-event.container.jsx +++ b/client/src/components/job-at-change/schedule-event.container.jsx @@ -1,78 +1,78 @@ -import { useMutation } from "@apollo/client"; -import { notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {notification} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { useDispatch } from "react-redux"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { CANCEL_APPOINTMENT_BY_ID } from "../../graphql/appointments.queries"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {useTranslation} from "react-i18next"; +import {useDispatch} from "react-redux"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {CANCEL_APPOINTMENT_BY_ID} from "../../graphql/appointments.queries"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import ScheduleEventComponent from "./schedule-event.component"; -export default function ScheduleEventContainer({ bodyshop, event, refetch }) { - const dispatch = useDispatch(); - const { t } = useTranslation(); - const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID); - const [updateJob] = useMutation(UPDATE_JOB); - const handleCancel = async ({ id, lost_sale_reason }) => { - logImEXEvent("schedule_cancel_appt"); +export default function ScheduleEventContainer({bodyshop, event, refetch}) { + const dispatch = useDispatch(); + const {t} = useTranslation(); + const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID); + const [updateJob] = useMutation(UPDATE_JOB); + const handleCancel = async ({id, lost_sale_reason}) => { + logImEXEvent("schedule_cancel_appt"); - const cancelAppt = await cancelAppointment({ - variables: { appid: event.id }, - }); - notification["success"]({ - message: t("appointments.successes.canceled"), - }); - - if (!!cancelAppt.errors) { - notification["error"]({ - message: t("appointments.errors.canceling", { - message: JSON.stringify(cancelAppt.errors), - }), - }); - return; - } - - if (event.job) { - const jobUpdate = await updateJob({ - variables: { - jobId: event.job.id, - job: { - date_scheduled: null, - scheduled_in: null, - scheduled_completion: null, - lost_sale_reason, - date_lost_sale: new Date(), - status: bodyshop.md_ro_statuses.default_imported, - }, - }, - }); - if (!jobUpdate.errors) { - dispatch( - insertAuditTrail({ - jobid: event.job.id, - operation: AuditTrailMapping.appointmentcancel(lost_sale_reason), - }) - ); - } - if (!!jobUpdate.errors) { - notification["error"]({ - message: t("jobs.errors.updating", { - message: JSON.stringify(jobUpdate.errors), - }), + const cancelAppt = await cancelAppointment({ + variables: {appid: event.id}, + }); + notification["success"]({ + message: t("appointments.successes.canceled"), }); - return; - } - } - if (refetch) refetch(); - }; - return ( - - ); + if (!!cancelAppt.errors) { + notification["error"]({ + message: t("appointments.errors.canceling", { + message: JSON.stringify(cancelAppt.errors), + }), + }); + return; + } + + if (event.job) { + const jobUpdate = await updateJob({ + variables: { + jobId: event.job.id, + job: { + date_scheduled: null, + scheduled_in: null, + scheduled_completion: null, + lost_sale_reason, + date_lost_sale: new Date(), + status: bodyshop.md_ro_statuses.default_imported, + }, + }, + }); + if (!jobUpdate.errors) { + dispatch( + insertAuditTrail({ + jobid: event.job.id, + operation: AuditTrailMapping.appointmentcancel(lost_sale_reason), + }) + ); + } + if (!!jobUpdate.errors) { + notification["error"]({ + message: t("jobs.errors.updating", { + message: JSON.stringify(jobUpdate.errors), + }), + }); + return; + } + } + if (refetch) refetch(); + }; + + return ( + + ); } diff --git a/client/src/components/job-at-change/schedule-event.note.component.jsx b/client/src/components/job-at-change/schedule-event.note.component.jsx index 713c38845..951e7a271 100644 --- a/client/src/components/job-at-change/schedule-event.note.component.jsx +++ b/client/src/components/job-at-change/schedule-event.note.component.jsx @@ -1,74 +1,75 @@ -import { EditFilled, SaveFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, Input, notification, Space } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_APPOINTMENT } from "../../graphql/appointments.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {EditFilled, SaveFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, Input, notification, Space} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_APPOINTMENT} from "../../graphql/appointments.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import DataLabel from "../data-label/data-label.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ScheduleEventNote({ event }) { - const [editing, setEditing] = useState(false); - const [note, setNote] = useState(event.note || ""); - const [loading, setLoading] = useState(false); - const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); - const { t } = useTranslation(); +export function ScheduleEventNote({event}) { + const [editing, setEditing] = useState(false); + const [note, setNote] = useState(event.note || ""); + const [loading, setLoading] = useState(false); + const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); + const {t} = useTranslation(); - const toggleEdit = async () => { - if (editing) { - //Await the update - setLoading(true); - const result = await updateAppointment({ - variables: { - appid: event.id, - app: { note }, - }, - }); + const toggleEdit = async () => { + if (editing) { + //Await the update + setLoading(true); + const result = await updateAppointment({ + variables: { + appid: event.id, + app: {note}, + }, + }); - if (!!!result.errors) { - // notification["success"]({ message: t("appointments.successes.saved") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } + if (!!!result.errors) { + // notification["success"]({ message: t("appointments.successes.saved") }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } - setEditing(false); - } else { - setEditing(true); - } - setLoading(false); - }; + setEditing(false); + } else { + setEditing(true); + } + setLoading(false); + }; - return ( - - - {!editing ? ( - event.note || "" - ) : ( - setNote(e.target.value)} - style={{ maxWidth: "8vw" }} - /> - )} - - - - ); + return ( + + + {!editing ? ( + event.note || "" + ) : ( + setNote(e.target.value)} + style={{maxWidth: "8vw"}} + /> + )} + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ScheduleEventNote); diff --git a/client/src/components/job-audit-trail/job-audit-trail.component.jsx b/client/src/components/job-audit-trail/job-audit-trail.component.jsx index a4349f9f5..d9376504d 100644 --- a/client/src/components/job-audit-trail/job-audit-trail.component.jsx +++ b/client/src/components/job-audit-trail/job-audit-trail.component.jsx @@ -1,153 +1,154 @@ -import { useQuery } from "@apollo/client"; -import { Button, Card, Col, Row, Table, Tag } from "antd"; -import { SyncOutlined } from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Col, Row, Table, Tag} from "antd"; +import {SyncOutlined} from "@ant-design/icons"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { QUERY_AUDIT_TRAIL } from "../../graphql/audit_trail.queries"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {QUERY_AUDIT_TRAIL} from "../../graphql/audit_trail.queries"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobAuditTrail); -export function JobAuditTrail({ currentUser, jobId }) { - const { t } = useTranslation(); - const { loading, data, refetch } = useQuery(QUERY_AUDIT_TRAIL, { - variables: { jobid: jobId }, - skip: !jobId, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +export function JobAuditTrail({currentUser, jobId}) { + const {t} = useTranslation(); + const {loading, data, refetch} = useQuery(QUERY_AUDIT_TRAIL, { + variables: {jobid: jobId}, + skip: !jobId, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const columns = [ - { - title: t("audit.fields.created"), - dataIndex: "created", - key: "created", - render: (text, record) => ( - {record.created} - ), - }, - { - title: t("audit.fields.useremail"), - dataIndex: "useremail", - key: "useremail", - }, - { - title: t("audit.fields.operation"), - dataIndex: "operation", - key: "operation", - }, - ]; - const emailColumns = [ - { - title: t("audit.fields.created"), - dataIndex: " created_at", - key: " created_at", - - render: (text, record) => ( - {record.created_at} - ), - }, - - { - title: t("audit.fields.useremail"), - dataIndex: "useremail", - key: "useremail", - }, - - { - title: t("audit.fields.to"), - dataIndex: "to", - key: "to", - - render: (text, record) => - record.to && - record.to.map((email, idx) => {email}), - }, - { - title: t("audit.fields.cc"), - dataIndex: "cc", - key: "cc", - - render: (text, record) => - record.cc && - record.cc.map((email, idx) => {email}), - }, - { - title: t("audit.fields.subject"), - dataIndex: "subject", - key: "subject", - }, - { - title: t("audit.fields.status"), - dataIndex: "status", - key: "status", - }, - ...(currentUser?.email.includes("@imex.") - ? [ - { - title: t("audit.fields.contents"), - dataIndex: "contents", - key: "contents", - width: "10%", + const columns = [ + { + title: t("audit.fields.created"), + dataIndex: "created", + key: "created", render: (text, record) => ( - + {record.created} ), - }, - ] - : []), - ]; - return ( - -
- { - refetch(); - }} - > - - - } - > -
- - - - -
- - - - ); + }, + { + title: t("audit.fields.useremail"), + dataIndex: "useremail", + key: "useremail", + }, + { + title: t("audit.fields.operation"), + dataIndex: "operation", + key: "operation", + }, + ]; + const emailColumns = [ + { + title: t("audit.fields.created"), + dataIndex: " created_at", + key: " created_at", + + render: (text, record) => ( + {record.created_at} + ), + }, + + { + title: t("audit.fields.useremail"), + dataIndex: "useremail", + key: "useremail", + }, + + { + title: t("audit.fields.to"), + dataIndex: "to", + key: "to", + + render: (text, record) => + record.to && + record.to.map((email, idx) => {email}), + }, + { + title: t("audit.fields.cc"), + dataIndex: "cc", + key: "cc", + + render: (text, record) => + record.cc && + record.cc.map((email, idx) => {email}), + }, + { + title: t("audit.fields.subject"), + dataIndex: "subject", + key: "subject", + }, + { + title: t("audit.fields.status"), + dataIndex: "status", + key: "status", + }, + ...(currentUser?.email.includes("@imex.") + ? [ + { + title: t("audit.fields.contents"), + dataIndex: "contents", + key: "contents", + width: "10%", + render: (text, record) => ( + + ), + }, + ] + : []), + ]; + return ( + + + { + refetch(); + }} + > + + + } + > +
+ + + + +
+ + + + ); } diff --git a/client/src/components/job-bills-total/job-bills-total.component.jsx b/client/src/components/job-bills-total/job-bills-total.component.jsx index 45f820630..27858c9f7 100644 --- a/client/src/components/job-bills-total/job-bills-total.component.jsx +++ b/client/src/components/job-bills-total/job-bills-total.component.jsx @@ -1,293 +1,293 @@ -import { Card, Col, Row, Space, Statistic, Tooltip, Typography } from "antd"; +import {Card, Col, Row, Space, Statistic, Tooltip, Typography} from "antd"; import Dinero from "dinero.js"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import AlertComponent from "../alert/alert.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import "./job-bills-total.styles.scss"; export default function JobBillsTotalComponent({ - loading, - bills, - partsOrders, - jobTotals, -}) { - const { t } = useTranslation(); + loading, + bills, + partsOrders, + jobTotals, + }) { + const {t} = useTranslation(); - if (loading) return ; - if (!!!jobTotals) - return ( - + if (loading) return ; + if (!!!jobTotals) + return ( + + ); + + const totals = jobTotals; + + let billTotals = Dinero(); + let billCms = Dinero(); + let lbrAdjustments = Dinero(); + let totalReturns = Dinero(); + let totalReturnsMarkedNotReceived = Dinero(); + let totalReturnsMarkedReceived = Dinero(); + + partsOrders.forEach((p) => + p.parts_order_lines.forEach((pol) => { + if (p.return) { + totalReturns = totalReturns.add( + Dinero({ + amount: Math.round((pol.act_price || 0) * 100), + }).multiply(pol.quantity) + ); + + if (pol.cm_received === null) { + // Skip this calculation for bills posted prior to the CNR change. + } else { + if (pol.cm_received === false) { + totalReturnsMarkedNotReceived = totalReturnsMarkedNotReceived.add( + Dinero({ + amount: Math.round((pol.act_price || 0) * 100), + }).multiply(pol.quantity) + ); + } else { + totalReturnsMarkedReceived = totalReturnsMarkedReceived.add( + Dinero({ + amount: Math.round((pol.act_price || 0) * 100), + }).multiply(pol.quantity) + ); + } + } + } + }) ); - const totals = jobTotals; + bills.forEach((i) => + i.billlines.forEach((il) => { + if (!i.is_credit_memo) { + billTotals = billTotals.add( + Dinero({ + amount: Math.round((il.actual_price || 0) * 100), + }).multiply(il.quantity) + ); + } else { + billCms = billCms.add( + Dinero({ + amount: Math.round((il.actual_price || 0) * 100), + }).multiply(il.quantity) + ); + } + if (il.deductedfromlbr) { + lbrAdjustments = lbrAdjustments.add( + Dinero({ + amount: Math.round((il.actual_price || 0) * 100), + }).multiply(il.quantity) + ); + } + }) + ); - let billTotals = Dinero(); - let billCms = Dinero(); - let lbrAdjustments = Dinero(); - let totalReturns = Dinero(); - let totalReturnsMarkedNotReceived = Dinero(); - let totalReturnsMarkedReceived = Dinero(); + const totalPartsSublet = Dinero(totals.parts.parts.total) + .add(Dinero(totals.parts.sublets.total)) + .add(Dinero(totals.additional.shipping)) + .add(Dinero(totals.additional.towing)) + .add(Dinero(totals.additional.additionalCosts)); - partsOrders.forEach((p) => - p.parts_order_lines.forEach((pol) => { - if (p.return) { - totalReturns = totalReturns.add( - Dinero({ - amount: Math.round((pol.act_price || 0) * 100), - }).multiply(pol.quantity) - ); + const discrepancy = totalPartsSublet.subtract(billTotals); - if (pol.cm_received === null) { - return; // Skip this calculation for bills posted prior to the CNR change. - } else { - if (pol.cm_received === false) { - totalReturnsMarkedNotReceived = totalReturnsMarkedNotReceived.add( - Dinero({ - amount: Math.round((pol.act_price || 0) * 100), - }).multiply(pol.quantity) - ); - } else { - totalReturnsMarkedReceived = totalReturnsMarkedReceived.add( - Dinero({ - amount: Math.round((pol.act_price || 0) * 100), - }).multiply(pol.quantity) - ); - } - } - } - }) - ); + const discrepWithLbrAdj = discrepancy.add(lbrAdjustments); - bills.forEach((i) => - i.billlines.forEach((il) => { - if (!i.is_credit_memo) { - billTotals = billTotals.add( - Dinero({ - amount: Math.round((il.actual_price || 0) * 100), - }).multiply(il.quantity) - ); - } else { - billCms = billCms.add( - Dinero({ - amount: Math.round((il.actual_price || 0) * 100), - }).multiply(il.quantity) - ); - } - if (il.deductedfromlbr) { - lbrAdjustments = lbrAdjustments.add( - Dinero({ - amount: Math.round((il.actual_price || 0) * 100), - }).multiply(il.quantity) - ); - } - }) - ); + const discrepWithCms = discrepWithLbrAdj.add(totalReturns); + const calculatedCreditsNotReceived = totalReturns.subtract(billCms); //billCms is tracked as a negative number. - const totalPartsSublet = Dinero(totals.parts.parts.total) - .add(Dinero(totals.parts.sublets.total)) - .add(Dinero(totals.additional.shipping)) - .add(Dinero(totals.additional.towing)) - .add(Dinero(totals.additional.additionalCosts)); - - const discrepancy = totalPartsSublet.subtract(billTotals); - - const discrepWithLbrAdj = discrepancy.add(lbrAdjustments); - - const discrepWithCms = discrepWithLbrAdj.add(totalReturns); - const calculatedCreditsNotReceived = totalReturns.subtract(billCms); //billCms is tracked as a negative number. - - return ( - - - - - - } - > - - - - - - } - > - - - = - - } - > - - - + - - } - > - - - = - - } - > - - - + - - } - > - - - = - - } - > - - - - - - - - - - } - > - - - - } - > - = 0 - ? calculatedCreditsNotReceived.toFormat() - : Dinero().toFormat() - } - /> - - - } - > - = 0 - ? totalReturnsMarkedNotReceived.toFormat() - : Dinero().toFormat() - } - /> - - - - - - ); + return ( + + + + + + } + > + + + - + + } + > + + + = + + } + > + + + + + + } + > + + + = + + } + > + + + + + + } + > + + + = + + } + > + + + + + + + + + + } + > + + + + } + > + = 0 + ? calculatedCreditsNotReceived.toFormat() + : Dinero().toFormat() + } + /> + + + } + > + = 0 + ? totalReturnsMarkedNotReceived.toFormat() + : Dinero().toFormat() + } + /> + + + + + + ); } diff --git a/client/src/components/job-calculate-totals/job-calculate-totals.component.jsx b/client/src/components/job-calculate-totals/job-calculate-totals.component.jsx index 0cf4bc1b2..3ea7386de 100644 --- a/client/src/components/job-calculate-totals/job-calculate-totals.component.jsx +++ b/client/src/components/job-calculate-totals/job-calculate-totals.component.jsx @@ -1,59 +1,60 @@ -import { Button, notification } from "antd"; +import {Button, notification} from "antd"; import Axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -export default function JobCalculateTotals({ job, disabled, refetch }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; - const handleCalculate = async () => { - try { - setLoading(true); +export default function JobCalculateTotals({job, disabled, refetch}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); - await Axios.post("/job/totalsssu", { - id: job.id, - }); + const handleCalculate = async () => { + try { + setLoading(true); - if (refetch) refetch(); - // const result = await updateJob({ - // refetchQueries: ["GET_JOB_BY_PK"], - // awaitRefetchQueries: true, - // variables: { - // jobId: job.id, - // job: { - // job_totals: newTotals, - // clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), - // owner_owing: Dinero(newTotals.totals.custPayable.total).toFormat( - // "0.00" - // ), - // }, - // }, - // }); - // if (!!!result.errors) { - // notification["success"]({ message: t("jobs.successes.updated") }); - // } else { - // notification["error"]({ - // message: t("jobs.errors.updating", { - // error: JSON.stringify(result.errors), - // }), - // }); - // } - } catch (error) { - notification["error"]({ - message: t("jobs.errors.updating", { - error: JSON.stringify(error), - }), - }); - } finally { - setLoading(false); - } - }; + await Axios.post("/job/totalsssu", { + id: job.id, + }); - return ( -
- -
- ); + if (refetch) refetch(); + // const result = await updateJob({ + // refetchQueries: ["GET_JOB_BY_PK"], + // awaitRefetchQueries: true, + // variables: { + // jobId: job.id, + // job: { + // job_totals: newTotals, + // clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), + // owner_owing: Dinero(newTotals.totals.custPayable.total).toFormat( + // "0.00" + // ), + // }, + // }, + // }); + // if (!!!result.errors) { + // notification["success"]({ message: t("jobs.successes.updated") }); + // } else { + // notification["error"]({ + // message: t("jobs.errors.updating", { + // error: JSON.stringify(result.errors), + // }), + // }); + // } + } catch (error) { + notification["error"]({ + message: t("jobs.errors.updating", { + error: JSON.stringify(error), + }), + }); + } finally { + setLoading(false); + } + }; + + return ( +
+ +
+ ); } diff --git a/client/src/components/job-checklist/components/job-checklist-form/job-checklist-form.component.jsx b/client/src/components/job-checklist/components/job-checklist-form/job-checklist-form.component.jsx index a809100a6..66f29872e 100644 --- a/client/src/components/job-checklist/components/job-checklist-form/job-checklist-form.component.jsx +++ b/client/src/components/job-checklist/components/job-checklist-form/job-checklist-form.component.jsx @@ -1,337 +1,331 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Form, Input, notification, Switch } from "antd"; -import moment from "moment-business-days"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Form, Input, notification, Switch} from "antd"; +import dayjs from "../../../../utils/day"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation, useParams } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../../../firebase/firebase.utils"; -import { - MARK_APPOINTMENT_ARRIVED, - MARK_LATEST_APPOINTMENT_ARRIVED, -} from "../../../../graphql/appointments.queries"; -import { UPDATE_JOB } from "../../../../graphql/jobs.queries"; -import { UPDATE_OWNER } from "../../../../graphql/owners.queries"; -import { insertAuditTrail } from "../../../../redux/application/application.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate, useParams} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../../../firebase/firebase.utils"; +import {MARK_APPOINTMENT_ARRIVED, MARK_LATEST_APPOINTMENT_ARRIVED,} from "../../../../graphql/appointments.queries"; +import {UPDATE_JOB} from "../../../../graphql/jobs.queries"; +import {UPDATE_OWNER} from "../../../../graphql/owners.queries"; +import {insertAuditTrail} from "../../../../redux/application/application.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../../../redux/user/user.selectors"; import AuditTrailMapping from "../../../../utils/AuditTrailMappings"; import ConfigFormComponents from "../../../config-form-components/config-form-components.component"; import DateTimePicker from "../../../form-date-time-picker/form-date-time-picker.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function JobChecklistForm({ - insertAuditTrail, - formItems, - bodyshop, - currentUser, - type, - job, - readOnly = false, -}) { - const { t } = useTranslation(); - const [intakeJob] = useMutation(UPDATE_JOB); - const [loading, setLoading] = useState(false); - const [markAptArrived] = useMutation(MARK_APPOINTMENT_ARRIVED); - const [markLatestAptArrived] = useMutation(MARK_LATEST_APPOINTMENT_ARRIVED); - const [updateOwner] = useMutation(UPDATE_OWNER); + insertAuditTrail, + formItems, + bodyshop, + currentUser, + type, + job, + readOnly = false, + }) { + const {t} = useTranslation(); + const [intakeJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); + const [markAptArrived] = useMutation(MARK_APPOINTMENT_ARRIVED); + const [markLatestAptArrived] = useMutation(MARK_LATEST_APPOINTMENT_ARRIVED); + const [updateOwner] = useMutation(UPDATE_OWNER); - const { jobId } = useParams(); - const history = useHistory(); - const search = queryString.parse(useLocation().search); - const [form] = Form.useForm(); + const {jobId} = useParams(); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const [form] = Form.useForm(); - const handleFinish = async (values) => { - setLoading(true); - logImEXEvent("job_complete_intake"); + const handleFinish = async (values) => { + setLoading(true); + logImEXEvent("job_complete_intake"); - const result = await intakeJob({ - variables: { - jobId: jobId, - job: { - ...(type === "intake" && { inproduction: values.addToProduction }), - status: - (type === "intake" && bodyshop.md_ro_statuses.default_arrived) || - (type === "deliver" && bodyshop.md_ro_statuses.default_delivered), - ...(type === "intake" && { actual_in: new Date() }), - ...(type === "intake" && { - production_vars: { - ...(job ? job.production_vars : {}), + const result = await intakeJob({ + variables: { + jobId: jobId, + job: { + ...(type === "intake" && {inproduction: values.addToProduction}), + status: + (type === "intake" && bodyshop.md_ro_statuses.default_arrived) || + (type === "deliver" && bodyshop.md_ro_statuses.default_delivered), + ...(type === "intake" && {actual_in: new Date()}), + ...(type === "intake" && { + production_vars: { + ...(job ? job.production_vars : {}), - note: - values.production_vars && - values.production_vars.note && - values.production_vars.note !== "" - ? values && - values.production_vars && - values.production_vars.note - : job && job.production_vars && job.production_vars.note, + note: + values.production_vars && + values.production_vars.note && + values.production_vars.note !== "" + ? values && + values.production_vars && + values.production_vars.note + : job && job.production_vars && job.production_vars.note, + }, + }), + ...(type === "intake" && { + scheduled_completion: values.scheduled_completion, + }), + ...(type === "intake" && + bodyshop.intakechecklist && + bodyshop.intakechecklist.next_contact_hours && + bodyshop.intakechecklist.next_contact_hours > 0 && { + date_next_contact: dayjs().add( + bodyshop.intakechecklist.next_contact_hours, + "hour" + ), + }), + ...(type === "deliver" && { + actual_completion: values.actual_completion, + }), + + [(type === "intake" && "intakechecklist") || + (type === "deliver" && "deliverchecklist")]: { + ...values, + form: formItems.map((fi) => { + return { + ...fi, + value: values[fi.name], + }; + }), + completed_by: currentUser.email, + completed_at: new Date(), + }, + + ...(type === "intake" && + values.scheduled_delivery && { + scheduled_delivery: values.scheduled_delivery, + }), + ...(type === "deliver" && { + scheduled_delivery: values.scheduled_delivery, + actual_delivery: values.actual_delivery, + }), + ...(type === "deliver" && + values.removeFromProduction && { + inproduction: false, + }), + }, }, - }), - ...(type === "intake" && { - scheduled_completion: values.scheduled_completion, - }), - ...(type === "intake" && - bodyshop.intakechecklist && - bodyshop.intakechecklist.next_contact_hours && - bodyshop.intakechecklist.next_contact_hours > 0 && { - date_next_contact: moment().add( - bodyshop.intakechecklist.next_contact_hours, - "hours" - ), - }), - ...(type === "deliver" && { - actual_completion: values.actual_completion, - }), - - [(type === "intake" && "intakechecklist") || - (type === "deliver" && "deliverchecklist")]: { - ...values, - form: formItems.map((fi) => { - return { - ...fi, - value: values[fi.name], - }; - }), - completed_by: currentUser.email, - completed_at: new Date(), - }, - - ...(type === "intake" && - values.scheduled_delivery && { - scheduled_delivery: values.scheduled_delivery, - }), - ...(type === "deliver" && { - scheduled_delivery: values.scheduled_delivery, - actual_delivery: values.actual_delivery, - }), - ...(type === "deliver" && - values.removeFromProduction && { - inproduction: false, - }), - }, - }, - }); - if (!!search.appointmentId) { - const appUpdate = await markAptArrived({ - variables: { appointmentId: search.appointmentId }, - }); - - if (!!appUpdate.errors) { - notification["error"]({ - message: t("checklist.errors.complete", { - error: JSON.stringify(result.errors), - }), }); - } - } else if (type === "intake" && !search.appointmentId) { - const appUpdate = await markLatestAptArrived({ - variables: { jobId: jobId }, - }); + if (!!search.appointmentId) { + const appUpdate = await markAptArrived({ + variables: {appointmentId: search.appointmentId}, + }); - if (!!appUpdate.errors) { - notification["error"]({ - message: t("checklist.errors.complete", { - error: JSON.stringify(result.errors), - }), - }); - } - } + if (!!appUpdate.errors) { + notification["error"]({ + message: t("checklist.errors.complete", { + error: JSON.stringify(result.errors), + }), + }); + } + } else if (type === "intake" && !search.appointmentId) { + const appUpdate = await markLatestAptArrived({ + variables: {jobId: jobId}, + }); - if (type === "intake" && job.owner && job.owner.id) { - //Updae Owner Allow to Text - const updateOwnerResult = await updateOwner({ - variables: { - ownerId: job.owner.id, - owner: { allow_text_message: values.allow_text_message }, - }, - }); + if (!!appUpdate.errors) { + notification["error"]({ + message: t("checklist.errors.complete", { + error: JSON.stringify(result.errors), + }), + }); + } + } - if (!!updateOwnerResult.errors) { - notification["error"]({ - message: t("checklist.errors.complete", { - error: JSON.stringify(result.errors), - }), - }); - } - } - - setLoading(false); - - if (!!!result.errors) { - notification["success"]({ message: t("checklist.successes.completed") }); - history.push(`/manage/jobs/${jobId}`); - - insertAuditTrail({ - jobid: jobId, - operation: AuditTrailMapping.jobchecklist( - type, - (type === "deliver" && values.removeFromProduction && false) || - (type === "intake" && values.addToProduction), - (type === "intake" && bodyshop.md_ro_statuses.default_arrived) || - (type === "deliver" && bodyshop.md_ro_statuses.default_delivered) - ), - }); - } else { - notification["error"]({ - message: t("checklist.errors.complete", { - error: JSON.stringify(result.errors), - }), - }); - } - }; - - return ( - form.submit()} - > - {t("general.actions.submit")} - - ) - } - > -
fi.value) - .reduce((acc, fi) => { - acc[fi.name] = fi.value; - return acc; - }, {}), - }} - > - - - {type === "intake" && ( -
- - - - - - - form.submit()} + > + {t("general.actions.submit")} + + ) + } + > + fi.value) + .reduce((acc, fi) => { + acc[fi.name] = fi.value; + return acc; + }, {}), + }} > - - - - - - - - -
- )} - {type === "deliver" && ( -
- - - - - - - - - -
- )} - -
- ); + + + {type === "intake" && ( +
+ + + + + + + + + + + + + + + +
+ )} + {type === "deliver" && ( +
+ + + + + + + + + +
+ )} + + + ); } export default connect(mapStateToProps, mapDispatchToProps)(JobChecklistForm); diff --git a/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx b/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx index c20080704..d140c86b2 100644 --- a/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx +++ b/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx @@ -1,81 +1,79 @@ -import { PrinterFilled } from "@ant-design/icons"; -import { Button, Card, List } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { useParams } from "react-router-dom"; -import { logImEXEvent } from "../../../../firebase/firebase.utils"; -import { - GenerateDocument, - GenerateDocuments, -} from "../../../../utils/RenderTemplate"; -import { TemplateList } from "../../../../utils/TemplateConstants"; +import {PrinterFilled} from "@ant-design/icons"; +import {Button, Card, List} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {useParams} from "react-router-dom"; +import {logImEXEvent} from "../../../../firebase/firebase.utils"; +import {GenerateDocument, GenerateDocuments,} from "../../../../utils/RenderTemplate"; +import {TemplateList} from "../../../../utils/TemplateConstants"; + const TemplateListGenerated = TemplateList(); -export default function JobIntakeTemplateList({ templates }) { - const { jobId } = useParams(); - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); +export default function JobIntakeTemplateList({templates}) { + const {jobId} = useParams(); + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); - const renderTemplate = async (templateKey) => { - setLoading(true); - logImEXEvent("job_checklist_template_render"); + const renderTemplate = async (templateKey) => { + setLoading(true); + logImEXEvent("job_checklist_template_render"); - await GenerateDocument( - { - name: templateKey, - variables: { id: jobId }, - }, - {}, - "p" - ); - setLoading(false); - }; + await GenerateDocument( + { + name: templateKey, + variables: {id: jobId}, + }, + {}, + "p" + ); + setLoading(false); + }; - const renderAllTemplates = async () => { - logImEXEvent("checklist_render_all_templates"); - setLoading(true); + const renderAllTemplates = async () => { + logImEXEvent("checklist_render_all_templates"); + setLoading(true); - await GenerateDocuments( - templates.map((key) => { - return { name: key, variables: { id: jobId } }; - }) - ); - setLoading(false); - }; + await GenerateDocuments( + templates.map((key) => { + return {name: key, variables: {id: jobId}}; + }) + ); + setLoading(false); + }; - return ( - - {t("checklist.actions.printall")} - - } - > - ( - renderTemplate(template)} - > - - , - ]} - > - + {t("checklist.actions.printall")} + + } + > + ( + renderTemplate(template)} + > + + , + ]} + > + + + )} /> - - )} - /> - - ); + + ); } diff --git a/client/src/components/job-checklist/job-checklist-display.component.jsx b/client/src/components/job-checklist/job-checklist-display.component.jsx index e664c2bab..83b087b7e 100644 --- a/client/src/components/job-checklist/job-checklist-display.component.jsx +++ b/client/src/components/job-checklist/job-checklist-display.component.jsx @@ -1,11 +1,11 @@ import React from "react"; import ConfigFormComponents from "../config-form-components/config-form-components.component"; -export default function JobChecklistDisplay({ checklist }) { - if (!checklist) return
; - return ( -
- -
- ); +export default function JobChecklistDisplay({checklist}) { + if (!checklist) return
; + return ( +
+ +
+ ); } diff --git a/client/src/components/job-checklist/job-checklist.component.jsx b/client/src/components/job-checklist/job-checklist.component.jsx index fda70881e..c2357bf54 100644 --- a/client/src/components/job-checklist/job-checklist.component.jsx +++ b/client/src/components/job-checklist/job-checklist.component.jsx @@ -1,18 +1,19 @@ import React from "react"; import JobChecklistTemplateList from "./components/job-checklist-template-list/job-checklist-template-list.component"; import JobChecklistForm from "./components/job-checklist-form/job-checklist-form.component"; -import { Row, Col } from "antd"; -export default function JobIntakeComponent({ checklistConfig, type, job }) { - const { form, templates } = checklistConfig; +import {Col, Row} from "antd"; - return ( - -
- - - - - - - ); +export default function JobIntakeComponent({checklistConfig, type, job}) { + const {form, templates} = checklistConfig; + + return ( + + + + + + + + + ); } diff --git a/client/src/components/job-costing-modal/job-costing-modal.component.jsx b/client/src/components/job-costing-modal/job-costing-modal.component.jsx index 499f0d253..9d7ace44f 100644 --- a/client/src/components/job-costing-modal/job-costing-modal.component.jsx +++ b/client/src/components/job-costing-modal/job-costing-modal.component.jsx @@ -1,32 +1,32 @@ -import { Typography } from "antd"; +import {Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import JobCostingPartsTable from "../job-costing-parts-table/job-costing-parts-table.component"; import JobCostingStatistics from "../job-costing-statistics/job-costing-statistics.component"; import JobCostingPie from "./job-costing-modal.pie.component"; export default function JobCostingModalComponent({ - summaryData, - costCenterData, -}) { - const { t } = useTranslation(); + summaryData, + costCenterData, + }) { + const {t} = useTranslation(); - return ( -
- - -
-
- - {t("jobs.labels.sales")} - - + return ( +
+ + +
+
+ + {t("jobs.labels.sales")} + + +
+
+ {t("jobs.labels.cost")} + +
+
-
- {t("jobs.labels.cost")} - -
-
-
- ); + ); } diff --git a/client/src/components/job-costing-modal/job-costing-modal.container.jsx b/client/src/components/job-costing-modal/job-costing-modal.container.jsx index fd15d6345..a1d8f764d 100644 --- a/client/src/components/job-costing-modal/job-costing-modal.container.jsx +++ b/client/src/components/job-costing-modal/job-costing-modal.container.jsx @@ -1,71 +1,72 @@ -import { Modal } from "antd"; +import {Modal} from "antd"; import axios from "axios"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectJobCosting } from "../../redux/modals/modals.selectors"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectJobCosting} from "../../redux/modals/modals.selectors"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobCostingModalComponent from "./job-costing-modal.component"; const mapStateToProps = createStructuredSelector({ - jobCostingModal: selectJobCosting, + jobCostingModal: selectJobCosting, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("jobCosting")), + toggleModalVisible: () => dispatch(toggleModalVisible("jobCosting")), }); export function JobCostingModalContainer({ - jobCostingModal, - toggleModalVisible, -}) { - const { t } = useTranslation(); - const [costingData, setCostingData] = useState(null); - const { visible, context } = jobCostingModal; - const { jobId } = context; + jobCostingModal, + toggleModalVisible, + }) { + const {t} = useTranslation(); + const [costingData, setCostingData] = useState(null); + const {open, context} = jobCostingModal; + const {jobId} = context; - useEffect(() => { - async function getData() { - if (jobId && visible) { - const { data } = await axios.post("/job/costing", { jobid: jobId }); + useEffect(() => { + async function getData() { + if (jobId && open) { + const {data} = await axios.post("/job/costing", {jobid: jobId}); - setCostingData(data); - } - } - getData(); - }, [jobId, visible]); + setCostingData(data); + } + } - return ( - { - toggleModalVisible(); - setCostingData(null); - }} - onCancel={() => { - toggleModalVisible(); - setCostingData(null); - }} - cancelButtonProps={{ style: { display: "none" } }} - width="90%" - destroyOnClose - > - {!costingData ? ( - - ) : ( - - )} - - ); + getData(); + }, [jobId, open]); + + return ( + { + toggleModalVisible(); + setCostingData(null); + }} + onCancel={() => { + toggleModalVisible(); + setCostingData(null); + }} + cancelButtonProps={{style: {display: "none"}}} + width="90%" + destroyOnClose + > + {!costingData ? ( + + ) : ( + + )} + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobCostingModalContainer); diff --git a/client/src/components/job-costing-modal/job-costing-modal.pie.component.jsx b/client/src/components/job-costing-modal/job-costing-modal.pie.component.jsx index 8b483d113..9e7f17344 100644 --- a/client/src/components/job-costing-modal/job-costing-modal.pie.component.jsx +++ b/client/src/components/job-costing-modal/job-costing-modal.pie.component.jsx @@ -1,67 +1,68 @@ -import React, { useCallback, useMemo } from "react"; -import { Cell, Pie, PieChart, ResponsiveContainer } from "recharts"; +import React, {useCallback, useMemo} from "react"; +import {Cell, Pie, PieChart, ResponsiveContainer} from "recharts"; import Dinero from "dinero.js"; + export default function JobCostingPieComponent({ - type = "sales", - costCenterData, -}) { - const Calculatedata = useCallback( - (data) => { - if (data && data.length > 0) { - return data.reduce((acc, i) => { - const value = - type === "sales" - ? Dinero(i.sales_dinero).getAmount() - : Dinero(i.costs_dinero).getAmount(); + type = "sales", + costCenterData, + }) { + const Calculatedata = useCallback( + (data) => { + if (data && data.length > 0) { + return data.reduce((acc, i) => { + const value = + type === "sales" + ? Dinero(i.sales_dinero).getAmount() + : Dinero(i.costs_dinero).getAmount(); - if (value > 0) { - acc.push({ - name: i.cost_center, - color: "#" + Math.floor(Math.random() * 16777215).toString(16), + if (value > 0) { + acc.push({ + name: i.cost_center, + color: "#" + Math.floor(Math.random() * 16777215).toString(16), - label: `${i.cost_center} - ${ - type === "sales" - ? Dinero(i.sales_dinero).toFormat() - : Dinero(i.costs_dinero).toFormat() - }`, - value: - type === "sales" - ? Dinero(i.sales_dinero).getAmount() - : Dinero(i.costs_dinero).getAmount(), - }); - } - return acc; - }, []); - } else { - return []; - } - }, - [type] - ); + label: `${i.cost_center} - ${ + type === "sales" + ? Dinero(i.sales_dinero).toFormat() + : Dinero(i.costs_dinero).toFormat() + }`, + value: + type === "sales" + ? Dinero(i.sales_dinero).getAmount() + : Dinero(i.costs_dinero).getAmount(), + }); + } + return acc; + }, []); + } else { + return []; + } + }, + [type] + ); - const memoizedData = useMemo(() => Calculatedata(costCenterData), [ - costCenterData, - Calculatedata, - ]); + const memoizedData = useMemo(() => Calculatedata(costCenterData), [ + costCenterData, + Calculatedata, + ]); - return ( - - - entry.label} - labelLine - > - {memoizedData.map((entry, index) => ( - - ))} - - - - ); + return ( + + + entry.label} + labelLine + > + {memoizedData.map((entry, index) => ( + + ))} + + + + ); } diff --git a/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx index d62f08650..3194a8206 100644 --- a/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx +++ b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx @@ -1,128 +1,129 @@ -import { Input, Space, Table, Typography } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../utils/sorters"; +import {Input, Space, Table, Typography} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../utils/sorters"; import Dinero from "dinero.js"; import {pageLimit} from "../../utils/config"; -export default function JobCostingPartsTable({ data, summaryData }) { - const [searchText, setSearchText] = useState(""); - const [state, setState] = useState({ - sortedInfo: {}, - }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; +export default function JobCostingPartsTable({data, summaryData}) { + const [searchText, setSearchText] = useState(""); + const [state, setState] = useState({ + sortedInfo: {}, + }); - const { t } = useTranslation(); + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("bodyshop.fields.responsibilitycenter"), - dataIndex: "cost_center", - key: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, - }, - { - title: t("jobs.labels.sales"), - dataIndex: "sales", - key: "sales", - sorter: (a, b) => - parseFloat(a.sales.substring(1)) - parseFloat(b.sales.substring(1)), - sortOrder: - state.sortedInfo.columnKey === "sales" && state.sortedInfo.order, - }, + const {t} = useTranslation(); - { - title: t("jobs.labels.costs"), - dataIndex: "costs", - key: "costs", - sorter: (a, b) => - parseFloat(a.costs.substring(1)) - parseFloat(b.costs.substring(1)), - sortOrder: - state.sortedInfo.columnKey === "costs" && state.sortedInfo.order, - }, + const columns = [ + { + title: t("bodyshop.fields.responsibilitycenter"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.sales"), + dataIndex: "sales", + key: "sales", + sorter: (a, b) => + parseFloat(a.sales.substring(1)) - parseFloat(b.sales.substring(1)), + sortOrder: + state.sortedInfo.columnKey === "sales" && state.sortedInfo.order, + }, - { - title: t("jobs.labels.gpdollars"), - dataIndex: "gpdollars", - key: "gpdollars", - sorter: (a, b) => - parseFloat(a.gpdollars.substring(1)) - - parseFloat(b.gpdollars.substring(1)), + { + title: t("jobs.labels.costs"), + dataIndex: "costs", + key: "costs", + sorter: (a, b) => + parseFloat(a.costs.substring(1)) - parseFloat(b.costs.substring(1)), + sortOrder: + state.sortedInfo.columnKey === "costs" && state.sortedInfo.order, + }, - sortOrder: - state.sortedInfo.columnKey === "gpdollars" && state.sortedInfo.order, - }, - { - title: t("jobs.labels.gppercent"), - dataIndex: "gppercent", - key: "gppercent", - sorter: (a, b) => - parseFloat(a.gppercent.slice(0, -1) || 0) - - parseFloat(b.gppercent.slice(0, -1) || 0), - sortOrder: - state.sortedInfo.columnKey === "gppercent" && state.sortedInfo.order, - }, - ]; + { + title: t("jobs.labels.gpdollars"), + dataIndex: "gpdollars", + key: "gpdollars", + sorter: (a, b) => + parseFloat(a.gpdollars.substring(1)) - + parseFloat(b.gpdollars.substring(1)), - const filteredData = - searchText === "" - ? data - : data.filter((d) => - (d.cost_center || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) - ); + sortOrder: + state.sortedInfo.columnKey === "gpdollars" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.gppercent"), + dataIndex: "gppercent", + key: "gppercent", + sorter: (a, b) => + parseFloat(a.gppercent.slice(0, -1) || 0) - + parseFloat(b.gppercent.slice(0, -1) || 0), + sortOrder: + state.sortedInfo.columnKey === "gppercent" && state.sortedInfo.order, + }, + ]; - return ( -
-
{ - return ( - - { - e.preventDefault(); - setSearchText(e.target.value); + const filteredData = + searchText === "" + ? data + : data.filter((d) => + (d.cost_center || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) + ); + + return ( +
+
{ + return ( + + { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> + + ); }} - /> - - ); - }} - scroll={{ - x: "50%", //y: "40rem" - }} - onChange={handleTableChange} - pagination={{ position: "top", defaultPageSize: pageLimit }} - columns={columns} - rowKey="id" - dataSource={filteredData} - summary={() => ( - - - - {t("general.labels.totals")} - - - - {Dinero(summaryData.totalSales).toFormat()} - - - {Dinero(summaryData.totalCost).toFormat()} - - - {Dinero(summaryData.gpdollars).toFormat()} - - - - )} - /> - - ); + scroll={{ + x: "50%", //y: "40rem" + }} + onChange={handleTableChange} + pagination={{position: "top", defaultPageSize: pageLimit}} + columns={columns} + rowKey="id" + dataSource={filteredData} + summary={() => ( + + + + {t("general.labels.totals")} + + + + {Dinero(summaryData.totalSales).toFormat()} + + + {Dinero(summaryData.totalCost).toFormat()} + + + {Dinero(summaryData.gpdollars).toFormat()} + + + + )} + /> + + ); } diff --git a/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx b/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx index c92d3848c..fc06e40eb 100644 --- a/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx +++ b/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx @@ -1,62 +1,63 @@ -import { Statistic } from "antd"; +import {Statistic} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import Dinero from "dinero.js"; -export default function JobCostingStatistics({ summaryData }) { - const { t } = useTranslation(); - return ( -
-
- - - - - - - - - - - - -
-
- ); +export default function JobCostingStatistics({summaryData}) { + const {t} = useTranslation(); + + return ( +
+
+ + + + + + + + + + + + +
+
+ ); } diff --git a/client/src/components/job-create-iou/job-create-iou.component.jsx b/client/src/components/job-create-iou/job-create-iou.component.jsx index 8ebc8fb75..bc1b4bf2f 100644 --- a/client/src/components/job-create-iou/job-create-iou.component.jsx +++ b/client/src/components/job-create-iou/job-create-iou.component.jsx @@ -1,95 +1,95 @@ -import { useApolloClient } from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Button, notification, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory } from "react-router"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_LINES_IOU } from "../../graphql/jobs-lines.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { CreateIouForJob } from "../jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util"; +import {useApolloClient} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, notification, Popconfirm} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_LINES_IOU} from "../../graphql/jobs-lines.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {CreateIouForJob} from "../jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobCreateIOU); -export function JobCreateIOU({ bodyshop, currentUser, job, selectedJobLines }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const client = useApolloClient(); - const history = useHistory(); +export function JobCreateIOU({bodyshop, currentUser, job, selectedJobLines}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const client = useApolloClient(); + const history = useNavigate(); - const { IOU_Tracking } = useTreatments( - ["IOU_Tracking"], - {}, - bodyshop.imexshopid - ); - if (IOU_Tracking.treatment !== "on") return null; - const handleCreateIou = async () => { - setLoading(true); - //Query all of the job details to recreate. - const iouId = await CreateIouForJob( - client, - job.id, - { - status: bodyshop.md_ro_statuses.default_open, - bodyshopid: bodyshop.id, - useremail: currentUser.email, - }, - selectedJobLines - ); - notification.open({ - type: "success", - message: t("jobs.successes.ioucreated"), - onClick: () => history.push(`/manage/jobs/${iouId}`), + const {treatments: {IOU_Tracking}} = useSplitTreatments({ + attributes: {}, + names: ["IOU_Tracking"], + splitKey: bodyshop.imexshopid, }); - const selectedJobLinesIds = selectedJobLines.map((l) => l.id); - await client.mutate({ - mutation: UPDATE_JOB_LINES_IOU, - variables: { ids: selectedJobLinesIds }, - update(cache) { - cache.modify({ - id: cache.identify(job.id), - fields: { - joblines(existingJobLines, { readField }) { - return existingJobLines.map((a) => { - if (!selectedJobLinesIds.includes(a.id)) return a; - return { ...a, ioucreated: true }; - }); + + if (IOU_Tracking.treatment !== "on") return null; + + const handleCreateIou = async () => { + setLoading(true); + //Query all of the job details to recreate. + const iouId = await CreateIouForJob( + client, + job.id, + { + status: bodyshop.md_ro_statuses.default_open, + bodyshopid: bodyshop.id, + useremail: currentUser.email, + }, + selectedJobLines + ); + notification.open({ + type: "success", + message: t("jobs.successes.ioucreated"), + onClick: () => history(`/manage/jobs/${iouId}`), + }); + const selectedJobLinesIds = selectedJobLines.map((l) => l.id); + await client.mutate({ + mutation: UPDATE_JOB_LINES_IOU, + variables: {ids: selectedJobLinesIds}, + update(cache) { + cache.modify({ + id: cache.identify(job.id), + fields: { + joblines(existingJobLines, {readField}) { + return existingJobLines.map((a) => { + if (!selectedJobLinesIds.includes(a.id)) return a; + return {...a, ioucreated: true}; + }); + }, + }, + }); }, - }, }); - }, - }); - setLoading(false); - }; + setLoading(false); + }; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/job-damage-visual/job-damage-visual.component.jsx b/client/src/components/job-damage-visual/job-damage-visual.component.jsx index 510879caf..e6d2e3ce5 100644 --- a/client/src/components/job-damage-visual/job-damage-visual.component.jsx +++ b/client/src/components/job-damage-visual/job-damage-visual.component.jsx @@ -1,748 +1,748 @@ import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; -const Car = ({ dmg1, dmg2 }) => { - const { t } = useTranslation(); +const Car = ({dmg1, dmg2}) => { + const {t} = useTranslation(); - return ( -
- {t("jobs.labels.cards.damage")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // x - // - } - - -
- ); + return ( +
+ {t("jobs.labels.cards.damage")} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // x + // + } + + +
+ ); }; export default Car; diff --git a/client/src/components/job-detail-cards/job-detail-cards.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.component.jsx index 4ca84f56d..dc126089f 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.component.jsx @@ -1,15 +1,15 @@ -import { PrinterFilled } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Col, Divider, Drawer, Grid, Row, Space } from "antd"; +import {PrinterFilled} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Col, Divider, Drawer, Grid, Row, Space} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_JOB_CARD_DETAILS} from "../../graphql/jobs.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import JobSyncButton from "../job-sync-button/job-sync-button.component"; import JobsDetailHeader from "../jobs-detail-header/jobs-detail-header.component"; @@ -23,150 +23,151 @@ import JobDetailCardsPartsComponent from "./job-detail-cards.parts.component"; import JobDetailCardsTotalsComponent from "./job-detail-cards.totals.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setPrintCenterContext: (context) => - dispatch(setModalContext({ context: context, modal: "printCenter" })), + setPrintCenterContext: (context) => + dispatch(setModalContext({context: context, modal: "printCenter"})), }); const span = { - lg: { span: 24 }, - xl: { span: 12 }, - xxl: { span: 8 }, + lg: {span: 24}, + xl: {span: 12}, + xxl: {span: 8}, }; -export function JobDetailCards({ bodyshop, setPrintCenterContext }) { - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; +export function JobDetailCards({bodyshop, setPrintCenterContext}) { + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const bpoints = { - xs: "100%", - sm: "100%", - md: "100%", - lg: "75%", - xl: "75%", - xxl: "60%", - }; - const drawerPercentage = selectedBreakpoint - ? bpoints[selectedBreakpoint[0]] - : "100%"; + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "75%", + xl: "75%", + xxl: "60%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; - const searchParams = queryString.parse(useLocation().search); - const { selected } = searchParams; - const history = useHistory(); - const { loading, error, data, refetch } = useQuery(QUERY_JOB_CARD_DETAILS, { - variables: { id: selected }, - skip: !selected, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const { t } = useTranslation(); - const handleDrawerClose = () => { - delete searchParams.selected; - history.push({ - search: queryString.stringify({ - ...searchParams, - }), + const searchParams = queryString.parse(useLocation().search); + const {selected} = searchParams; + const history = useNavigate(); + const {loading, error, data, refetch} = useQuery(QUERY_JOB_CARD_DETAILS, { + variables: {id: selected}, + skip: !selected, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - }; - return ( - - {loading ? : null} - {error ? : null} - {data ? ( - - {data.jobs_by_pk.ro_number || t("general.labels.na")} - - } - extra={ - - + const {t} = useTranslation(); + const handleDrawerClose = () => { + delete searchParams.selected; + history({ + search: queryString.stringify({ + ...searchParams, + }), + }); + }; - - - - - - } + return ( + - - - - - - - - - - - - - - - - {!bodyshop.uselocalmediaserver && ( - - - - )} - - - - - - - - - ) : null} - - ); + {loading ? : null} + {error ? : null} + {data ? ( + + {data.jobs_by_pk.ro_number || t("general.labels.na")} + + } + extra={ + + + + + + + + + } + > + + + + + + + + + + + + + + + + {!bodyshop.uselocalmediaserver && ( + + + + )} + + + + + + + + + ) : null} + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobDetailCards); diff --git a/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx index b2cde2783..c1d399881 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx @@ -1,18 +1,18 @@ import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import CardTemplate from "./job-detail-cards.template.component"; import Car from "../job-damage-visual/job-damage-visual.component"; -export default function JobDetailCardsDamageComponent({ loading, data }) { - const { t } = useTranslation(); - const { area_of_damage } = data; - return ( - - {area_of_damage ? ( - - ) : ( - t("jobs.errors.nodamage") - )} - - ); +export default function JobDetailCardsDamageComponent({loading, data}) { + const {t} = useTranslation(); + const {area_of_damage} = data; + return ( + + {area_of_damage ? ( + + ) : ( + t("jobs.errors.nodamage") + )} + + ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx index 0dcc620ef..ebb1ae042 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx @@ -1,119 +1,188 @@ -import { Timeline } from "antd"; +import {Timeline} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import CardTemplate from "./job-detail-cards.template.component"; -export default function JobDetailCardsDatesComponent({ loading, data }) { - const { t } = useTranslation(); +export default function JobDetailCardsDatesComponent({loading, data}) { + const {t} = useTranslation(); - return ( - - {data ? ( - - {!( - data.actual_in || - data.scheduled_completion || - data.scheduled_in || - data.actual_completion || - data.scheduled_delivery || - data.actual_delivery || - data.date_estimated || - data.date_open || - data.date_scheduled || - data.date_invoiced || - data.date_exported - ) ? ( -
{t("jobs.errors.nodates")}
- ) : null} - {data.date_last_contacted ? ( - - - {data.date_last_contacted} - - ) : null} - {data.date_open ? ( - - - {data.date_open} - - ) : null} - - {data.date_estimated ? ( - - - {data.date_estimated} - - ) : null} - - {data.date_scheduled ? ( - - - {data.date_scheduled} - - ) : null} - - {data.scheduled_in ? ( - - - {data.scheduled_in} - - ) : null} - {data.actual_in ? ( - - - {data.actual_in} - - ) : null} - {data.date_repairstarted ? ( - - - {data.date_repairstarted} - - ) : null} - {data.scheduled_completion ? ( - - - {data.scheduled_completion} - - ) : null} - - {data.actual_completion ? ( - - - {data.actual_completion} - - ) : null} - - {data.scheduled_delivery ? ( - - - {data.scheduled_delivery} - - ) : null} - - {data.actual_delivery ? ( - - - {data.actual_delivery} - - ) : null} - - {data.date_invoiced ? ( - - - {data.date_invoiced} - - ) : null} - - {data.date_exported ? ( - - - {data.date_exported} - - ) : null} -
- ) : null} -
- ); + return ( + + {data ? ( + + + {data.date_last_contacted} + + ), + }, + ] + : []), + ...(data.date_open + ? [ + { + key: "date_open", + children: ( + <> + + {data.date_open} + + ), + }, + ] + : []), + ...(data.date_estimated + ? [ + { + key: "date_estimated", + children: ( + <> + + {data.date_estimated} + + ), + }, + ] + : []), + ...(data.date_scheduled + ? [ + { + key: "date_scheduled", + children: ( + <> + + {data.date_scheduled} + + ), + }, + ] + : []), + ...(data.scheduled_in + ? [ + { + key: "scheduled_in", + children: ( + <> + + {data.scheduled_in} + + ), + }, + ] + : []), + ...(data.actual_in + ? [ + { + key: "actual_in", + children: ( + <> + + {data.actual_in} + + ), + }, + ] + : []), + ...(data.date_repairstarted + ? [ + { + key: "date_repairstarted", + children: ( + <> + + {data.date_repairstarted} + + ), + }, + ] + : []), + ...(data.scheduled_completion + ? [ + { + key: "scheduled_completion", + children: ( + <> + + {data.scheduled_completion} + + ), + }, + ] + : []), + ...(data.actual_completion + ? [ + { + key: "actual_completion", + children: ( + <> + + {data.actual_completion} + + ), + }, + ] + : []), + ...(data.scheduled_delivery + ? [ + { + key: "scheduled_delivery", + children: ( + <> + + {data.scheduled_delivery} + + ), + }, + ] + : []), + ...(data.actual_delivery + ? [ + { + key: "actual_delivery", + children: ( + <> + + {data.actual_delivery} + + ), + }, + ] + : []), + ...(data.date_invoiced + ? [ + { + key: "date_invoiced", + children: ( + <> + + {data.date_invoiced} + + ), + }, + ] + : []), + ...(data.date_exported + ? [ + { + key: "date_exported", + children: ( + <> + + {data.date_exported} + + ), + }, + ] + : []), + ]} + />) : null} + + ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx index c4031b8b4..87999910d 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx @@ -1,33 +1,34 @@ -import { Carousel } from "antd"; +import {Carousel} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { GenerateThumbUrl } from "../jobs-documents-gallery/job-documents.utility"; +import {useTranslation} from "react-i18next"; +import {GenerateThumbUrl} from "../jobs-documents-gallery/job-documents.utility"; import CardTemplate from "./job-detail-cards.template.component"; -export default function JobDetailCardsDocumentsComponent({ loading, data }) { - const { t } = useTranslation(); - if (!data) +export default function JobDetailCardsDocumentsComponent({loading, data}) { + const {t} = useTranslation(); + + if (!data) + return ( + + null + + ); + return ( - - null - + + {data.documents.length > 0 ? ( + + {data.documents.map((item) => ( + {item.name}/ + ))} + + ) : ( +
{t("documents.errors.nodocuments")}
+ )} +
); - - return ( - - {data.documents.length > 0 ? ( - - {data.documents.map((item) => ( - {item.name} - ))} - - ) : ( -
{t("documents.errors.nodocuments")}
- )} -
- ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx index 281b9369a..fa598fa24 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx @@ -1,14 +1,15 @@ import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import DataLabel from "../data-label/data-label.component"; import CardTemplate from "./job-detail-cards.template.component"; -export default function JobDetailCardsInsuranceComponent({ loading, data }) { - const { t } = useTranslation(); - return ( - - {data ? ( - +export default function JobDetailCardsInsuranceComponent({loading, data}) { + const {t} = useTranslation(); + + return ( + + {data ? ( + {data.ins_co_nm} @@ -16,29 +17,29 @@ export default function JobDetailCardsInsuranceComponent({ loading, data }) { {data.clm_no} + label={t("jobs.labels.cards.filehandler")} + open={data.ins_ct_fn && data.ins_ct_ln}> {data.ins_ea ? ( - -
{`${data.ins_ct_fn || ""} ${data.ins_ct_ln || ""}`}
-
+ +
{`${data.ins_ct_fn || ""} ${data.ins_ct_ln || ""}`}
+
) : ( -
{`${data.ins_ct_fn || ""} ${data.ins_ct_ln || ""}`}
+
{`${data.ins_ct_fn || ""} ${data.ins_ct_ln || ""}`}
)}
+ label={t("jobs.labels.cards.estimator")} + open={data.est_ct_fn && data.est_ct_ln}> {data.ins_ea ? ( - -
{`${data.est_ct_fn || ""} ${data.est_ct_ln || ""}`}
-
+ +
{`${data.est_ct_fn || ""} ${data.est_ct_ln || ""}`}
+
) : ( -
{`${data.est_ct_fn || ""} ${data.est_ct_ln || ""}`}
+
{`${data.est_ct_fn || ""} ${data.est_ct_ln || ""}`}
)}
- ) : null} -
- ); + ) : null} +
+ ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx index 57fdec9ba..2f46f68c7 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx @@ -1,11 +1,7 @@ -import { List } from "antd"; -import { - WarningFilled, - EyeInvisibleFilled, - AuditOutlined, -} from "@ant-design/icons"; +import {List} from "antd"; +import {AuditOutlined, EyeInvisibleFilled, WarningFilled,} from "@ant-design/icons"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import CardTemplate from "./job-detail-cards.template.component"; import styled from "styled-components"; @@ -14,33 +10,33 @@ const Container = styled.div` overflow-y: auto; `; -export default function JobDetailCardsNotesComponent({ loading, data }) { - const { t } = useTranslation(); +export default function JobDetailCardsNotesComponent({loading, data}) { + const {t} = useTranslation(); - return ( - - {data ? ( - - ( - - {item.critical ? ( - - ) : null} - {item.private ? : null} - {item.audit ? : null} - {item.text} - - )} - /> - - ) : null} - - ); + return ( + + {data ? ( + + ( + + {item.critical ? ( + + ) : null} + {item.private ? : null} + {item.audit ? : null} + {item.text} + + )} + /> + + ) : null} + + ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx index dcb049f79..d1d0db6c1 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx @@ -1,120 +1,121 @@ -import { Table } from "antd"; +import {Table} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import JobLineNotePopup from "../job-line-note-popup/job-line-note-popup.component"; import PartsStatusPie from "../parts-status-pie/parts-status-pie.component"; import CardTemplate from "./job-detail-cards.template.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort } from "../../utils/sorters"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort} from "../../utils/sorters"; import JobLineLocationPopup from "../job-line-location-popup/job-line-location-popup.component"; import JobLineStatusPopup from "../job-line-status-popup/job-line-status-popup.component"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - jobRO: selectJobReadOnly, + //currentUser: selectCurrentUser + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobDetailCardsPartsComponent); -export function JobDetailCardsPartsComponent({ loading, data, jobRO }) { - const { t } = useTranslation(); - const { joblines_status } = data; +export function JobDetailCardsPartsComponent({loading, data, jobRO}) { + const {t} = useTranslation(); + const {joblines_status} = data; - const columns = [ - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - fixed: "left", - key: "line_desc", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - onCell: (record) => ({ - className: record.manual_line && "job-line-manual", - style: { - ...(record.critical ? { boxShadow: " -.5em 0 0 #FFC107" } : {}), + const columns = [ + { + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + fixed: "left", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + onCell: (record) => ({ + className: record.manual_line && "job-line-manual", + style: { + ...(record.critical ? {boxShadow: " -.5em 0 0 #FFC107"} : {}), + }, + }), + width: "30%", + ellipsis: true, }, - }), - width: "30%", - ellipsis: true, - }, - { - title: t("joblines.fields.part_type"), - dataIndex: "part_type", - key: "part_type", - width: "15%", - sorter: (a, b) => - alphaSort( - t(`joblines.fields.part_types.${a.part_type}`), - t(`joblines.fields.part_types.${b.part_type}`) - ), - render: (text, record) => - record.part_type - ? t(`joblines.fields.part_types.${record.part_type}`) - : null, - }, - { - title: t("joblines.fields.part_qty"), - dataIndex: "part_qty", - key: "part_qty", - width: "10%", - }, - { - title: t("joblines.fields.notes"), - dataIndex: "notes", - key: "notes", - render: (text, record) => ( - - ), - }, - { - title: t("joblines.fields.location"), - dataIndex: "location", - key: "location", - sorter: (a, b) => alphaSort(a.location, b.location), - render: (text, record) => ( - - ), - }, - { - title: t("joblines.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - filters: - (data && - data.joblines - ?.map((l) => l.status) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "No Status*", - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.status), - render: (text, record) => ( - - ), - }, - ]; - return ( -
- - -
- - - ); + { + title: t("joblines.fields.part_type"), + dataIndex: "part_type", + key: "part_type", + width: "15%", + sorter: (a, b) => + alphaSort( + t(`joblines.fields.part_types.${a.part_type}`), + t(`joblines.fields.part_types.${b.part_type}`) + ), + render: (text, record) => + record.part_type + ? t(`joblines.fields.part_types.${record.part_type}`) + : null, + }, + { + title: t("joblines.fields.part_qty"), + dataIndex: "part_qty", + key: "part_qty", + width: "10%", + }, + { + title: t("joblines.fields.notes"), + dataIndex: "notes", + key: "notes", + render: (text, record) => ( + + ), + }, + { + title: t("joblines.fields.location"), + dataIndex: "location", + key: "location", + sorter: (a, b) => alphaSort(a.location, b.location), + render: (text, record) => ( + + ), + }, + { + title: t("joblines.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + filters: + (data && + data.joblines + ?.map((l) => l.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), + render: (text, record) => ( + + ), + }, + ]; + return ( +
+ + +
+ + + ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx index 4aa6e0d6e..c233e5741 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx @@ -1,25 +1,47 @@ +import {Card} from "antd"; import React from "react"; -import { Card } from "antd"; -import { Link } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; -export default function JobDetailCardTemplate({ - loading, - title, - extraLink, - ...otherProps -}) { - let extra; - if (extraLink) extra = { extra: More }; - return ( - - {otherProps.children} - - ); +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobDetailCardTemplate); + +export function JobDetailCardTemplate({ + loading, + title, + extraLink, + technician, + ...otherProps + }) { + const {t} = useTranslation(); + + let extra; + if (extraLink && !technician) + extra = { + extra: {t("jobs.labels.cards.more")}, + }; + return ( + + {otherProps.children} + + ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx index 31236a9e4..e1fdff5f2 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx @@ -1,37 +1,37 @@ -import { Statistic } from "antd"; +import {Statistic} from "antd"; import Dinero from "dinero.js"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import CardTemplate from "./job-detail-cards.template.component"; -export default function JobDetailCardsTotalsComponent({ loading, data }) { - const { t } = useTranslation(); +export default function JobDetailCardsTotalsComponent({loading, data}) { + const {t} = useTranslation(); - return ( - - {data.job_totals ? ( -
- - - -
- ) : ( - t("jobs.errors.nofinancial") - )} -
- ); + return ( + + {data.job_totals ? ( +
+ + + +
+ ) : ( + t("jobs.errors.nofinancial") + )} +
+ ); } diff --git a/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx index 3a3f2388e..ae85eb127 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx @@ -1,23 +1,23 @@ import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import CardTemplate from "./job-detail-cards.template.component"; -export default function JobDetailCardsVehicleComponent({ loading, data }) { - const { t } = useTranslation(); +export default function JobDetailCardsVehicleComponent({loading, data}) { + const {t} = useTranslation(); - return ( - - {data ? ( - + return ( + + {data ? ( + {` ${data.vehicle?.v_model_yr || t("general.labels.na")} ${ - data.vehicle?.v_make_desc || t("general.labels.na") + data.vehicle?.v_make_desc || t("general.labels.na") } ${data.vehicle?.v_model_desc || t("general.labels.na")}`} - ) : null} - - ); + ) : null} + + ); } diff --git a/client/src/components/job-detail-lines/job-lines-expander.component.jsx b/client/src/components/job-detail-lines/job-lines-expander.component.jsx index b64924210..932f32232 100644 --- a/client/src/components/job-detail-lines/job-lines-expander.component.jsx +++ b/client/src/components/job-detail-lines/job-lines-expander.component.jsx @@ -1,136 +1,138 @@ -import { useQuery } from "@apollo/client"; -import { Col, Divider, Row, Skeleton, Space, Timeline, Typography } from "antd"; +import {useQuery} from "@apollo/client"; +import {Col, Divider, Row, Skeleton, Space, Timeline, Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { GET_JOB_LINE_ORDERS } from "../../graphql/jobs.queries"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; +import {GET_JOB_LINE_ORDERS} from "../../graphql/jobs.queries"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {DateFormatter} from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobLinesExpander); -export function JobLinesExpander({ jobline, jobid, bodyshop }) { - const { t } = useTranslation(); - const { loading, error, data } = useQuery(GET_JOB_LINE_ORDERS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - joblineid: jobline.id, - }, - }); +export function JobLinesExpander({jobline, jobid, bodyshop}) { + const {t} = useTranslation(); + const {loading, error, data} = useQuery(GET_JOB_LINE_ORDERS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + joblineid: jobline.id, + }, + }); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - return ( - - - - {t("parts_orders.labels.parts_orders")} - - - {data.parts_order_lines.length > 0 ? ( - data.parts_order_lines.map((line) => ( - - } wrap> - - {line.parts_order.order_number} - - {line.parts_order.order_date} - {line.parts_order.vendor.name} - - - )) - ) : ( - - {t("parts_orders.labels.notyetordered")} - - )} - - - - {t("bills.labels.bills")} - - {data.billlines.length > 0 ? ( - data.billlines.map((line) => ( - - - - - {line.bill.invoice_number} - - - - - {`${t("billlines.fields.actual_price")}: `} - {line.actual_price} - - - - - {`${t("billlines.fields.actual_cost")}: `} - {line.actual_cost} - - - - {line.bill.date} - - {line.bill.vendor.name} - - - )) - ) : ( - - {t("parts_orders.labels.notyetordered")} - - )} - - - - - {t("parts_dispatch.labels.parts_dispatch")} - - - {data.parts_dispatch_lines.length > 0 ? ( - data.parts_dispatch_lines.map((line) => ( - - } wrap> - - {line.parts_dispatch.number} - - { - bodyshop.employees.find( - (e) => e.id === line.parts_dispatch.employeeid - )?.first_name - } - - {t("parts_dispatch_lines.fields.accepted_at")} - {line.accepted_at} - - - - )) - ) : ( - - {t("parts_orders.labels.notyetordered")} - - )} - - - - ); + return ( + + + + {t("parts_orders.labels.parts_orders")} + + 0 + ? data.parts_order_lines.map((line) => ({ + key: line.id, + children: ( + } wrap> + + {line.parts_order.order_number} + + {line.parts_order.order_date} + {line.parts_order.vendor.name} + + ), + })) + : [ + { + key: "no-orders", + children: t("parts_orders.labels.notyetordered"), + }, + ] + } + /> + + {t("bills.labels.bills")} + 0 + ? data.billlines.map((line) => ({ + key: line.id, + children: ( + + + + {line.bill.invoice_number} + + + + {`${t("billlines.fields.actual_price")}: `}{line.actual_price} + + + {`${t("billlines.fields.actual_cost")}: `}{line.actual_cost} + + + {line.bill.date} + + {line.bill.vendor.name} + + ), + })) + : [ + { + key: "no-orders", + children: t("parts_orders.labels.notyetordered"), + }, + ] + } + /> + + + + {t("parts_dispatch.labels.parts_dispatch")} + + 0 ? ( + data.parts_dispatch_lines.map((line) => ({ + key: line.id, + children: ( + } wrap> + + {line.parts_dispatch.number} + + { + bodyshop.employees.find( + (e) => e.id === line.parts_dispatch.employeeid + )?.first_name + } + + {t("parts_dispatch_lines.fields.accepted_at")} + {line.accepted_at} + + + ) + })) + ) : ({ + key: 'dispatch-lines', + children: t("parts_orders.labels.notyetordered"), + }) + }/> + + + ); } diff --git a/client/src/components/job-detail-lines/job-lines-part-price-change.component.jsx b/client/src/components/job-detail-lines/job-lines-part-price-change.component.jsx index 77ca22075..f2616d792 100644 --- a/client/src/components/job-detail-lines/job-lines-part-price-change.component.jsx +++ b/client/src/components/job-detail-lines/job-lines-part-price-change.component.jsx @@ -1,97 +1,98 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification, Popover, Tooltip } from "antd"; -import { t } from "i18next"; -import React, { useState } from "react"; -import { UPDATE_LINE_PPC } from "../../graphql/jobs-lines.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Popover, Tooltip} from "antd"; +import {t} from "i18next"; +import React, {useState} from "react"; +import {UPDATE_LINE_PPC} from "../../graphql/jobs-lines.queries"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import CurrencyFormItemComponent from "../form-items-formatted/currency-form-item.component"; import JobLineConvertToLabor from "../job-line-convert-to-labor/job-line-convert-to-labor.component"; import axios from "axios"; -export default function JobLinesPartPriceChange({ job, line, refetch }) { - const [loading, setLoading] = useState(false); - const [updatePartPrice] = useMutation(UPDATE_LINE_PPC); - const handleFinish = async (values) => { - try { - setLoading(true); - const result = await updatePartPrice({ - variables: { - id: line.id, - jobline: { - act_price_before_ppc: line.act_price_before_ppc - ? line.act_price_before_ppc - : line.act_price, - act_price: values.act_price, - }, - }, - }); - await axios.post("/job/totalsssu", { - id: job.id, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("joblines.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - if (refetch) refetch(); - } else { - notification.open({ - type: "success", - message: t("joblines.successes.saved"), - }); - } - } catch (error) { - notification.open({ - type: "error", - message: t("joblines.errors.saving", { error: JSON.stringify(error) }), - }); - } finally { - setLoading(false); - } - }; +export default function JobLinesPartPriceChange({job, line, refetch}) { + const [loading, setLoading] = useState(false); + const [updatePartPrice] = useMutation(UPDATE_LINE_PPC); - const popcontent = ( -
- - - - - - ); + const handleFinish = async (values) => { + try { + setLoading(true); + const result = await updatePartPrice({ + variables: { + id: line.id, + jobline: { + act_price_before_ppc: line.act_price_before_ppc + ? line.act_price_before_ppc + : line.act_price, + act_price: values.act_price, + }, + }, + }); + await axios.post("/job/totalsssu", { + id: job.id, + }); + if (result.errors) { + notification.open({ + type: "error", + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + if (refetch) refetch(); + } else { + notification.open({ + type: "success", + message: t("joblines.successes.saved"), + }); + } + } catch (error) { + notification.open({ + type: "error", + message: t("joblines.errors.saving", {error: JSON.stringify(error)}), + }); + } finally { + setLoading(false); + } + }; - return ( - - - - {line.db_ref === "900510" || line.db_ref === "900511" - ? line.prt_dsmk_m - : line.act_price} - - {line.prt_dsmk_p && line.prt_dsmk_p !== 0 ? ( - {`(${line.prt_dsmk_p}%)`} - ) : ( - <> - )} - {line.act_price_before_ppc && line.act_price_before_ppc !== 0 ? ( - - + const popcontent = ( +
+ + + + + + ); + + return ( + + + + {line.db_ref === "900510" || line.db_ref === "900511" + ? line.prt_dsmk_m + : line.act_price} + + {line.prt_dsmk_p && line.prt_dsmk_p !== 0 ? ( + {`(${line.prt_dsmk_p}%)`} + ) : ( + <> + )} + {line.act_price_before_ppc && line.act_price_before_ppc !== 0 ? ( + + ( {line.act_price_before_ppc} ) - - ) : ( - <> - )} - - - ); +
+ ) : ( + <> + )} +
+
+ ); } diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx index 253df56a5..e1118233f 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -1,35 +1,27 @@ import { - DeleteFilled, - EditFilled, - FilterFilled, - HomeOutlined, - MinusCircleTwoTone, - PlusCircleTwoTone, - SyncOutlined, - WarningFilled, + DeleteFilled, + EditFilled, + FilterFilled, + HomeOutlined, + MinusCircleTwoTone, + PlusCircleTwoTone, + SyncOutlined, + WarningFilled, } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { - Button, - Dropdown, - Input, - Menu, - PageHeader, - Space, - Table, - Tag, -} from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, Dropdown, Input, Space, Table, Tag,} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { DELETE_JOB_LINE_BY_PK } from "../../graphql/jobs-lines.queries"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {DELETE_JOB_LINE_BY_PK} from "../../graphql/jobs-lines.queries"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort} from "../../utils/sorters"; import JobLineLocationPopup from "../job-line-location-popup/job-line-location-popup.component"; import JobLineNotePopup from "../job-line-note-popup/job-line-note-popup.component"; import JobLineStatusPopup from "../job-line-status-popup/job-line-status-popup.component"; @@ -38,648 +30,651 @@ import JobLinesBillRefernece from "../job-lines-bill-reference/job-lines-bill-re // import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/allocations-bulk-assignment.container"; // import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container"; import _ from "lodash"; -import moment from "moment"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import JobCreateIOU from "../job-create-iou/job-create-iou.component"; import JobSendPartPriceChangeComponent from "../job-send-parts-price-change/job-send-parts-price-change.component"; import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container"; import JobLinesExpander from "./job-lines-expander.component"; +import dayjs from "../../utils/day"; import JobLinesPartPriceChange from "./job-lines-part-price-change.component"; import JoblineTeamAssignment from "../job-line-team-assignment/job-line-team-assignmnent.component"; import JobLineDispatchButton from "../job-line-dispatch-button/job-line-dispatch-button.component"; import JobLineBulkAssignComponent from "../job-line-bulk-assign/job-line-bulk-assign.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, - technician: selectTechnician, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - setJobLineEditContext: (context) => - dispatch(setModalContext({ context: context, modal: "jobLineEdit" })), - setPartsOrderContext: (context) => - dispatch(setModalContext({ context: context, modal: "partsOrder" })), - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), + setJobLineEditContext: (context) => + dispatch(setModalContext({context: context, modal: "jobLineEdit"})), + setPartsOrderContext: (context) => + dispatch(setModalContext({context: context, modal: "partsOrder"})), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), }); export function JobLinesComponent({ - bodyshop, - jobRO, - technician, - setPartsOrderContext, - loading, - refetch, - jobLines, - setSearchText, - job, - setJobLineEditContext, - form, - setBillEnterContext, -}) { - const [deleteJobLine] = useMutation(DELETE_JOB_LINE_BY_PK); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const [selectedLines, setSelectedLines] = useState([]); - console.log( - "🚀 ~ file: job-lines.component.jsx:89 ~ selectedLines:", - selectedLines - ); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: {}, - }); - const { t } = useTranslation(); - const jobIsPrivate = bodyshop.md_ins_cos.find( - (c) => c.name === job.ins_co_nm - )?.private; + bodyshop, + jobRO, + technician, + setPartsOrderContext, + loading, + refetch, + jobLines, + setSearchText, + job, + setJobLineEditContext, + form, + setBillEnterContext, + }) { + const [deleteJobLine] = useMutation(DELETE_JOB_LINE_BY_PK); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); - const columns = [ - { - title: "#", - dataIndex: "line_no", - key: "line_no", - sorter: (a, b) => a.line_no - b.line_no, - fixed: "left", - sortOrder: - state.sortedInfo.columnKey === "line_no" && state.sortedInfo.order, - }, - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - fixed: "left", - key: "line_desc", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - onCell: (record) => ({ - className: record.manual_line && "job-line-manual", - style: { - ...(record.critical ? { boxShadow: " -.5em 0 0 #FFC107" } : {}), + const [selectedLines, setSelectedLines] = useState([]); + console.log( + "🚀 ~ file: job-lines.component.jsx:89 ~ selectedLines:", + selectedLines + ); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {}, + }); + const {t} = useTranslation(); + const jobIsPrivate = bodyshop.md_ins_cos.find( + (c) => c.name === job.ins_co_nm + )?.private; + + const columns = [ + { + title: "#", + dataIndex: "line_no", + key: "line_no", + sorter: (a, b) => a.line_no - b.line_no, + fixed: "left", + sortOrder: + state.sortedInfo.columnKey === "line_no" && state.sortedInfo.order, }, - }), - sortOrder: - state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, - ellipsis: true, - }, - { - title: t("joblines.fields.oem_partno"), - dataIndex: "oem_partno", - key: "oem_partno", - sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), - sortOrder: - state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, - ellipsis: true, - onCell: (record) => ({ - className: record.manual_line && "job-line-manual", - style: { - ...(record.parts_dispatch_lines[0]?.accepted_at - ? { boxShadow: " -.5em 0 0 #FFC107" } - : {}), + { + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + fixed: "left", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + onCell: (record) => ({ + className: record.manual_line && "job-line-manual", + style: { + ...(record.critical ? {boxShadow: " -.5em 0 0 #FFC107"} : {}), + }, + }), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + ellipsis: true, }, - }), - render: (text, record) => ( - + { + title: t("joblines.fields.oem_partno"), + dataIndex: "oem_partno", + key: "oem_partno", + sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), + sortOrder: + state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, + ellipsis: true, + onCell: (record) => ({ + className: record.manual_line && "job-line-manual", + style: { + ...(record.parts_dispatch_lines[0]?.accepted_at + ? {boxShadow: " -.5em 0 0 #FFC107"} + : {}), + }, + }), + render: (text, record) => ( + {`${record.oem_partno || ""} ${ - record.alt_partno ? `(${record.alt_partno})` : "" + record.alt_partno ? `(${record.alt_partno})` : "" }`.trim()} - ), - }, - { - title: t("joblines.fields.op_code_desc"), - dataIndex: "op_code_desc", - key: "op_code_desc", - sorter: (a, b) => alphaSort(a.op_code_desc, b.op_code_desc), - sortOrder: - state.sortedInfo.columnKey === "op_code_desc" && state.sortedInfo.order, - ellipsis: true, - render: (text, record) => - `${record.op_code_desc || ""}${ - record.alt_partm ? ` ${record.alt_partm}` : "" - }`, - }, - { - title: t("joblines.fields.part_type"), - dataIndex: "part_type", - key: "part_type", - filteredValue: state.filteredInfo.part_type || null, - sorter: (a, b) => alphaSort(a.part_type, b.part_type), - sortOrder: - state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order, - filters: [ - { - text: t("jobs.labels.partsfilter"), - value: [ - "PAN", - "PAC", - "PAR", - "PAL", - "PAA", - "PAM", - "PAP", - "PAS", - "PASL", - "PAG", - ], - }, - { - text: t("joblines.fields.part_types.PAN"), - value: ["PAN"], - }, - { - text: t("joblines.fields.part_types.PAP"), - value: ["PAP"], - }, - { - text: t("joblines.fields.part_types.PAL"), - value: ["PAL"], - }, - { - text: t("joblines.fields.part_types.PAA"), - value: ["PAA"], - }, - { - text: t("joblines.fields.part_types.PAG"), - value: ["PAG"], - }, - { - text: t("joblines.fields.part_types.PAS"), - value: ["PAS"], - }, - { - text: t("joblines.fields.part_types.PASL"), - value: ["PASL"], - }, - { - text: t("joblines.fields.part_types.PAC"), - value: ["PAC"], - }, - { - text: t("joblines.fields.part_types.PAR"), - value: ["PAR"], - }, - { - text: t("joblines.fields.part_types.PAM"), - value: ["PAM"], - }, - ], - onFilter: (value, record) => value.includes(record.part_type), - render: (text, record) => - record.part_type - ? t(`joblines.fields.part_types.${record.part_type}`) - : null, - }, - - { - title: t("joblines.fields.act_price"), - dataIndex: "act_price", - key: "act_price", - sorter: (a, b) => a.act_price - b.act_price, - sortOrder: - state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, - ellipsis: true, - render: (text, record) => ( - - ), - }, - { - title: t("joblines.fields.part_qty"), - dataIndex: "part_qty", - key: "part_qty", - }, - // { - // title: t("joblines.fields.total"), - // dataIndex: "total", - // key: "total", - // sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, - // sortOrder: - // state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - // ellipsis: true, - // render: (text, record) => ( - // - // {record.act_price * record.part_qty} - // - // ), - // }, - { - title: t("joblines.fields.mod_lbr_ty"), - dataIndex: "mod_lbr_ty", - key: "mod_lbr_ty", - - sorter: (a, b) => alphaSort(a.mod_lbr_ty, b.mod_lbr_ty), - sortOrder: - state.sortedInfo.columnKey === "mod_lbr_ty" && state.sortedInfo.order, - render: (text, record) => - record.mod_lbr_ty - ? t(`joblines.fields.lbr_types.${record.mod_lbr_ty}`) - : null, - }, - { - title: t("joblines.fields.mod_lb_hrs"), - dataIndex: "mod_lb_hrs", - key: "mod_lb_hrs", - - sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs, - sortOrder: - state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order, - }, - { - title: t("joblines.fields.line_ind"), - dataIndex: "line_ind", - key: "line_ind", - sorter: (a, b) => alphaSort(a.line_ind, b.line_ind), - sortOrder: - state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order, - responsive: ["md"], - }, - ...(Enhanced_Payroll.treatment === "on" - ? [ - { - title: t("joblines.fields.assigned_team"), - dataIndex: "assigned_team", - key: "assigned_team", - render: (text, record) => ( - ), - }, - ] - : []), - - { - title: t("joblines.fields.notes"), - dataIndex: "notes", - key: "notes", - render: (text, record) => ( - - ), - }, - { - title: t("joblines.fields.location"), - dataIndex: "location", - key: "location", - render: (text, record) => ( - - ), - }, - { - title: t("joblines.labels.billref"), - dataIndex: "billref", - key: "billref", - render: (text, record) => , - responsive: ["md"], - }, - { - title: t("joblines.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - filteredValue: state.filteredInfo.status || null, - - filters: - (jobLines && - jobLines - .map((l) => l.status) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "No Status*", - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.status), - render: (text, record) => ( - - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - {(record.manual_line || jobIsPrivate) && ( - <> - - - - )} - - ), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState((state) => ({ - ...state, - filteredInfo: filters, - sortedInfo: sorter, - })); - }; - - const handleMark = (e) => { - if (e.key === "clear") { - setSelectedLines([]); - } else { - const markedTypes = [e.key]; - if (e.key === "PAN") markedTypes.push("PAP"); - if (e.key === "PAS") markedTypes.push("PASL"); - setSelectedLines((selectedLines) => - _.uniq([ - ...selectedLines, - ...jobLines.filter( - (item) => - markedTypes.includes(item.part_type) || - markedTypes.includes(item.mod_lbr_ty) - ), - ]) - ); - } - }; - - const markMenu = ( - - {t("joblines.fields.part_types.PAA")} - {t("joblines.fields.part_types.PAN")} - {t("joblines.fields.part_types.PAL")} - {t("joblines.fields.part_types.PAS")} - - {t("joblines.fields.lbr_types.LAA")} - {t("joblines.fields.lbr_types.LAB")} - {t("joblines.fields.lbr_types.LAD")} - {t("joblines.fields.lbr_types.LAE")} - {t("joblines.fields.lbr_types.LAF")} - {t("joblines.fields.lbr_types.LAG")} - {t("joblines.fields.lbr_types.LAM")} - {t("joblines.fields.lbr_types.LAR")} - {t("joblines.fields.lbr_types.LAS")} - {t("joblines.fields.lbr_types.LAU")} - {t("joblines.fields.lbr_types.LA1")} - {t("joblines.fields.lbr_types.LA2")} - {t("joblines.fields.lbr_types.LA3")} - {t("joblines.fields.lbr_types.LA2")} - - {t("general.labels.clear")} - - ); - - return ( -
- - - - - {job.special_coverage_policy && ( - - - - {t("jobs.labels.specialcoveragepolicy")} - - - )} - - {Enhanced_Payroll.treatment === "on" && ( - - )} - - - - - - - - {bodyshop.region_config.toLowerCase().startsWith("us") && ( - - )} - - { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> - - } - /> -
( - - ), - rowExpandable: (record) => true, - //expandRowByClick: true, - expandIcon: ({ expanded, onExpand, record }) => - expanded ? ( - onExpand(record, e)} /> - ) : ( - onExpand(record, e)} /> + }, + { + text: t("joblines.fields.part_types.PAN"), + value: ["PAN"], + }, + { + text: t("joblines.fields.part_types.PAP"), + value: ["PAP"], + }, + { + text: t("joblines.fields.part_types.PAL"), + value: ["PAL"], + }, + { + text: t("joblines.fields.part_types.PAA"), + value: ["PAA"], + }, + { + text: t("joblines.fields.part_types.PAG"), + value: ["PAG"], + }, + { + text: t("joblines.fields.part_types.PAS"), + value: ["PAS"], + }, + { + text: t("joblines.fields.part_types.PASL"), + value: ["PASL"], + }, + { + text: t("joblines.fields.part_types.PAC"), + value: ["PAC"], + }, + { + text: t("joblines.fields.part_types.PAR"), + value: ["PAR"], + }, + { + text: t("joblines.fields.part_types.PAM"), + value: ["PAM"], + }, + ], + onFilter: (value, record) => value.includes(record.part_type), + render: (text, record) => + record.part_type + ? t(`joblines.fields.part_types.${record.part_type}`) + : null, + }, + + { + title: t("joblines.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + sorter: (a, b) => a.act_price - b.act_price, + sortOrder: + state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, + ellipsis: true, + render: (text, record) => ( + ), - }} - onRow={(record, rowIndex) => { - return { - onDoubleClick: (event) => { - const notMatchingLines = selectedLines.filter( - (i) => i.id !== record.id - ); - notMatchingLines.length !== selectedLines.length - ? setSelectedLines(notMatchingLines) - : setSelectedLines([...selectedLines, record]); - }, // double click row - }; - }} - rowSelection={{ - selectedRowKeys: selectedLines.map((item) => item && item.id), - onSelectAll: (selected, selectedRows, changeRows) => { - setSelectedLines(selectedRows); - }, - onSelect: (record, selected, selectedRows, nativeEvent) => { - if (selected) { - setSelectedLines((selectedLines) => - _.uniqBy([...selectedLines, record], "id") - ); - } else { - setSelectedLines((selectedLines) => - selectedLines.filter((l) => l.id !== record.id) - ); - } - }, - }} - /> - - ); + }, + { + title: t("joblines.fields.part_qty"), + dataIndex: "part_qty", + key: "part_qty", + }, + // { + // title: t("joblines.fields.total"), + // dataIndex: "total", + // key: "total", + // sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, + // sortOrder: + // state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + // ellipsis: true, + // render: (text, record) => ( + // + // {record.act_price * record.part_qty} + // + // ), + // }, + { + title: t("joblines.fields.mod_lbr_ty"), + dataIndex: "mod_lbr_ty", + key: "mod_lbr_ty", + + sorter: (a, b) => alphaSort(a.mod_lbr_ty, b.mod_lbr_ty), + sortOrder: + state.sortedInfo.columnKey === "mod_lbr_ty" && state.sortedInfo.order, + render: (text, record) => + record.mod_lbr_ty + ? t(`joblines.fields.lbr_types.${record.mod_lbr_ty}`) + : null, + }, + { + title: t("joblines.fields.mod_lb_hrs"), + dataIndex: "mod_lb_hrs", + key: "mod_lb_hrs", + + sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs, + sortOrder: + state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order, + }, + { + title: t("joblines.fields.line_ind"), + dataIndex: "line_ind", + key: "line_ind", + sorter: (a, b) => alphaSort(a.line_ind, b.line_ind), + sortOrder: + state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order, + responsive: ["md"], + }, + ...(Enhanced_Payroll.treatment === "on" + ? [ + { + title: t("joblines.fields.assigned_team"), + dataIndex: "assigned_team", + key: "assigned_team", + render: (text, record) => ( + + ), + }, + ] + : []), + + { + title: t("joblines.fields.notes"), + dataIndex: "notes", + key: "notes", + render: (text, record) => ( + + ), + }, + { + title: t("joblines.fields.location"), + dataIndex: "location", + key: "location", + render: (text, record) => ( + + ), + }, + { + title: t("joblines.labels.billref"), + dataIndex: "billref", + key: "billref", + render: (text, record) => , + responsive: ["md"], + }, + { + title: t("joblines.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filteredValue: state.filteredInfo.status || null, + + filters: + (jobLines && + jobLines + .map((l) => l.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), + render: (text, record) => ( + + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + {(record.manual_line || jobIsPrivate) && ( + <> + + + + )} + + ), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState((state) => ({ + ...state, + filteredInfo: filters, + sortedInfo: sorter, + })); + }; + + const handleMark = (e) => { + if (e.key === "clear") { + setSelectedLines([]); + } else { + const markedTypes = [e.key]; + if (e.key === "PAN") markedTypes.push("PAP"); + if (e.key === "PAS") markedTypes.push("PASL"); + setSelectedLines((selectedLines) => + _.uniq([ + ...selectedLines, + ...jobLines.filter( + (item) => + markedTypes.includes(item.part_type) || + markedTypes.includes(item.mod_lbr_ty) + ), + ]) + ); + } + }; + + const markMenu = { + onClick: handleMark, + items: [ + {key: "PAA", label: t("joblines.fields.part_types.PAA")}, + {key: "PAN", label: t("joblines.fields.part_types.PAN")}, + {key: "PAL", label: t("joblines.fields.part_types.PAL")}, + {key: "PAS", label: t("joblines.fields.part_types.PAS")}, + {type: 'divider'}, + {key: "LAA", label: t("joblines.fields.lbr_types.LAA")}, + {key: "LAB", label: t("joblines.fields.lbr_types.LAB")}, + {key: "LAD", label: t("joblines.fields.part_types.LAD")}, + {key: "LAE", label: t("joblines.fields.part_types.LAE")}, + {key: "LAF", label: t("joblines.fields.part_types.LAF")}, + {key: "LAG", label: t("joblines.fields.part_types.LAG")}, + {key: "LAM", label: t("joblines.fields.part_types.LAM")}, + {key: "LAR", label: t("joblines.fields.part_types.LAR")}, + {key: "LAS", label: t("joblines.fields.part_types.LAS")}, + {key: "LAU", label: t("joblines.fields.part_types.LAU")}, + {key: "LA1", label: t("joblines.fields.part_types.LA1")}, + {key: "LA2", label: t("joblines.fields.part_types.LA2")}, + {key: "LA3", label: t("joblines.fields.part_types.LA3")}, + {key: "LA4", label: t("joblines.fields.part_types.LA4")}, + {type: 'divider'}, + {key: "clear", label: t("general.labels.clear")}, + ] + }; + + return ( +
+ + + + + {job.special_coverage_policy && ( + + + + {t("jobs.labels.specialcoveragepolicy")} + + + )} + + {Enhanced_Payroll.treatment === "on" && ( + + )} + + + + + + + + {bodyshop.region_config.toLowerCase().startsWith("us") && ( + + )} + + { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> + + } + /> +
( + + ), + rowExpandable: (record) => true, + //expandRowByClick: true, + expandIcon: ({expanded, onExpand, record}) => + expanded ? ( + onExpand(record, e)}/> + ) : ( + onExpand(record, e)}/> + ), + }} + onRow={(record, rowIndex) => { + return { + onDoubleClick: (event) => { + const notMatchingLines = selectedLines.filter( + (i) => i.id !== record.id + ); + notMatchingLines.length !== selectedLines.length + ? setSelectedLines(notMatchingLines) + : setSelectedLines([...selectedLines, record]); + }, // double click row + }; + }} + rowSelection={{ + selectedRowKeys: selectedLines.map((item) => item && item.id), + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedLines(selectedRows); + }, + onSelect: (record, selected, selectedRows, nativeEvent) => { + if (selected) { + setSelectedLines((selectedLines) => + _.uniqBy([...selectedLines, record], "id") + ); + } else { + setSelectedLines((selectedLines) => + selectedLines.filter((l) => l.id !== record.id) + ); + } + }, + }} + /> + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobLinesComponent); diff --git a/client/src/components/job-detail-lines/job-lines.container.jsx b/client/src/components/job-detail-lines/job-lines.container.jsx index 053b984cf..5aa94637d 100644 --- a/client/src/components/job-detail-lines/job-lines.container.jsx +++ b/client/src/components/job-detail-lines/job-lines.container.jsx @@ -1,47 +1,48 @@ -import React, { useMemo, useState } from "react"; +import React, {useMemo, useState} from "react"; import JobLinesComponent from "./job-lines.component"; -function JobLinesContainer({ job, joblines, refetch, form, ...rest }) { - const [searchText, setSearchText] = useState(""); - const jobLines = useMemo(() => { - return joblines - ? searchText - ? joblines.filter( - (jl) => - (jl.unq_seq || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.line_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.part_type || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.oem_partno || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.op_code_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.db_price || "") - .toString() - .includes(searchText.toLowerCase()) || - (jl.act_price || "").toString().includes(searchText.toLowerCase()) - ) - : joblines - : []; - }, [joblines, searchText]); +function JobLinesContainer({job, joblines, refetch, form, ...rest}) { + const [searchText, setSearchText] = useState(""); - return ( - - ); + const jobLines = useMemo(() => { + return joblines + ? searchText + ? joblines.filter( + (jl) => + (jl.unq_seq || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.line_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.part_type || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.oem_partno || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.op_code_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.db_price || "") + .toString() + .includes(searchText.toLowerCase()) || + (jl.act_price || "").toString().includes(searchText.toLowerCase()) + ) + : joblines + : []; + }, [joblines, searchText]); + + return ( + + ); } export default JobLinesContainer; diff --git a/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx index 6cfdc8307..1668c93d4 100644 --- a/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx +++ b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx @@ -1,197 +1,198 @@ -import { DeleteFilled, PlusCircleFilled } from "@ant-design/icons"; -import { Button, Col, Popover, Row, Select, Space, Spin } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {DeleteFilled, PlusCircleFilled} from "@ant-design/icons"; +import {Button, Col, Popover, Row, Select, Space, Spin} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import DataLabel from "../data-label/data-label.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -const iconStyle = { marginLeft: ".3rem" }; +const iconStyle = {marginLeft: ".3rem"}; export function JobEmployeeAssignments({ - bodyshop, - jobRO, - body, - refinish, + bodyshop, + jobRO, + body, + refinish, - prep, - csr, - handleAdd, - handleRemove, - loading, -}) { - const { t } = useTranslation(); - const [assignment, setAssignment] = useState({ - operation: null, - employeeid: null, - }); - const [visibility, setVisibility] = useState(false); + prep, + csr, + handleAdd, + handleRemove, + loading, + }) { + const {t} = useTranslation(); + const [assignment, setAssignment] = useState({ + operation: null, + employeeid: null, + }); + const [visibility, setVisibility] = useState(false); - const onChange = (value, option) => { - setAssignment({ ...assignment, employeeid: value, name: option.name }); - }; + const onChange = (value, option) => { + setAssignment({...assignment, employeeid: value, name: option.name}); + }; - const popContent = ( - - - - - - - - - - - - ); + const popContent = ( + + + + + + + + + + + + ); - return ( - - - - {body ? ( -
- {`${body.first_name || ""} ${body.last_name || ""}`} - !jobRO && handleRemove("body")} - /> -
- ) : ( - { - if (!jobRO) { - setAssignment({ operation: "body" }); - setVisibility(true); - } - }} - /> - )} -
- - {prep ? ( -
- {`${prep.first_name || ""} ${prep.last_name || ""}`} - !jobRO && handleRemove("prep")} - /> -
- ) : ( - { - if (!jobRO) { - setAssignment({ operation: "prep" }); - setVisibility(true); - } - }} - /> - )} -
- - {refinish ? ( -
+ return ( + + + + {body ? ( +
+ {`${body.first_name || ""} ${body.last_name || ""}`} + !jobRO && handleRemove("body")} + /> +
+ ) : ( + { + if (!jobRO) { + setAssignment({operation: "body"}); + setVisibility(true); + } + }} + /> + )} +
+ + {prep ? ( +
+ {`${prep.first_name || ""} ${prep.last_name || ""}`} + !jobRO && handleRemove("prep")} + /> +
+ ) : ( + { + if (!jobRO) { + setAssignment({operation: "prep"}); + setVisibility(true); + } + }} + /> + )} +
+ + {refinish ? ( +
{`${refinish.first_name || ""} ${ - refinish.last_name || "" + refinish.last_name || "" }`} - !jobRO && handleRemove("refinish")} - /> -
- ) : ( - { - if (!jobRO) { - setAssignment({ operation: "refinish" }); - setVisibility(true); - } - }} - /> - )} -
- - {csr ? ( -
- {`${csr.first_name || ""} ${csr.last_name || ""}`} - !jobRO && handleRemove("csr")} - /> -
- ) : ( - { - if (!jobRO) { - setAssignment({ operation: "csr" }); - setVisibility(true); - } - }} - /> - )} -
-
-
- ); + !jobRO && handleRemove("refinish")} + /> +
+ ) : ( + { + if (!jobRO) { + setAssignment({operation: "refinish"}); + setVisibility(true); + } + }} + /> + )} +
+ + {csr ? ( +
+ {`${csr.first_name || ""} ${csr.last_name || ""}`} + !jobRO && handleRemove("csr")} + /> +
+ ) : ( + { + if (!jobRO) { + setAssignment({operation: "csr"}); + setVisibility(true); + } + }} + /> + )} +
+
+
+ ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobEmployeeAssignments); diff --git a/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx b/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx index 71e56c53c..f81e60819 100644 --- a/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx +++ b/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx @@ -1,112 +1,113 @@ -import { useMutation } from "@apollo/client"; -import { notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB_ASSIGNMENTS } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB_ASSIGNMENTS} from "../../graphql/jobs.queries"; import JobEmployeeAssignmentsComponent from "./job-employee-assignments.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobEmployeeAssignmentsContainer); export function JobEmployeeAssignmentsContainer({ - job, - refetch, - insertAuditTrail, -}) { - const { t } = useTranslation(); - const [updateJob] = useMutation(UPDATE_JOB_ASSIGNMENTS); - const [loading, setLoading] = useState(false); + job, + refetch, + insertAuditTrail, + }) { + const {t} = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOB_ASSIGNMENTS); + const [loading, setLoading] = useState(false); - const handleAdd = async (assignment) => { - setLoading(true); - const { operation, employeeid, name } = assignment; - logImEXEvent("job_assign_employee", { operation }); + const handleAdd = async (assignment) => { + setLoading(true); + const {operation, employeeid, name} = assignment; + logImEXEvent("job_assign_employee", {operation}); - let empAssignment = determineFieldName(operation); + let empAssignment = determineFieldName(operation); - const result = await updateJob({ - variables: { jobId: job.id, job: { [empAssignment]: employeeid } }, - }); - if (refetch) refetch(); + const result = await updateJob({ + variables: {jobId: job.id, job: {[empAssignment]: employeeid}}, + }); + if (refetch) refetch(); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobassignmentchange(operation, name), - }); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobassignmentchange(operation, name), + }); - if (!!result.errors) { - notification["error"]({ - message: t("jobs.errors.assigning", { - message: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; - const handleRemove = async (operation) => { - setLoading(true); - logImEXEvent("job_unassign_employee", { operation }); + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + const handleRemove = async (operation) => { + setLoading(true); + logImEXEvent("job_unassign_employee", {operation}); - let empAssignment = determineFieldName(operation); - const result = await updateJob({ - variables: { jobId: job.id, job: { [empAssignment]: null } }, - }); + let empAssignment = determineFieldName(operation); + const result = await updateJob({ + variables: {jobId: job.id, job: {[empAssignment]: null}}, + }); - if (!!result.errors) { - notification["error"]({ - message: t("jobs.errors.assigning", { - message: JSON.stringify(result.errors), - }), - }); - } - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobassignmentremoved(operation), - }); - setLoading(false); - }; + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobassignmentremoved(operation), + }); + setLoading(false); + }; - return ( -
- -
- ); + return ( +
+ +
+ ); } const determineFieldName = (operation) => { - switch (operation) { - case "body": - return "employee_body"; - case "prep": - return "employee_prep"; - case "csr": - return "employee_csr"; - case "refinish": - return "employee_refinish"; + switch (operation) { + case "body": + return "employee_body"; + case "prep": + return "employee_prep"; + case "csr": + return "employee_csr"; + case "refinish": + return "employee_refinish"; - default: - return null; - } + default: + return null; + } }; diff --git a/client/src/components/job-line-bulk-assign/job-line-bulk-assign.component.jsx b/client/src/components/job-line-bulk-assign/job-line-bulk-assign.component.jsx index 968dddd4b..63a9164dd 100644 --- a/client/src/components/job-line-bulk-assign/job-line-bulk-assign.component.jsx +++ b/client/src/components/job-line-bulk-assign/job-line-bulk-assign.component.jsx @@ -1,149 +1,147 @@ -import React, { useState } from "react"; +import React, {useState} from "react"; -import { useMutation } from "@apollo/client"; -import { Button, Form, Popover, Select, Space, notification } from "antd"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_LINE_BULK_ASSIGN } from "../../graphql/jobs-lines.queries"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Popover, Select, Space} from "antd"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_LINE_BULK_ASSIGN} from "../../graphql/jobs-lines.queries"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect(mapStateToProps, mapDispatchToProps)(JoblineBulkAssign); export function JoblineBulkAssign({ - setSelectedLines, - selectedLines, - insertAuditTrail, - bodyshop, - jobRO, - job, - currentUser, -}) { - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); + setSelectedLines, + selectedLines, + insertAuditTrail, + bodyshop, + jobRO, + job, + currentUser, + }) { + const [visible, setVisible] = useState(false); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); - const { t } = useTranslation(); - const [assignLines] = useMutation(UPDATE_LINE_BULK_ASSIGN); + const {t} = useTranslation(); + const [assignLines] = useMutation(UPDATE_LINE_BULK_ASSIGN); - const handleConvert = async (values) => { - try { - setLoading(true); - const result = await assignLines({ - variables: { - jobline: { - assigned_team: values.assigned_team, - }, - ids: selectedLines.map((l) => l.id), - }, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("parts_dispatch.errors.creating", { - error: JSON.stringify(result.errors), - }), - }); - } else { - //Insert the audit trail here. + const handleConvert = async (values) => { + try { + setLoading(true); + const result = await assignLines({ + variables: { + jobline: { + assigned_team: values.assigned_team, + }, + ids: selectedLines.map((l) => l.id), + }, + }); + if (result.errors) { + notification.open({ + type: "error", + message: t("parts_dispatch.errors.creating", { + error: JSON.stringify(result.errors), + }), + }); + } else { + //Insert the audit trail here. - const teamName = bodyshop.employee_teams.find( - (et) => et.id === values.assigned_team - )?.name; + const teamName = bodyshop.employee_teams.find( + (et) => et.id === values.assigned_team + )?.name; - const hours = selectedLines.reduce( - (acc, val) => (acc += val.mod_lb_hrs), - 0 - ); + const hours = selectedLines.reduce( + (acc, val) => (acc += val.mod_lb_hrs), + 0 + ); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.assignedlinehours( - teamName, - hours.toFixed(1) - ), - }); - setSelectedLines([]); - setVisible(false); - } - } catch (error) { - notification.open({ - type: "error", - message: t("parts_dispatch.errors.creating", { - error: error, - }), - }); - } finally { - setLoading(false); - } - }; - - const popMenu = ( -
-
- - - + } catch (error) { + notification.open({ + type: "error", + message: t("parts_dispatch.errors.creating", { + error: error, + }), + }); + } finally { + setLoading(false); + } + }; - - - - - -
- ); + const popMenu = ( +
+
+ + + - return ( - - - - ); + + + + + +
+ ); + + return ( + + + + ); } diff --git a/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx b/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx index dea8e5dcc..d1062ce92 100644 --- a/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx +++ b/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx @@ -1,256 +1,245 @@ -import { ClockCircleOutlined } from "@ant-design/icons"; -import { useApolloClient } from "@apollo/client"; -import { - Button, - Card, - Form, - notification, - Popover, - Select, - Space, - Tooltip, -} from "antd"; -import { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - QUERY_JOB_LBR_ADJUSTMENTS, - UPDATE_JOB, -} from "../../graphql/jobs.queries"; +import {ClockCircleOutlined} from "@ant-design/icons"; +import {useApolloClient} from "@apollo/client"; +import {Button, Card, Form, notification, Popover, Select, Space, Tooltip,} from "antd"; +import {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {QUERY_JOB_LBR_ADJUSTMENTS, UPDATE_JOB,} from "../../graphql/jobs.queries"; import _ from "lodash"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_LINE} from "../../graphql/jobs-lines.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobLineConvertToLabor); export function JobLineConvertToLabor({ - children, - jobline, - job, - insertAuditTrail, - ...otherBtnProps -}) { - const { t } = useTranslation(); + children, + jobline, + job, + insertAuditTrail, + ...otherBtnProps + }) { + const {t} = useTranslation(); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [visibility, setVisibility] = useState(false); - const client = useApolloClient(); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [visibility, setVisibility] = useState(false); + const client = useApolloClient(); - const handleFinish = async (values) => { - const { mod_lbr_ty } = values; - logImEXEvent("job_convert_dollar_to_labor"); + const handleFinish = async (values) => { + const {mod_lbr_ty} = values; + logImEXEvent("job_convert_dollar_to_labor"); - setLoading(true); + setLoading(true); - const existingAdjustments = await client.query({ - query: QUERY_JOB_LBR_ADJUSTMENTS, - variables: { - id: job.id, - }, - }); - - const newAdjustments = _.cloneDeep( - existingAdjustments.data.jobs_by_pk.lbr_adjustments - ); - const adjustment = calculateAdjustment({ mod_lbr_ty, job, jobline }); - newAdjustments[mod_lbr_ty] = (newAdjustments[mod_lbr_ty] || 0) + adjustment; - - const jobUpdate = client.mutate({ - mutation: UPDATE_JOB, - variables: { - jobId: job.id, - job: { lbr_adjustments: newAdjustments }, - }, - }); - - const lineUpdate = client.mutate({ - mutation: UPDATE_JOB_LINE, - variables: { - lineId: jobline.id, - line: { - convertedtolbr: true, - convertedtolbr_data: { - mod_lbr_ty: mod_lbr_ty, - mod_lb_hrs: adjustment, - }, - }, - }, - }); - - if (!!jobUpdate.errors) { - notification["error"]({ - message: t("jobs.errors.saving", { - message: JSON.stringify(jobUpdate.errors), - }), - }); - return; - } - if (!!lineUpdate.errors) { - notification["error"]({ - message: t("joblines.errors.saving", { - message: JSON.stringify(lineUpdate.errors), - }), - }); - return; - } - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobmodifylbradj({ - hours: calculateAdjustment({ mod_lbr_ty, job, jobline }).toFixed(1), - mod_lbr_ty, - }), - }); - setLoading(false); - setVisibility(false); - }; - - const overlay = ( - -
- - - + }); - - {() => { - const { mod_lbr_ty } = form.getFieldsValue(); - return t("joblines.labels.adjustmenttobeadded", { - adjustment: calculateAdjustment({ - mod_lbr_ty, - job, - jobline, - }).toFixed(1), + const newAdjustments = _.cloneDeep( + existingAdjustments.data.jobs_by_pk.lbr_adjustments + ); + const adjustment = calculateAdjustment({mod_lbr_ty, job, jobline}); + newAdjustments[mod_lbr_ty] = (newAdjustments[mod_lbr_ty] || 0) + adjustment; + + const jobUpdate = client.mutate({ + mutation: UPDATE_JOB, + variables: { + jobId: job.id, + job: {lbr_adjustments: newAdjustments}, + }, + }); + + const lineUpdate = client.mutate({ + mutation: UPDATE_JOB_LINE, + variables: { + lineId: jobline.id, + line: { + convertedtolbr: true, + convertedtolbr_data: { + mod_lbr_ty: mod_lbr_ty, + mod_lb_hrs: adjustment, + }, + }, + }, + }); + + if (!!jobUpdate.errors) { + notification["error"]({ + message: t("jobs.errors.saving", { + message: JSON.stringify(jobUpdate.errors), + }), }); - }} - + return; + } + if (!!lineUpdate.errors) { + notification["error"]({ + message: t("joblines.errors.saving", { + message: JSON.stringify(lineUpdate.errors), + }), + }); + return; + } + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobmodifylbradj({ + hours: calculateAdjustment({mod_lbr_ty, job, jobline}).toFixed(1), + mod_lbr_ty, + }), + }); + setLoading(false); + setVisibility(false); + }; - - - - - -
- ); + const overlay = ( + +
+ + + - const handleClick = (e) => { - setLoading(true); + + {() => { + const {mod_lbr_ty} = form.getFieldsValue(); + return t("joblines.labels.adjustmenttobeadded", { + adjustment: calculateAdjustment({ + mod_lbr_ty, + job, + jobline, + }).toFixed(1), + }); + }} + - form.setFieldsValue({ - // date: new moment(), - // bodyhrs: Math.round(v.bodyhrs * 10) / 10, - // painthrs: Math.round(v.painthrs * 10) / 10, - }); - setVisibility(true); - setLoading(false); - }; + + + + + +
+ ); - return ( - <> - {children} - {jobline.act_price !== 0 && ( - - - - - - )} - - ); + const handleClick = (e) => { + setLoading(true); + + form.setFieldsValue({ + // date: new dayjs(), + // bodyhrs: Math.round(v.bodyhrs * 10) / 10, + // painthrs: Math.round(v.painthrs * 10) / 10, + }); + setVisibility(true); + setLoading(false); + }; + + return ( + <> + {children} + {jobline.act_price !== 0 && ( + + + + + + )} + + ); } -function calculateAdjustment({ mod_lbr_ty, job, jobline }) { - if (!mod_lbr_ty) return 0; - const rate = job[`rate_${mod_lbr_ty.toLowerCase()}`]; +function calculateAdjustment({mod_lbr_ty, job, jobline}) { + if (!mod_lbr_ty) return 0; + const rate = job[`rate_${mod_lbr_ty.toLowerCase()}`]; - if (rate === 0 || rate === null || rate === undefined) return 0; - const adj = jobline.act_price / job[`rate_${mod_lbr_ty.toLowerCase()}`]; + if (rate === 0 || rate === null || rate === undefined) return 0; + const adj = jobline.act_price / job[`rate_${mod_lbr_ty.toLowerCase()}`]; - return adj; + return adj; } diff --git a/client/src/components/job-line-dispatch-button/job-line-dispatch-button.component.jsx b/client/src/components/job-line-dispatch-button/job-line-dispatch-button.component.jsx index 50fdfee05..90a760a4c 100644 --- a/client/src/components/job-line-dispatch-button/job-line-dispatch-button.component.jsx +++ b/client/src/components/job-line-dispatch-button/job-line-dispatch-button.component.jsx @@ -1,167 +1,165 @@ -import React, { useState } from "react"; +import React, {useState} from "react"; + +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Popover, Select, Space} from "antd"; +import day from "../../utils/day"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_PARTS_DISPATCH} from "../../graphql/parts-dispatch.queries"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; -import { useMutation } from "@apollo/client"; -import { Button, Form, Popover, Select, Space, notification } from "antd"; -import moment from "moment"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_PARTS_DISPATCH } from "../../graphql/parts-dispatch.queries"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobLineDispatchButton); export function JobLineDispatchButton({ - setSelectedLines, - selectedLines, + setSelectedLines, + selectedLines, - bodyshop, - jobRO, - job, - currentUser, -}) { - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const Templates = TemplateList("job_special", { - ro_number: job.ro_number, - }); - const { t } = useTranslation(); - const [dispatchLines] = useMutation(INSERT_PARTS_DISPATCH); + bodyshop, + jobRO, + job, + currentUser, + }) { + const [visible, setVisible] = useState(false); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const Templates = TemplateList("job_special", { + ro_number: job.ro_number, + }); + const {t} = useTranslation(); + const [dispatchLines] = useMutation(INSERT_PARTS_DISPATCH); - const handleConvert = async (values) => { - try { - setLoading(true); - //THIS HAS NOT YET BEEN TESTED. START BY FINISHING THIS FUNCTION. - const result = await dispatchLines({ - variables: { - partsDispatch: { - dispatched_at: moment(), - employeeid: values.employeeid, - jobid: job.id, - dispatched_by: currentUser.email, - parts_dispatch_lines: { - data: selectedLines.map((l) => ({ - joblineid: l.id, - quantity: l.part_qty, - })), - }, - }, - //joblineids: selectedLines.map((l) => l.id), - }, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("parts_dispatch.errors.creating", { - error: result.errors, - }), - }); - } else { - setSelectedLines([]); - await GenerateDocument( - { - name: Templates.parts_dispatch.key, - variables: { - id: result.data.insert_parts_dispatch_one.id, - }, - }, - {}, - "p" - ); - } - setVisible(false); - } catch (error) { - notification.open({ - type: "error", - message: t("parts_dispatch.errors.creating", { - error: error, - }), - }); - } finally { - setLoading(false); - } - }; - - const popMenu = ( -
-
- - - + + - - - - - -
- ); + + + + + + + ); - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx b/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx index dfda79bd7..5860095d3 100644 --- a/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx +++ b/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx @@ -1,90 +1,91 @@ -import { useMutation } from "@apollo/client"; -import { notification, Select, Space } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {notification, Select, Space} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_LINE} from "../../graphql/jobs-lines.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JobLineLocationPopup({ bodyshop, jobline, disabled }) { - const [editing, setEditing] = useState(false); - const [loading, setLoading] = useState(false); - const [location, setLocation] = useState(jobline.location); - const [updateJob] = useMutation(UPDATE_JOB_LINE); - const { t } = useTranslation(); +export function JobLineLocationPopup({bodyshop, jobline, disabled}) { + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(false); + const [location, setLocation] = useState(jobline.location); + const [updateJob] = useMutation(UPDATE_JOB_LINE); + const {t} = useTranslation(); - useEffect(() => { - if (editing) setLocation(jobline.location); - }, [editing, jobline.location]); + useEffect(() => { + if (editing) setLocation(jobline.location); + }, [editing, jobline.location]); - const handleChange = (e) => { - setLocation(e); - }; + const handleChange = (e) => { + setLocation(e); + }; - const handleSave = async (e) => { - setLoading(true); - const result = await updateJob({ - variables: { lineId: jobline.id, line: { location: location || "" } }, - }); + const handleSave = async (e) => { + setLoading(true); + const result = await updateJob({ + variables: {lineId: jobline.id, line: {location: location || ""}}, + }); - if (!!!result.errors) { - notification["success"]({ message: t("joblines.successes.saved") }); - } else { - notification["error"]({ - message: t("joblines.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - setEditing(false); - }; + if (!!!result.errors) { + notification["success"]({message: t("joblines.successes.saved")}); + } else { + notification["error"]({ + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + setEditing(false); + }; - if (editing) + if (editing) + return ( +
+ + + +
+ ); return ( -
- - - -
+
!disabled && setEditing(true)} + > + + {jobline.location} + {jobline.parts_dispatch_lines?.length > 0 && "-Disp"} + +
); - return ( -
!disabled && setEditing(true)} - > - - {jobline.location} - {jobline.parts_dispatch_lines?.length > 0 && "-Disp"} - -
- ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobLineLocationPopup); diff --git a/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx b/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx index 76836a6a8..aeff30600 100644 --- a/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx +++ b/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx @@ -1,78 +1,78 @@ -import { FieldTimeOutlined } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Input, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; +import {FieldTimeOutlined} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Input, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB_LINE} from "../../graphql/jobs-lines.queries"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -export default function JobLineNotePopup({ jobline, disabled }) { - const [editing, setEditing] = useState(false); - const [loading, setLoading] = useState(false); - const [note, setNote] = useState(jobline.note); - const [updateJob] = useMutation(UPDATE_JOB_LINE); - const { t } = useTranslation(); +export default function JobLineNotePopup({jobline, disabled}) { + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(false); + const [note, setNote] = useState(jobline.note); + const [updateJob] = useMutation(UPDATE_JOB_LINE); + const {t} = useTranslation(); - useEffect(() => { - if (editing) setNote(jobline.notes); - }, [editing, jobline.notes]); + useEffect(() => { + if (editing) setNote(jobline.notes); + }, [editing, jobline.notes]); - const handleChange = (e) => { - e.stopPropagation(); - setNote(e.currentTarget.value); - }; + const handleChange = (e) => { + e.stopPropagation(); + setNote(e.currentTarget.value); + }; - const handleSave = async (e) => { - e.stopPropagation(); - setLoading(true); - const result = await updateJob({ - variables: { lineId: jobline.id, line: { notes: note || "" } }, - }); + const handleSave = async (e) => { + e.stopPropagation(); + setLoading(true); + const result = await updateJob({ + variables: {lineId: jobline.id, line: {notes: note || ""}}, + }); - if (!!!result.errors) { - notification["success"]({ message: t("joblines.successes.saved") }); - } else { - notification["error"]({ - message: t("joblines.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - setEditing(false); - }; + if (!!!result.errors) { + notification["success"]({message: t("joblines.successes.saved")}); + } else { + notification["error"]({ + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + setEditing(false); + }; - if (editing) + if (editing) + return ( +
+ : null} + value={note} + onChange={handleChange} + onPressEnter={handleSave} + onBlur={handleSave} + /> +
+ ); return ( -
- : null} - value={note} - onChange={handleChange} - onPressEnter={handleSave} - onBlur={handleSave} - /> -
+
+
!disabled && setEditing(true)} + > + {jobline.ioucreated && ( +
+ + {t("joblines.labels.ioucreated")} +
+ )} + {jobline.notes || null} +
+
); - return ( -
-
!disabled && setEditing(true)} - > - {jobline.ioucreated && ( -
- - {t("joblines.labels.ioucreated")} -
- )} - {jobline.notes || null} -
-
- ); } diff --git a/client/src/components/job-line-status-popup/job-line-status-popup.component.jsx b/client/src/components/job-line-status-popup/job-line-status-popup.component.jsx index d47379f2b..f9bf006ae 100644 --- a/client/src/components/job-line-status-popup/job-line-status-popup.component.jsx +++ b/client/src/components/job-line-status-popup/job-line-status-popup.component.jsx @@ -1,84 +1,85 @@ -import { notification, Select } from "antd"; -import React, { useEffect, useState } from "react"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {notification, Select} from "antd"; +import React, {useEffect, useState} from "react"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_LINE} from "../../graphql/jobs-lines.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JobLineStatusPopup({ bodyshop, jobline, disabled }) { - const [editing, setEditing] = useState(false); - const [loading, setLoading] = useState(false); - const [status, setStatus] = useState(jobline.status); - const [updateJob] = useMutation(UPDATE_JOB_LINE); - const { t } = useTranslation(); +export function JobLineStatusPopup({bodyshop, jobline, disabled}) { + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(false); + const [status, setStatus] = useState(jobline.status); + const [updateJob] = useMutation(UPDATE_JOB_LINE); + const {t} = useTranslation(); - useEffect(() => { - if (editing) setStatus(jobline.status); - }, [editing, jobline.status]); + useEffect(() => { + if (editing) setStatus(jobline.status); + }, [editing, jobline.status]); - const handleChange = (e) => { - setStatus(e); - }; + const handleChange = (e) => { + setStatus(e); + }; - const handleSave = async (e) => { - setLoading(true); - const result = await updateJob({ - variables: { lineId: jobline.id, line: { status: status || "" } }, - }); + const handleSave = async (e) => { + setLoading(true); + const result = await updateJob({ + variables: {lineId: jobline.id, line: {status: status || ""}}, + }); - if (!!!result.errors) { - notification["success"]({ message: t("joblines.successes.saved") }); - } else { - notification["error"]({ - message: t("joblines.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - setEditing(false); - }; + if (!!!result.errors) { + notification["success"]({message: t("joblines.successes.saved")}); + } else { + notification["error"]({ + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + setEditing(false); + }; - if (editing) + if (editing) + return ( +
+ + + +
+ ); return ( -
- - - -
+
!disabled && setEditing(true)} + > + {jobline.status} +
); - return ( -
!disabled && setEditing(true)} - > - {jobline.status} -
- ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobLineStatusPopup); diff --git a/client/src/components/job-line-team-assignment/job-line-team-assignmnent.component.jsx b/client/src/components/job-line-team-assignment/job-line-team-assignmnent.component.jsx index a83ec62cb..32ca763c6 100644 --- a/client/src/components/job-line-team-assignment/job-line-team-assignmnent.component.jsx +++ b/client/src/components/job-line-team-assignment/job-line-team-assignmnent.component.jsx @@ -1,115 +1,116 @@ -import { notification, Select } from "antd"; -import React, { useEffect, useState } from "react"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {notification, Select} from "antd"; +import React, {useEffect, useState} from "react"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_LINE} from "../../graphql/jobs-lines.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function JoblineTeamAssignment({ - bodyshop, - jobline, - disabled, - jobId, - insertAuditTrail, -}) { - const [editing, setEditing] = useState(false); - const [loading, setLoading] = useState(false); - const [assignedTeam, setAssignedTeam] = useState(jobline.assigned_team); - const [updateJob] = useMutation(UPDATE_JOB_LINE); - const { t } = useTranslation(); + bodyshop, + jobline, + disabled, + jobId, + insertAuditTrail, + }) { + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(false); + const [assignedTeam, setAssignedTeam] = useState(jobline.assigned_team); + const [updateJob] = useMutation(UPDATE_JOB_LINE); + const {t} = useTranslation(); - useEffect(() => { - if (editing) setAssignedTeam(jobline.assigned_team); - }, [editing, jobline.assigned_team]); + useEffect(() => { + if (editing) setAssignedTeam(jobline.assigned_team); + }, [editing, jobline.assigned_team]); - const handleChange = (e) => { - setAssignedTeam(e); - }; + const handleChange = (e) => { + setAssignedTeam(e); + }; - const handleSave = async (e) => { - setLoading(true); - const result = await updateJob({ - variables: { - lineId: jobline.id, - line: { assigned_team: assignedTeam }, - }, - }); + const handleSave = async (e) => { + setLoading(true); + const result = await updateJob({ + variables: { + lineId: jobline.id, + line: {assigned_team: assignedTeam}, + }, + }); - if (!!!result.errors) { - notification["success"]({ message: t("joblines.successes.saved") }); - //insert the audit trail here. - const teamName = bodyshop.employee_teams.find( - (et) => et.id === assignedTeam - )?.name; - insertAuditTrail({ - jobid: jobId, - operation: AuditTrailMapping.assignedlinehours( - teamName, - jobline.mod_lb_hrs - ), - }); - } else { - notification["error"]({ - message: t("joblines.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - setEditing(false); - }; + if (!!!result.errors) { + notification["success"]({message: t("joblines.successes.saved")}); + //insert the audit trail here. + const teamName = bodyshop.employee_teams.find( + (et) => et.id === assignedTeam + )?.name; + insertAuditTrail({ + jobid: jobId, + operation: AuditTrailMapping.assignedlinehours( + teamName, + jobline.mod_lb_hrs + ), + }); + } else { + notification["error"]({ + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + setEditing(false); + }; - if (editing) - return ( -
- - - -
+ if (editing) + return ( +
+ + + +
+ ); + + const team = bodyshop.employee_teams.find( + (tm) => tm.id === jobline.assigned_team ); - const team = bodyshop.employee_teams.find( - (tm) => tm.id === jobline.assigned_team - ); - - return ( -
!disabled && setEditing(true)} - > - {team?.name} -
- ); + return ( +
!disabled && setEditing(true)} + > + {team?.name} +
+ ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JoblineTeamAssignment); diff --git a/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx b/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx index e3b2ea5ae..df4e4fdcc 100644 --- a/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx +++ b/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx @@ -1,16 +1,17 @@ import React from "react"; -import { WarningFilled } from "@ant-design/icons"; -export default function JobLinesBillRefernece({ jobline }) { - const billLine = jobline.billlines && jobline.billlines[0]; +import {WarningFilled} from "@ant-design/icons"; - if (!billLine) return null; - const subletRequired = billLine.actual_price !== jobline.act_price; - return ( -
- {subletRequired && } - {`${billLine.actual_price.toFixed(2)} x ${billLine.quantity} (${ - billLine.bill.vendor.name - } #${billLine.bill.invoice_number})`} -
- ); +export default function JobLinesBillRefernece({jobline}) { + const billLine = jobline.billlines && jobline.billlines[0]; + + if (!billLine) return null; + const subletRequired = billLine.actual_price !== jobline.act_price; + return ( +
+ {subletRequired && } + {`${billLine.actual_price.toFixed(2)} x ${billLine.quantity} (${ + billLine.bill.vendor.name + } #${billLine.bill.invoice_number})`} +
+ ); } diff --git a/client/src/components/job-lines-preset-button/job-lines-preset-button.component.jsx b/client/src/components/job-lines-preset-button/job-lines-preset-button.component.jsx index f805ece5a..4472e434f 100644 --- a/client/src/components/job-lines-preset-button/job-lines-preset-button.component.jsx +++ b/client/src/components/job-lines-preset-button/job-lines-preset-button.component.jsx @@ -1,63 +1,58 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Dropdown, Menu } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Dropdown} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JoblinePresetButton({ bodyshop, form }) { - const { t } = useTranslation(); +export function JoblinePresetButton({bodyshop, form}) { + const {t} = useTranslation(); - const handleSelect = (item) => { - form.setFieldsValue(item); - }; + const handleSelect = (item) => { + form.setFieldsValue(item); + }; - const menu = ( - - {bodyshop.md_jobline_presets.map((i, idx) => ( - handleSelect(i)} - key={idx} - style={{ breakInside: "avoid" }} - > - {i.label} - - ))} - - ); - return ( - - ); + const menu = { + items: bodyshop.md_jobline_presets.map((i, idx) => ({ + key: idx, + label: i.label, + style: {breakInside: "avoid"}, + onClick: () => handleSelect(i), + })), + style: { + columnCount: Math.max( + Math.floor(bodyshop.md_jobline_presets.length / 15), + 1 + ), + }, + } + + return ( + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JoblinePresetButton); diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx index fdf5207db..3f62ade7e 100644 --- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx +++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx @@ -1,306 +1,303 @@ -import { Form, Input, InputNumber, Modal, Select, Switch } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; +import {Form, Input, InputNumber, Modal, Select, Switch} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import InputCurrency from "../form-items-formatted/currency-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import JoblinesPreset from "../job-lines-preset-button/job-lines-preset-button.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobLinesUpsertModalComponent); export function JobLinesUpsertModalComponent({ - bodyshop, - visible, - jobLine, - handleCancel, - handleFinish, - loading, -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); + bodyshop, + open, + jobLine, + handleCancel, + handleFinish, + loading, + }) { + const {t} = useTranslation(); + const [form] = Form.useForm(); - useEffect(() => { - form.resetFields(); - }, [visible, form]); + useEffect(() => { + form.resetFields(); + }, [open, form]); - const { Allow_Negative_Jobline_Price } = useTreatments( - ["Allow_Negative_Jobline_Price"], - {}, - bodyshop.imexshopid - ); - const { Autohouse_Detail_line } = useTreatments( - ["Autohouse_Detail_line"], - {}, - bodyshop.imexshopid - ); - return ( - form.submit()} - okButtonProps={{ loading: loading }} - onCancel={handleCancel} - e - > -
- - - - - - - - - - - - - - - - - ({ - validator(rule, value) { - if ( - !!getFieldValue("mod_lbr_ty") === (!!value || value === 0) - ) { - return Promise.resolve(); - } - return Promise.reject( - t("joblines.validations.hrsrequirediflbrtyp") - ); - }, - }), - ]} - > - - - {Autohouse_Detail_line.treatment === "on" && ( - ({ - validator(rule, value) { - if ( - value === false || - value === undefined || - value === null - ) - return Promise.resolve(); - if ( - value === true && - ["LA1", "LA2", "LA3", "LA4", "LAU"].includes( - getFieldValue("mod_lbr_ty") - ) - ) { - return Promise.resolve(); - } - return Promise.reject( - t("joblines.validations.ahdetailonlyonuserdefinedtypes") - ); - }, - }), - ]} + const {treatments: {Allow_Negative_Jobline_Price, Autohouse_Detail_line}} = useSplitTreatments({ + attributes: {}, + names: ["Allow_Negative_Jobline_Price", "Autohouse_Detail_line"], + splitKey: bodyshop.imexshopid, + }); + + return ( + form.submit()} + okButtonProps={{loading: loading}} + onCancel={handleCancel} + e + > + - - - )} - - - - - - - - - ({ - validator(rule, value) { - if (!!getFieldValue("part_type") === !!value) { - return Promise.resolve(); - } - return Promise.reject( - t("joblines.validations.requiredifparttype") - ); - }, - }), - ]} - > - - - {/* + + + + + + + + + + + + + + + + + ({ + validator(rule, value) { + if ( + !!getFieldValue("mod_lbr_ty") === (!!value || value === 0) + ) { + return Promise.resolve(); + } + return Promise.reject( + t("joblines.validations.hrsrequirediflbrtyp") + ); + }, + }), + ]} + > + + + {Autohouse_Detail_line.treatment === "on" && ( + ({ + validator(rule, value) { + if ( + value === false || + value === undefined || + value === null + ) + return Promise.resolve(); + if ( + value === true && + ["LA1", "LA2", "LA3", "LA4", "LAU"].includes( + getFieldValue("mod_lbr_ty") + ) + ) { + return Promise.resolve(); + } + return Promise.reject( + t("joblines.validations.ahdetailonlyonuserdefinedtypes") + ); + }, + }), + ]} + > + + + )} + + + + + + + + + ({ + validator(rule, value) { + if (!!getFieldValue("part_type") === !!value) { + return Promise.resolve(); + } + return Promise.reject( + t("joblines.validations.requiredifparttype") + ); + }, + }), + ]} + > + + + {/* */} - ({ - validator(rule, value) { - if (!value || getFieldValue("part_type") !== "PAE") { - return Promise.resolve(); - } - return Promise.reject( - t("joblines.validations.zeropriceexistingpart") - ); - }, - }), - ({ getFieldValue }) => ({ - validator(rule, value) { - if ( - !!getFieldValue("part_type") === (!!value || value === 0) - ) { - return Promise.resolve(); - } - return Promise.reject( - t("joblines.validations.requiredifparttype") - ); - }, - }), - ]} - > - - - - - - - - - - -
- ); + ({ + validator(rule, value) { + if (!value || getFieldValue("part_type") !== "PAE") { + return Promise.resolve(); + } + return Promise.reject( + t("joblines.validations.zeropriceexistingpart") + ); + }, + }), + ({getFieldValue}) => ({ + validator(rule, value) { + if ( + !!getFieldValue("part_type") === (!!value || value === 0) + ) { + return Promise.resolve(); + } + return Promise.reject( + t("joblines.validations.requiredifparttype") + ); + }, + }), + ]} + > + + + + + + + + + + + + ); } diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx index 7c55046b9..e307c9e13 100644 --- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx +++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx @@ -1,146 +1,146 @@ -import { useMutation } from "@apollo/client"; -import { notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - INSERT_NEW_JOB_LINE, - UPDATE_JOB_LINE, -} from "../../graphql/jobs-lines.queries"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectJobLineEditModal } from "../../redux/modals/modals.selectors"; +import {useMutation} from "@apollo/client"; +import {notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_NEW_JOB_LINE, UPDATE_JOB_LINE,} from "../../graphql/jobs-lines.queries"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectJobLineEditModal} from "../../redux/modals/modals.selectors"; import UndefinedToNull from "../../utils/undefinedtonull"; import JobLinesUpdsertModal from "./job-lines-upsert-modal.component"; import Axios from "axios"; import Dinero from "dinero.js"; import CriticalPartsScan from "../../utils/criticalPartsScan"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; + const mapStateToProps = createStructuredSelector({ - jobLineEditModal: selectJobLineEditModal, - bodyshop: selectBodyshop, + jobLineEditModal: selectJobLineEditModal, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("jobLineEdit")), + toggleModalVisible: () => dispatch(toggleModalVisible("jobLineEdit")), }); function JobLinesUpsertModalContainer({ - jobLineEditModal, - toggleModalVisible, - bodyshop, -}) { - const { CriticalPartsScanning } = useTreatments( - ["CriticalPartsScanning"], - {}, - bodyshop.imexshopid - ); - const { t } = useTranslation(); - const [insertJobLine] = useMutation(INSERT_NEW_JOB_LINE); - const [updateJobLine] = useMutation(UPDATE_JOB_LINE); - const [loading, setLoading] = useState(false); + jobLineEditModal, + toggleModalVisible, + bodyshop, + }) { - const handleFinish = async (values) => { - setLoading(true); - if (!jobLineEditModal.context.id) { - const r = await insertJobLine({ - variables: { - lineInput: [ - { - jobid: jobLineEditModal.context.jobid, - manual_line: !( - jobLineEditModal.context && jobLineEditModal.context.id - ), - ...UndefinedToNull({ - ...values, - prt_dsmk_m: Dinero({ - amount: Math.round((values.act_price || 0) * 100), - }) - .percentage(Math.abs(values.prt_dsmk_p || 0)) - .multiply(values.prt_dsmk_p >= 0 ? 1 : -1) - .toFormat(0.0), - }), - }, - ], - }, - refetchQueries: ["GET_LINE_TICKET_BY_PK"], - }); - if (!r.errors) { - await Axios.post("/job/totalsssu", { - id: jobLineEditModal.context.jobid, - }); - if (jobLineEditModal.actions.refetch) - jobLineEditModal.actions.refetch(); - //Need to recalcuate totals. + const {treatments: {CriticalPartsScanning}} = useSplitTreatments({ + attributes: {}, + names: ['CriticalPartsScanning'], + splitKey: bodyshop.imexshopid, + }); + + const {t} = useTranslation(); + const [insertJobLine] = useMutation(INSERT_NEW_JOB_LINE); + const [updateJobLine] = useMutation(UPDATE_JOB_LINE); + const [loading, setLoading] = useState(false); + + const handleFinish = async (values) => { + setLoading(true); + if (!jobLineEditModal.context.id) { + const r = await insertJobLine({ + variables: { + lineInput: [ + { + jobid: jobLineEditModal.context.jobid, + manual_line: !( + jobLineEditModal.context && jobLineEditModal.context.id + ), + ...UndefinedToNull({ + ...values, + prt_dsmk_m: Dinero({ + amount: Math.round((values.act_price || 0) * 100), + }) + .percentage(Math.abs(values.prt_dsmk_p || 0)) + .multiply(values.prt_dsmk_p >= 0 ? 1 : -1) + .toFormat(0.0), + }), + }, + ], + }, + refetchQueries: ["GET_LINE_TICKET_BY_PK"], + }); + if (!r.errors) { + await Axios.post("/job/totalsssu", { + id: jobLineEditModal.context.jobid, + }); + if (jobLineEditModal.actions.refetch) + jobLineEditModal.actions.refetch(); + //Need to recalcuate totals. + toggleModalVisible(); + notification["success"]({ + message: t("joblines.successes.created"), + }); + } else { + notification["error"]({ + message: t("joblines.errors.creating", { + message: JSON.stringify(r.errors.message), + }), + }); + } + } else { + const r = await updateJobLine({ + variables: { + lineId: jobLineEditModal.context.id, + line: { + ...values, + prt_dsmk_m: Dinero({ + amount: Math.round(values.act_price * 100), + }) + .percentage(Math.abs(values.prt_dsmk_p || 0)) + .multiply(values.prt_dsmk_p >= 0 ? 1 : -1) + .toFormat(0.0), + }, + }, + refetchQueries: ["GET_LINE_TICKET_BY_PK"], + }); + if (!r.errors) { + notification["success"]({ + message: t("joblines.successes.updated"), + }); + } else { + notification["success"]({ + message: t("joblines.errors.updating", { + message: JSON.stringify(r.errors.message), + }), + }); + } + + if (jobLineEditModal.actions.submit) { + jobLineEditModal.actions.submit(); + } else { + if (jobLineEditModal.actions.refetch) + jobLineEditModal.actions.refetch(); + } + toggleModalVisible(); + } + if (CriticalPartsScanning.treatment === "on") { + CriticalPartsScan(jobLineEditModal.context.jobid); + } + setLoading(false); + }; + + const handleCancel = () => { toggleModalVisible(); - notification["success"]({ - message: t("joblines.successes.created"), - }); - } else { - notification["error"]({ - message: t("joblines.errors.creating", { - message: JSON.stringify(r.errors.message), - }), - }); - } - } else { - const r = await updateJobLine({ - variables: { - lineId: jobLineEditModal.context.id, - line: { - ...values, - prt_dsmk_m: Dinero({ - amount: Math.round(values.act_price * 100), - }) - .percentage(Math.abs(values.prt_dsmk_p || 0)) - .multiply(values.prt_dsmk_p >= 0 ? 1 : -1) - .toFormat(0.0), - }, - }, - refetchQueries: ["GET_LINE_TICKET_BY_PK"], - }); - if (!r.errors) { - notification["success"]({ - message: t("joblines.successes.updated"), - }); - } else { - notification["success"]({ - message: t("joblines.errors.updating", { - message: JSON.stringify(r.errors.message), - }), - }); - } + }; - if (jobLineEditModal.actions.submit) { - jobLineEditModal.actions.submit(); - } else { - if (jobLineEditModal.actions.refetch) - jobLineEditModal.actions.refetch(); - } - toggleModalVisible(); - } - if (CriticalPartsScanning.treatment === "on") { - CriticalPartsScan(jobLineEditModal.context.jobid); - } - setLoading(false); - }; - - const handleCancel = () => { - toggleModalVisible(); - }; - - return ( - - ); + return ( + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobLinesUpsertModalContainer); diff --git a/client/src/components/job-parts-queue-count/job-parts-queue-count.component.jsx b/client/src/components/job-parts-queue-count/job-parts-queue-count.component.jsx index fe394f301..d9b7744f0 100644 --- a/client/src/components/job-parts-queue-count/job-parts-queue-count.component.jsx +++ b/client/src/components/job-parts-queue-count/job-parts-queue-count.component.jsx @@ -1,80 +1,81 @@ -import React, { useMemo } from "react"; -import { Row, Col, Tag, Tooltip } from "antd"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useMemo} from "react"; +import {Col, Row, Tag, Tooltip} from "antd"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobPartsQueueCount); -export function JobPartsQueueCount({ bodyshop, parts, style }) { - const partsStatus = useMemo(() => { +export function JobPartsQueueCount({bodyshop, parts, style}) { + const partsStatus = useMemo(() => { + if (!parts) return null; + return parts.reduce( + (acc, val) => { + if (val.part_type === "PAS" || val.part_type === "PASL") return acc; + acc.total = acc.total + val.count; + acc[val.status] = acc[val.status] + val.count; + + return acc; + }, + { + total: 0, + null: 0, + [bodyshop.md_order_statuses.default_bo]: 0, + [bodyshop.md_order_statuses.default_ordered]: 0, + [bodyshop.md_order_statuses.default_received]: 0, + [bodyshop.md_order_statuses.default_returned]: 0, + } + ); + }, [bodyshop, parts]); + if (!parts) return null; - return parts.reduce( - (acc, val) => { - if (val.part_type === "PAS" || val.part_type === "PASL") return acc; - acc.total = acc.total + val.count; - acc[val.status] = acc[val.status] + val.count; - return acc; - }, - { - total: 0, - null: 0, - [bodyshop.md_order_statuses.default_bo]: 0, - [bodyshop.md_order_statuses.default_ordered]: 0, - [bodyshop.md_order_statuses.default_received]: 0, - [bodyshop.md_order_statuses.default_returned]: 0, - } + return ( + + + + {partsStatus.total} + + + + + {partsStatus["null"]} + + + + + + {partsStatus[bodyshop.md_order_statuses.default_ordered]} + + + + + + + {partsStatus[bodyshop.md_order_statuses.default_received]} + + + + + + + {partsStatus[bodyshop.md_order_statuses.default_returned]} + + + + + + + {partsStatus[bodyshop.md_order_statuses.default_bo]} + + + + ); - }, [bodyshop, parts]); - - if (!parts) return null; - - return ( - - - - {partsStatus.total} - - - - - {partsStatus["null"]} - - - - - - {partsStatus[bodyshop.md_order_statuses.default_ordered]} - - - - - - - {partsStatus[bodyshop.md_order_statuses.default_received]} - - - - - - - {partsStatus[bodyshop.md_order_statuses.default_returned]} - - - - - - - {partsStatus[bodyshop.md_order_statuses.default_bo]} - - - - - ); } diff --git a/client/src/components/job-payments/job-payments.component.jsx b/client/src/components/job-payments/job-payments.component.jsx index 85505059c..df67dc1b1 100644 --- a/client/src/components/job-payments/job-payments.component.jsx +++ b/client/src/components/job-payments/job-payments.component.jsx @@ -1,243 +1,242 @@ -import { EditFilled } from "@ant-design/icons"; -import { Button, Card, Space, Table } from "antd"; +import {EditFilled} from "@ant-design/icons"; +import {Button, Card, Space, Table} from "antd"; import Dinero from "dinero.js"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { - openChatByPhone, - setMessage, -} from "../../redux/messaging/messaging.actions"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {openChatByPhone, setMessage,} from "../../redux/messaging/messaging.actions"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter } from "../../utils/DateFormatter"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import {DateFormatter} from "../../utils/DateFormatter"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {alphaSort, dateSort} from "../../utils/sorters"; import DataLabel from "../data-label/data-label.component"; import PaymentExpandedRowComponent from "../payment-expanded-row/payment-expanded-row.component"; import PaymentsGenerateLink from "../payments-generate-link/payments-generate-link.component"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - setPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "payment" })), - setCardPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "cardPayment" })), - openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), - setMessage: (text) => dispatch(setMessage(text)), + setPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "payment"})), + setCardPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "cardPayment"})), + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), + setMessage: (text) => dispatch(setMessage(text)), }); export function JobPayments({ - job, - jobRO, - bodyshop, - setMessage, - openChatByPhone, - setPaymentContext, - setCardPaymentContext, - refetch, -}) { - const { ImEXPay } = useTreatments( - ["ImEXPay"], - {}, - bodyshop && bodyshop.imexshopid - ); + job, + jobRO, + bodyshop, + setMessage, + openChatByPhone, + setPaymentContext, + setCardPaymentContext, + refetch + }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: {}, - }); + const {treatments: {ImEXPay}} = useSplitTreatments({ + attributes: {}, + names: ["ImEXPay"], + splitKey: bodyshop && bodyshop.imexshopid, + }); - const columns = [ - { - title: t("payments.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => dateSort(a.date, b.date), + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {}, + }); - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("payments.fields.payer"), - dataIndex: "payer", - key: "payer", - sorter: (a, b) => alphaSort(a.payer, b.payer), - sortOrder: - state.sortedInfo.columnKey === "payer" && state.sortedInfo.order, - }, - { - title: t("payments.fields.amount"), - dataIndex: "amount", - key: "amount", - sorter: (a, b) => a.amount - b.amount, - sortOrder: - state.sortedInfo.columnKey === "amount" && state.sortedInfo.order, - render: (text, record) => ( - {record.amount} - ), - }, - { - title: t("payments.fields.memo"), - dataIndex: "memo", - key: "memo", - sorter: (a, b) => alphaSort(a.memo, b.memo), - sortOrder: - state.sortedInfo.columnKey === "memo" && state.sortedInfo.order, - }, - { - title: t("payments.fields.type"), - dataIndex: "type", - key: "type", - sorter: (a, b) => alphaSort(a.type, b.type), - sortOrder: - state.sortedInfo.columnKey === "type" && state.sortedInfo.order, - }, - { - title: t("payments.fields.transactionid"), - dataIndex: "transactionid", - key: "transactionid", - sorter: (a, b) => alphaSort(a.transactionid, b.transactionid), - sortOrder: - state.sortedInfo.columnKey === "transactionid" && - state.sortedInfo.order, - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - - - - ), - }, - ]; + const columns = [ + { + title: t("payments.fields.date"), + dataIndex: "date", + key: "date", + sorter: (a, b) => dateSort(a.date, b.date), + + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("payments.fields.payer"), + dataIndex: "payer", + key: "payer", + sorter: (a, b) => alphaSort(a.payer, b.payer), + sortOrder: + state.sortedInfo.columnKey === "payer" && state.sortedInfo.order, + }, + { + title: t("payments.fields.amount"), + dataIndex: "amount", + key: "amount", + sorter: (a, b) => a.amount - b.amount, + sortOrder: + state.sortedInfo.columnKey === "amount" && state.sortedInfo.order, + render: (text, record) => ( + {record.amount} + ), + }, + { + title: t("payments.fields.memo"), + dataIndex: "memo", + key: "memo", + sorter: (a, b) => alphaSort(a.memo, b.memo), + sortOrder: + state.sortedInfo.columnKey === "memo" && state.sortedInfo.order, + }, + { + title: t("payments.fields.type"), + dataIndex: "type", + key: "type", + sorter: (a, b) => alphaSort(a.type, b.type), + sortOrder: + state.sortedInfo.columnKey === "type" && state.sortedInfo.order, + }, + { + title: t("payments.fields.transactionid"), + dataIndex: "transactionid", + key: "transactionid", + sorter: (a, b) => alphaSort(a.transactionid, b.transactionid), + sortOrder: + state.sortedInfo.columnKey === "transactionid" && + state.sortedInfo.order, + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + + + + ), + }, + ]; + + const total = useMemo(() => { + return ( + job.payments && + job.payments.reduce((acc, val) => { + acc = acc.add(Dinero({amount: Math.round(val.amount * 100)})); + return acc; + }, Dinero()) + ); + }, [job.payments]); + + const balance = useMemo(() => { + if (job && job.job_totals && job.job_totals.totals.total_repairs) + return Dinero(job.job_totals.totals.total_repairs).subtract(total); + return Dinero({amount: 0}).subtract(total); + }, [job, total]); + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const total = useMemo(() => { return ( - job.payments && - job.payments.reduce((acc, val) => { - acc = acc.add(Dinero({ amount: Math.round(val.amount * 100) })); - return acc; - }, Dinero()) - ); - }, [job.payments]); + + {ImEXPay.treatment === "on" && ( + <> + + + + )} + - const balance = useMemo(() => { - if (job && job.job_totals && job.job_totals.totals.total_repairs) - return Dinero(job.job_totals.totals.total_repairs).subtract(total); - return Dinero({ amount: 0 }).subtract(total); - }, [job, total]); - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - return ( - - {ImEXPay.treatment === "on" && ( - <> - - - - )} - - - - {balance.toFormat()} - - - } - > -
( - - ), - }} - summary={() => ( - <> - - - {t("payments.labels.totalpayments")} - - - - {total.toFormat()} - - - - - - - )} - /> - - ); + > +
( + + ), + }} + summary={() => ( + <> + + + {t("payments.labels.totalpayments")} + + + + {total.toFormat()} + + + + + + + )} + /> + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobPayments); diff --git a/client/src/components/job-profile-data-warning/job-profile-data-warning.component.jsx b/client/src/components/job-profile-data-warning/job-profile-data-warning.component.jsx index f0ba998fc..70213d6d8 100644 --- a/client/src/components/job-profile-data-warning/job-profile-data-warning.component.jsx +++ b/client/src/components/job-profile-data-warning/job-profile-data-warning.component.jsx @@ -1,18 +1,18 @@ -import { Alert } from "antd"; +import {Alert} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; -export default function JobProfileDataWarning({ job }) { - const { t } = useTranslation(); +export default function JobProfileDataWarning({job}) { + const {t} = useTranslation(); - let missingProfileInfo = - Object.keys(job.cieca_pft).length === 0 || - Object.keys(job.cieca_pfl).length === 0 || - Object.keys(job.materials).length === 0; + let missingProfileInfo = + Object.keys(job.cieca_pft).length === 0 || + Object.keys(job.cieca_pfl).length === 0 || + Object.keys(job.materials).length === 0; - if (missingProfileInfo) - return ( - - ); - return null; + if (missingProfileInfo) + return ( + + ); + return null; } diff --git a/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx b/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx index 5cbe83620..f796eb2ad 100644 --- a/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx +++ b/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx @@ -1,118 +1,118 @@ -import { Checkbox, Table, Typography } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Checkbox, Table, Typography} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {alphaSort} from "../../utils/sorters"; export default function JobReconciliationBillsTable({ - billLineState, - invoiceLineData, -}) { - const { t } = useTranslation(); + billLineState, + invoiceLineData, + }) { + const {t} = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); + const [state, setState] = useState({ + sortedInfo: {}, + }); - const [selectedLines, setSelectedLines] = billLineState; + const [selectedLines, setSelectedLines] = billLineState; - const columns = [ - { - title: t("billlines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - ellipsis: true, - width: "10rem", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - sortOrder: - state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, - }, - { - title: t("billlines.labels.from"), - dataIndex: "from", - key: "from", + const columns = [ + { + title: t("billlines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + ellipsis: true, + width: "10rem", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + }, + { + title: t("billlines.labels.from"), + dataIndex: "from", + key: "from", - ellipsis: true, - render: (text, record) => - `${record.bill.vendor && record.bill.vendor.name} / ${ - record.bill.invoice_number - }`, - }, - { - title: t("billlines.fields.actual_price"), - dataIndex: "actual_price", - key: "actual_price", - sorter: (a, b) => a.actual_price - b.actual_price, - width: "7rem", - sortOrder: - state.sortedInfo.columnKey === "actual_price" && state.sortedInfo.order, - render: (text, record) => ( - {record.actual_price} - ), - }, - { - title: t("billlines.fields.actual_cost"), - dataIndex: "actual_cost", - key: "actual_cost", - sorter: (a, b) => a.actual_cost - b.actual_cost, - width: "7rem", - sortOrder: - state.sortedInfo.columnKey === "actual_cost" && state.sortedInfo.order, - render: (text, record) => ( - {record.actual_cost} - ), - }, - { - title: t("joblines.fields.part_qty"), - dataIndex: "quantity", - key: "quantity", - sorter: (a, b) => a.quantity - b.quantity, - width: "4rem", - sortOrder: - state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, - }, - { - title: t("bills.fields.is_credit_memo_short"), - dataIndex: "is_credit_memo", - key: "is_credit_memo", - sorter: (a, b) => a.bill.is_credit_memo - b.bill.is_credit_memo, - width: "3rem", - sortOrder: - state.sortedInfo.columnKey === "is_credit_memo" && - state.sortedInfo.order, + ellipsis: true, + render: (text, record) => + `${record.bill.vendor && record.bill.vendor.name} / ${ + record.bill.invoice_number + }`, + }, + { + title: t("billlines.fields.actual_price"), + dataIndex: "actual_price", + key: "actual_price", + sorter: (a, b) => a.actual_price - b.actual_price, + width: "7rem", + sortOrder: + state.sortedInfo.columnKey === "actual_price" && state.sortedInfo.order, + render: (text, record) => ( + {record.actual_price} + ), + }, + { + title: t("billlines.fields.actual_cost"), + dataIndex: "actual_cost", + key: "actual_cost", + sorter: (a, b) => a.actual_cost - b.actual_cost, + width: "7rem", + sortOrder: + state.sortedInfo.columnKey === "actual_cost" && state.sortedInfo.order, + render: (text, record) => ( + {record.actual_cost} + ), + }, + { + title: t("joblines.fields.part_qty"), + dataIndex: "quantity", + key: "quantity", + sorter: (a, b) => a.quantity - b.quantity, + width: "4rem", + sortOrder: + state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, + }, + { + title: t("bills.fields.is_credit_memo_short"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.bill.is_credit_memo - b.bill.is_credit_memo, + width: "3rem", + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - ]; + render: (text, record) => ( + + ), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - const handleOnRowClick = (selectedRecordKeys, selectedRecords) => { - setSelectedLines(selectedRecordKeys); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + const handleOnRowClick = (selectedRecordKeys, selectedRecords) => { + setSelectedLines(selectedRecordKeys); + }; - return ( -
- {t("bills.labels.bills")} -
{ - return { disabled: record.deductedfromlbr }; - }, - }} - /> - - ); + return ( +
+ {t("bills.labels.bills")} +
{ + return {disabled: record.deductedfromlbr}; + }, + }} + /> + + ); } diff --git a/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx index 0a2f970a3..923509221 100644 --- a/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx +++ b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx @@ -1,58 +1,58 @@ -import { Col, Row } from "antd"; -import React, { useState } from "react"; +import {Col, Row} from "antd"; +import React, {useState} from "react"; import JobReconciliationBillsTable from "../job-reconciliation-bills-table/job-reconciliation-bills-table.component"; import JobReconciliationPartsTable from "../job-reconciliation-parts-table/job-reconciliation-parts-table.component"; import JobReconciliationTotals from "../job-reconciliation-totals/job-reconciliation-totals.component"; -export default function JobReconciliationModalComponent({ job, bills }) { - const jobLineState = useState([]); - const billLineState = useState([]); +export default function JobReconciliationModalComponent({job, bills}) { + const jobLineState = useState([]); + const billLineState = useState([]); - const invoiceLineData = - bills - .map((i) => - i.billlines.map((il) => { - return { ...il, bill: i }; - }) - ) - .flat() || []; + const invoiceLineData = + bills + .map((i) => + i.billlines.map((il) => { + return {...il, bill: i}; + }) + ) + .flat() || []; - const jobLineData = job.joblines.filter( - (j) => - (j.part_type !== "PAE" && j.act_price !== 0 && j.part_qty !== 0) || - j.misc_amt !== 0 || - (j.line_desc && - j.line_desc.toLowerCase().includes("towing") && - j.lbr_op === "OP13") || - j.db_ref === "936004" //ADD SHIPPING LINE. - ); + const jobLineData = job.joblines.filter( + (j) => + (j.part_type !== "PAE" && j.act_price !== 0 && j.part_qty !== 0) || + j.misc_amt !== 0 || + (j.line_desc && + j.line_desc.toLowerCase().includes("towing") && + j.lbr_op === "OP13") || + j.db_ref === "936004" //ADD SHIPPING LINE. + ); - return ( -
-
- -
- - - - - - - - - - - - ); + return ( +
+
+ +
+ + + + + + + + + + + + ); } diff --git a/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx b/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx index eb615800c..25fcc5e86 100644 --- a/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx +++ b/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx @@ -1,68 +1,68 @@ -import { useQuery } from "@apollo/client"; -import { Modal } from "antd"; +import {useQuery} from "@apollo/client"; +import {Modal} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { GET_JOB_RECONCILIATION_BY_PK } from "../../graphql/jobs.queries"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectReconciliation } from "../../redux/modals/modals.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {GET_JOB_RECONCILIATION_BY_PK} from "../../graphql/jobs.queries"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectReconciliation} from "../../redux/modals/modals.selectors"; import JobReconciliationModalComponent from "./job-reconciliation-modal.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import AlertComponent from "../alert/alert.component"; import "./job-reconciliation-modal.styles.scss"; const mapStateToProps = createStructuredSelector({ - reconciliationModal: selectReconciliation, + reconciliationModal: selectReconciliation, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("reconciliation")), + toggleModalVisible: () => dispatch(toggleModalVisible("reconciliation")), }); function JobReconciliationModalContainer({ - reconciliationModal, - toggleModalVisible, -}) { - const { t } = useTranslation(); - const { context, visible } = reconciliationModal; - const { job } = context; + reconciliationModal, + toggleModalVisible, + }) { + const {t} = useTranslation(); + const {context, open} = reconciliationModal; + const {job} = context; - const { loading, error, data } = useQuery(GET_JOB_RECONCILIATION_BY_PK, { - variables: { id: job && job.id }, - skip: !(job && job.id) || !visible, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data} = useQuery(GET_JOB_RECONCILIATION_BY_PK, { + variables: {id: job && job.id}, + skip: !(job && job.id) || !open, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const handleCancel = () => { - toggleModalVisible(); - }; + const handleCancel = () => { + toggleModalVisible(); + }; - return ( - - {loading && } - {error && } - {data && ( - - )} - - ); + return ( + + {loading && } + {error && } + {data && ( + + )} + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobReconciliationModalContainer); diff --git a/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx b/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx index 92922aeba..ec394d77e 100644 --- a/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx +++ b/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx @@ -1,134 +1,134 @@ -import { Table, Typography } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Table, Typography} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {alphaSort} from "../../utils/sorters"; import "./job-reconciliation-parts-table.styles.scss"; export default function JobReconcilitionPartsTable({ - jobLineState, - jobLineData, -}) { - const { t } = useTranslation(); + jobLineState, + jobLineData, + }) { + const {t} = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); + const [state, setState] = useState({ + sortedInfo: {}, + }); - const [selectedLines, setSelectedLines] = jobLineState; + const [selectedLines, setSelectedLines] = jobLineState; - const columns = [ - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - ellipses: true, - sortOrder: - state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, - }, - // { - // title: t("joblines.fields.oem_partno"), - // dataIndex: "oem_partno", - // key: "oem_partno", - // sorter: (a, b) => - // alphaSort( - // a.oem_partno ? a.oem_partno : a.op_code_desc, - // b.oem_partno ? b.oem_partno : b.op_code_desc - // ), - // sortOrder: - // state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, + const columns = [ + { + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + ellipses: true, + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + }, + // { + // title: t("joblines.fields.oem_partno"), + // dataIndex: "oem_partno", + // key: "oem_partno", + // sorter: (a, b) => + // alphaSort( + // a.oem_partno ? a.oem_partno : a.op_code_desc, + // b.oem_partno ? b.oem_partno : b.op_code_desc + // ), + // sortOrder: + // state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, - // render: (text, record) => ( - // - // {record.oem_partno ? record.oem_partno : record.op_code_desc} - // - // ), - // }, - // { - // title: t("joblines.fields.part_type"), - // dataIndex: "part_type", - // key: "part_type", - // sorter: (a, b) => alphaSort(a.part_type, b.part_type), - // sortOrder: - // state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order, - // }, - { - title: t("joblines.fields.act_price"), - dataIndex: "act_price", - key: "act_price", - sorter: (a, b) => a.act_price - b.act_price, - width: "7rem", - sortOrder: - state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, + // render: (text, record) => ( + // + // {record.oem_partno ? record.oem_partno : record.op_code_desc} + // + // ), + // }, + // { + // title: t("joblines.fields.part_type"), + // dataIndex: "part_type", + // key: "part_type", + // sorter: (a, b) => alphaSort(a.part_type, b.part_type), + // sortOrder: + // state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order, + // }, + { + title: t("joblines.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + sorter: (a, b) => a.act_price - b.act_price, + width: "7rem", + sortOrder: + state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, - render: (text, record) => ( - {record.act_price} - ), - }, - { - title: t("joblines.fields.part_qty"), - dataIndex: "part_qty", - key: "part_qty", - width: "4rem", - }, - { - title: t("joblines.fields.total"), - dataIndex: "total", - width: "7rem", - key: "total", - sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => ( + {record.act_price} + ), + }, + { + title: t("joblines.fields.part_qty"), + dataIndex: "part_qty", + key: "part_qty", + width: "4rem", + }, + { + title: t("joblines.fields.total"), + dataIndex: "total", + width: "7rem", + key: "total", + sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => ( - - {record.act_price * record.part_qty} - - ), - }, + render: (text, record) => ( + + {record.act_price * record.part_qty} + + ), + }, - { - title: t("joblines.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - width: "6rem", - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - }, - ]; + { + title: t("joblines.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + width: "6rem", + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - const handleOnRowClick = (selectedRecordKeys, selectedRecords) => { - setSelectedLines(selectedRecordKeys); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + const handleOnRowClick = (selectedRecordKeys, selectedRecords) => { + setSelectedLines(selectedRecordKeys); + }; - return ( -
- {t("jobs.labels.lines")} -
({ - disabled: record.removed, - }), - selectedRowKeys: selectedLines, - }} - rowClassName={(record) => record.removed && "text-strikethrough"} - /> -
- {t("jobs.labels.reconciliation.removedpartsstrikethrough")} -
- - ); + return ( +
+ {t("jobs.labels.lines")} +
({ + disabled: record.removed, + }), + selectedRowKeys: selectedLines, + }} + rowClassName={(record) => record.removed && "text-strikethrough"} + /> +
+ {t("jobs.labels.reconciliation.removedpartsstrikethrough")} +
+ + ); } diff --git a/client/src/components/job-reconciliation-totals/job-reconciliation-totals.component.jsx b/client/src/components/job-reconciliation-totals/job-reconciliation-totals.component.jsx index 11330c5b9..1a6aeabfe 100644 --- a/client/src/components/job-reconciliation-totals/job-reconciliation-totals.component.jsx +++ b/client/src/components/job-reconciliation-totals/job-reconciliation-totals.component.jsx @@ -1,121 +1,118 @@ -import { Button, Space, Statistic } from "antd"; +import {Button, Space, Statistic} from "antd"; import Dinero from "dinero.js"; import _ from "lodash"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { - reconcileByAssocLine, - reconcileByPrice, -} from "./job-reconciliation-totals.utility"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {reconcileByAssocLine, reconcileByPrice,} from "./job-reconciliation-totals.utility"; export default function JobReconciliationTotals({ - billLines, - jobLines, - jobLineState, - billLineState, -}) { - const [errors, setErrors] = useState([]); - const { t } = useTranslation(); - const selectedBillLines = billLineState[0]; - const selectedJobLines = jobLineState[0]; + billLines, + jobLines, + jobLineState, + billLineState, + }) { + const [errors, setErrors] = useState([]); + const {t} = useTranslation(); + const selectedBillLines = billLineState[0]; + const selectedJobLines = jobLineState[0]; - const totals = useMemo(() => { - const jlLookup = _.keyBy(selectedJobLines, (i) => i); - const billLookup = _.keyBy(selectedBillLines, (i) => i); + const totals = useMemo(() => { + const jlLookup = _.keyBy(selectedJobLines, (i) => i); + const billLookup = _.keyBy(selectedBillLines, (i) => i); - return { - joblinesTotal: jobLines - .filter((jl) => !!jlLookup[jl.id]) - .reduce((acc, val) => { - return acc.add( - Dinero({ amount: Math.round((val.act_price || 0) * 100) }).multiply( - val.part_qty || 1 - ) - ); - }, Dinero()), - billLinesTotal: billLines - .filter((bl) => !!billLookup[bl.id]) - .reduce((acc, val) => { - return acc.add( - Dinero({ - amount: Math.round((val.actual_price || 0) * 100), - }) - .multiply(val.quantity || 1) - .multiply(val.bill.is_credit_memo ? -1 : 1) - ); - }, Dinero()), - }; - }, [billLines, jobLines, selectedBillLines, selectedJobLines]); + return { + joblinesTotal: jobLines + .filter((jl) => !!jlLookup[jl.id]) + .reduce((acc, val) => { + return acc.add( + Dinero({amount: Math.round((val.act_price || 0) * 100)}).multiply( + val.part_qty || 1 + ) + ); + }, Dinero()), + billLinesTotal: billLines + .filter((bl) => !!billLookup[bl.id]) + .reduce((acc, val) => { + return acc.add( + Dinero({ + amount: Math.round((val.actual_price || 0) * 100), + }) + .multiply(val.quantity || 1) + .multiply(val.bill.is_credit_memo ? -1 : 1) + ); + }, Dinero()), + }; + }, [billLines, jobLines, selectedBillLines, selectedJobLines]); - return ( -
-
- - - - - -
-
- - - - - -
- {errors.length > 0 && ( -
- {t("general.labels.errors")} -
    - {errors.map((error, idx) => ( -
  • {error}
  • - ))} -
+ return ( +
+
+ + + + + +
+
+ + + + + +
+ {errors.length > 0 && ( +
+ {t("general.labels.errors")} +
    + {errors.map((error, idx) => ( +
  • {error}
  • + ))} +
+
+ )}
- )} -
- ); + ); } diff --git a/client/src/components/job-reconciliation-totals/job-reconciliation-totals.utility.js b/client/src/components/job-reconciliation-totals/job-reconciliation-totals.utility.js index 6a6e1a0f6..129188996 100644 --- a/client/src/components/job-reconciliation-totals/job-reconciliation-totals.utility.js +++ b/client/src/components/job-reconciliation-totals/job-reconciliation-totals.utility.js @@ -2,111 +2,111 @@ import i18next from "i18next"; import _ from "lodash"; export const reconcileByAssocLine = ( - jobLines, - jobLineState, - billLines, - billLineState, - setErrors + jobLines, + jobLineState, + billLines, + billLineState, + setErrors ) => { - const [selectedBillLines, setSelectedBillLines] = billLineState; - const [selectedJobLines, setSelectedJobLines] = jobLineState; + const [selectedBillLines, setSelectedBillLines] = billLineState; + const [selectedJobLines, setSelectedJobLines] = jobLineState; - const allJoblinesFromBills = billLines - .filter((bl) => bl.joblineid && bl.jobline && !bl.jobline.removed) - .map((bl) => bl.joblineid); + const allJoblinesFromBills = billLines + .filter((bl) => bl.joblineid && bl.jobline && !bl.jobline.removed) + .map((bl) => bl.joblineid); - const duplicatedJobLinesbyInvoiceId = _.filter( - allJoblinesFromBills, - (val, i, iteratee) => _.includes(iteratee, val, i + 1) - ); + const duplicatedJobLinesbyInvoiceId = _.filter( + allJoblinesFromBills, + (val, i, iteratee) => _.includes(iteratee, val, i + 1) + ); - if (duplicatedJobLinesbyInvoiceId.length > 0) - setErrors((errors) => [ - ...errors, - ..._.uniqBy(duplicatedJobLinesbyInvoiceId).map((dupedId) => { - return i18next.t("jobs.labels.reconciliation.multiplebilllines", { - line_desc: jobLines.find((j) => j.id === dupedId)?.line_desc, - }); - }), - ]); + if (duplicatedJobLinesbyInvoiceId.length > 0) + setErrors((errors) => [ + ...errors, + ..._.uniqBy(duplicatedJobLinesbyInvoiceId).map((dupedId) => { + return i18next.t("jobs.labels.reconciliation.multiplebilllines", { + line_desc: jobLines.find((j) => j.id === dupedId)?.line_desc, + }); + }), + ]); - setSelectedBillLines( - _.union( - selectedBillLines, - billLines.filter((bl) => !!bl.joblineid).map((bl) => bl.id) - ) - ); + setSelectedBillLines( + _.union( + selectedBillLines, + billLines.filter((bl) => !!bl.joblineid).map((bl) => bl.id) + ) + ); - setSelectedJobLines( - _.union(selectedJobLines, _.uniqBy(allJoblinesFromBills)) - ); + setSelectedJobLines( + _.union(selectedJobLines, _.uniqBy(allJoblinesFromBills)) + ); }; export const reconcileByPrice = ( - jobLines, - jobLineState, - billLines, - billLineState, - setErrors + jobLines, + jobLineState, + billLines, + billLineState, + setErrors ) => { - const [selectedBillLines, setSelectedBillLines] = billLineState; - const [selectedJobLines, setSelectedJobLines] = jobLineState; + const [selectedBillLines, setSelectedBillLines] = billLineState; + const [selectedJobLines, setSelectedJobLines] = jobLineState; - const allActPricesFromJobs = jobLines.map((jl) => jl.act_price); - const duplicateActPrices = _.filter( - allActPricesFromJobs, - (val, i, iteratee) => _.includes(iteratee, val, i + 1) - ); + const allActPricesFromJobs = jobLines.map((jl) => jl.act_price); + const duplicateActPrices = _.filter( + allActPricesFromJobs, + (val, i, iteratee) => _.includes(iteratee, val, i + 1) + ); + + if (duplicateActPrices.length > 0) + setErrors((errors) => [ + ...errors, + ..._.uniqBy(duplicateActPrices).map((dupeAp) => + i18next.t("jobs.labels.reconciliation.multipleactprices", { + act_price: dupeAp, + }) + ), + ]); + + const foundJobLines = []; + var foundBillLines = []; + const actPricesWithMoreThan1MatchingBill = []; + + jobLines.forEach((jl) => { + const matchingBillLineIds = billLines + .filter( + (bl) => + bl.actual_price === jl.act_price && + bl.quantity === jl.part_qty && + !jl.removed + ) + .map((bl) => bl.id); + + if (matchingBillLineIds.length > 1) { + actPricesWithMoreThan1MatchingBill.push(jl.act_price); + } + + foundBillLines = [...foundBillLines, ...matchingBillLineIds]; + if (matchingBillLineIds.length > 0) { + foundJobLines.push(jl.id); + } + }); - if (duplicateActPrices.length > 0) setErrors((errors) => [ - ...errors, - ..._.uniqBy(duplicateActPrices).map((dupeAp) => - i18next.t("jobs.labels.reconciliation.multipleactprices", { - act_price: dupeAp, - }) - ), + ...errors, + ..._.uniqBy(duplicateActPrices).map((dupeAp) => + i18next.t("jobs.labels.reconciliation.multipleactprices", { + act_price: dupeAp, + }) + ), + ..._.uniqBy(actPricesWithMoreThan1MatchingBill).map((act_price) => + i18next.t("jobs.labels.reconciliation.multiplebillsforactprice", { + act_price: act_price, + }) + ), ]); - const foundJobLines = []; - var foundBillLines = []; - const actPricesWithMoreThan1MatchingBill = []; + setSelectedBillLines(_.union(selectedBillLines, _.uniqBy(foundBillLines))); - jobLines.forEach((jl) => { - const matchingBillLineIds = billLines - .filter( - (bl) => - bl.actual_price === jl.act_price && - bl.quantity === jl.part_qty && - !jl.removed - ) - .map((bl) => bl.id); - - if (matchingBillLineIds.length > 1) { - actPricesWithMoreThan1MatchingBill.push(jl.act_price); - } - - foundBillLines = [...foundBillLines, ...matchingBillLineIds]; - if (matchingBillLineIds.length > 0) { - foundJobLines.push(jl.id); - } - }); - - setErrors((errors) => [ - ...errors, - ..._.uniqBy(duplicateActPrices).map((dupeAp) => - i18next.t("jobs.labels.reconciliation.multipleactprices", { - act_price: dupeAp, - }) - ), - ..._.uniqBy(actPricesWithMoreThan1MatchingBill).map((act_price) => - i18next.t("jobs.labels.reconciliation.multiplebillsforactprice", { - act_price: act_price, - }) - ), - ]); - - setSelectedBillLines(_.union(selectedBillLines, _.uniqBy(foundBillLines))); - - setSelectedJobLines(_.union(selectedJobLines, _.uniqBy(foundJobLines))); + setSelectedJobLines(_.union(selectedJobLines, _.uniqBy(foundJobLines))); }; diff --git a/client/src/components/job-remove-from-parst-queue/job-remove-from-parts-queue.component.jsx b/client/src/components/job-remove-from-parst-queue/job-remove-from-parts-queue.component.jsx index a0c95fad8..f7dd7b00b 100644 --- a/client/src/components/job-remove-from-parst-queue/job-remove-from-parts-queue.component.jsx +++ b/client/src/components/job-remove-from-parst-queue/job-remove-from-parts-queue.component.jsx @@ -1,37 +1,37 @@ -import { useMutation } from "@apollo/client"; -import { Checkbox, notification, Space, Spin } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {Checkbox, notification, Space, Spin} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; -export default function JobRemoveFromPartsQueue({ checked, jobId }) { - const [updateJob] = useMutation(UPDATE_JOB); - const { t } = useTranslation(); +export default function JobRemoveFromPartsQueue({checked, jobId}) { + const [updateJob] = useMutation(UPDATE_JOB); + const {t} = useTranslation(); - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(false); - const handleChange = async (e) => { - setLoading(true); - const result = await updateJob({ - variables: { jobId: jobId, job: { queued_for_parts: e.target.checked } }, - }); + const handleChange = async (e) => { + setLoading(true); + const result = await updateJob({ + variables: {jobId: jobId, job: {queued_for_parts: e.target.checked}}, + }); - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; - return ( - - - {loading && } - - ); + return ( + + + {loading && } + + ); } diff --git a/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx b/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx index 0e1343438..5287c3271 100644 --- a/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx +++ b/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx @@ -1,200 +1,192 @@ -import { useMutation, useLazyQuery } from "@apollo/client"; -import { CheckCircleOutlined } from "@ant-design/icons"; +import {useLazyQuery, useMutation} from "@apollo/client"; +import {CheckCircleOutlined} from "@ant-design/icons"; +import {Button, Card, Form, InputNumber, notification, Popover, Space,} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import { - Button, - Card, - Form, - InputNumber, - notification, - Popover, - Space, -} from "antd"; -import moment from "moment"; -import React, { useState, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - INSERT_SCOREBOARD_ENTRY, - QUERY_SCOREBOARD_ENTRY, - UPDATE_SCOREBOARD_ENTRY, + INSERT_SCOREBOARD_ENTRY, + QUERY_SCOREBOARD_ENTRY, + UPDATE_SCOREBOARD_ENTRY, } from "../../graphql/scoreboard.queries"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; export default function ScoreboardAddButton({ - job, - disabled, - ...otherBtnProps -}) { - const { t } = useTranslation(); - const [insertScoreboardEntry] = useMutation(INSERT_SCOREBOARD_ENTRY); - const [updateScoreboardEntry] = useMutation(UPDATE_SCOREBOARD_ENTRY); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [visibility, setVisibility] = useState(false); - const [callQuery, { loading: entryLoading, data: entryData }] = useLazyQuery( - QUERY_SCOREBOARD_ENTRY - ); - - useEffect(() => { - if (visibility) { - callQuery({ variables: { jobid: job.id } }); - } - }, [visibility, job.id, callQuery]); - - useEffect(() => { - if (entryData && entryData.scoreboard && entryData.scoreboard[0]) { - form.setFieldsValue(entryData.scoreboard[0]); - } - }, [entryData, form]); - - const handleFinish = async (values) => { - logImEXEvent("job_close_add_to_scoreboard"); - - setLoading(true); - let result; - - if (entryData && entryData.scoreboard && entryData.scoreboard[0]) { - result = await updateScoreboardEntry({ - variables: { - sbId: entryData.scoreboard[0].id, - sbInput: values, - }, - }); - } else { - result = await insertScoreboardEntry({ - variables: { sbInput: [{ jobid: job.id, ...values }] }, - }); - } - - if (!!result.errors) { - notification["error"]({ - message: t("scoreboard.errors.adding", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("scoreboard.successes.added"), - }); - } - setLoading(false); - setVisibility(false); - }; - - const overlay = ( - -
- {entryLoading ? ( - - ) : ( -
- - - - - - - - - - - - - - - - )} -
- {entryData && entryData.scoreboard && entryData.scoreboard[0] && ( - - - {t("jobs.labels.alreadyaddedtoscoreboard")} - - )} -
- ); - - const handleClick = (e) => { - setLoading(true); - const v = job.joblines.reduce( - (acc, val) => { - if (val.mod_lbr_ty !== "LAR") - acc = { ...acc, bodyhrs: acc.bodyhrs + val.mod_lb_hrs }; - if (val.mod_lbr_ty === "LAR") - acc = { ...acc, painthrs: acc.painthrs + val.mod_lb_hrs }; - return acc; - }, - { - bodyhrs: 0, - painthrs: 0, - } + job, + disabled, + ...otherBtnProps + }) { + const {t} = useTranslation(); + const [insertScoreboardEntry] = useMutation(INSERT_SCOREBOARD_ENTRY); + const [updateScoreboardEntry] = useMutation(UPDATE_SCOREBOARD_ENTRY); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [visibility, setVisibility] = useState(false); + const [callQuery, {loading: entryLoading, data: entryData}] = useLazyQuery( + QUERY_SCOREBOARD_ENTRY ); - //Add Labor Adjustments - v.painthrs = v.painthrs + (job.lbr_adjustments.LAR || 0); - v.bodyhrs = - v.bodyhrs + - Object.keys(job.lbr_adjustments) - .filter((key) => key !== "LAR") - .reduce((acc, val) => { - return acc + job.lbr_adjustments[val]; - }, 0); - form.setFieldsValue({ - date: new moment(), - bodyhrs: Math.round(v.bodyhrs * 10) / 10, - painthrs: Math.round(v.painthrs * 10) / 10, - }); - setVisibility(true); - setLoading(false); - }; + useEffect(() => { + if (visibility) { + callQuery({variables: {jobid: job.id}}); + } + }, [visibility, job.id, callQuery]); - return ( - - - - ); + useEffect(() => { + if (entryData && entryData.scoreboard && entryData.scoreboard[0]) { + form.setFieldsValue(entryData.scoreboard[0]); + } + }, [entryData, form]); + + const handleFinish = async (values) => { + logImEXEvent("job_close_add_to_scoreboard"); + + setLoading(true); + let result; + + if (entryData && entryData.scoreboard && entryData.scoreboard[0]) { + result = await updateScoreboardEntry({ + variables: { + sbId: entryData.scoreboard[0].id, + sbInput: values, + }, + }); + } else { + result = await insertScoreboardEntry({ + variables: {sbInput: [{jobid: job.id, ...values}]}, + }); + } + + if (!!result.errors) { + notification["error"]({ + message: t("scoreboard.errors.adding", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("scoreboard.successes.added"), + }); + } + setLoading(false); + setVisibility(false); + }; + + const overlay = ( + +
+ {entryLoading ? ( + + ) : ( +
+ + + + + + + + + + + + + + + + )} +
+ {entryData && entryData.scoreboard && entryData.scoreboard[0] && ( + + + {t("jobs.labels.alreadyaddedtoscoreboard")} + + )} +
+ ); + + const handleClick = (e) => { + setLoading(true); + const v = job.joblines.reduce( + (acc, val) => { + if (val.mod_lbr_ty !== "LAR") + acc = {...acc, bodyhrs: acc.bodyhrs + val.mod_lb_hrs}; + if (val.mod_lbr_ty === "LAR") + acc = {...acc, painthrs: acc.painthrs + val.mod_lb_hrs}; + return acc; + }, + { + bodyhrs: 0, + painthrs: 0, + } + ); + + //Add Labor Adjustments + v.painthrs = v.painthrs + (job.lbr_adjustments.LAR || 0); + v.bodyhrs = + v.bodyhrs + + Object.keys(job.lbr_adjustments) + .filter((key) => key !== "LAR") + .reduce((acc, val) => { + return acc + job.lbr_adjustments[val]; + }, 0); + form.setFieldsValue({ + date: new dayjs(), + bodyhrs: Math.round(v.bodyhrs * 10) / 10, + painthrs: Math.round(v.painthrs * 10) / 10, + }); + setVisibility(true); + setLoading(false); + }; + + return ( + + + + ); } diff --git a/client/src/components/job-search-select/job-search-select.component.jsx b/client/src/components/job-search-select/job-search-select.component.jsx index 0ec418bca..59f96d7a3 100644 --- a/client/src/components/job-search-select/job-search-select.component.jsx +++ b/client/src/components/job-search-select/job-search-select.component.jsx @@ -1,118 +1,116 @@ -import { useLazyQuery } from "@apollo/client"; -import { Select, Space, Tag } from "antd"; +import {useLazyQuery} from "@apollo/client"; +import {Select, Space, Tag} from "antd"; import _ from "lodash"; -import React, { forwardRef, useState, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { - SEARCH_JOBS_BY_ID_FOR_AUTOCOMPLETE, - SEARCH_JOBS_FOR_AUTOCOMPLETE, -} from "../../graphql/jobs.queries"; +import React, {forwardRef, useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {SEARCH_JOBS_BY_ID_FOR_AUTOCOMPLETE, SEARCH_JOBS_FOR_AUTOCOMPLETE,} from "../../graphql/jobs.queries"; import AlertComponent from "../alert/alert.component"; -import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; -const { Option } = Select; +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; + +const {Option} = Select; const JobSearchSelect = ( - { - disabled, - convertedOnly = false, - notInvoiced = false, - notExported = true, - clm_no = false, - ...restProps - }, - ref + { + disabled, + convertedOnly = false, + notInvoiced = false, + notExported = true, + clm_no = false, + ...restProps + }, + ref ) => { - const { t } = useTranslation(); - const [theOptions, setTheOptions] = useState([]); - const [callSearch, { loading, error, data }] = useLazyQuery( - SEARCH_JOBS_FOR_AUTOCOMPLETE, - {} - ); - - const [callIdSearch, { loading: idLoading, error: idError, data: idData }] = - useLazyQuery(SEARCH_JOBS_BY_ID_FOR_AUTOCOMPLETE); - - const executeSearch = (v) => { - console.log(v); - if (v && v.variables?.search !== "" && v.variables.search.length >= 2) - callSearch(v); - }; - const debouncedExecuteSearch = _.debounce(executeSearch, 500); - - const handleSearch = (value) => { - debouncedExecuteSearch({ - variables: { - search: value, - ...(convertedOnly || notExported - ? { - ...(convertedOnly ? { isConverted: true } : {}), - ...(notExported ? { notExported: true } : {}), - ...(notInvoiced ? { notInvoiced: true } : {}), - } - : {}), - }, - }); - }; - - useEffect(() => { - if (restProps.value) { - callIdSearch({ variables: { id: restProps.value } }); // Sometimes results in a no-op. Not sure how to fix. - } - }, [restProps.value, callIdSearch]); - - useEffect(() => { - setTheOptions( - _.uniqBy( - [ - ...(idData && idData.jobs_by_pk ? [idData.jobs_by_pk] : []), - ...(data && data.search_jobs ? data.search_jobs : []), - ], - "id" - ) + const {t} = useTranslation(); + const [theOptions, setTheOptions] = useState([]); + const [callSearch, {loading, error, data}] = useLazyQuery( + SEARCH_JOBS_FOR_AUTOCOMPLETE, + {} ); - }, [data, idData]); - return ( -
- : } + {...restProps} + > + {theOptions + ? theOptions.map((o) => ( + - )) - : null} - - {error ? : null} - {idError ? ( - - ) : null} -
- ); + + {o.status} + + + + )) + : null} + + {error ? : null} + {idError ? ( + + ) : null} +
+ ); }; export default forwardRef(JobSearchSelect); diff --git a/client/src/components/job-send-parts-price-change/job-send-parts-price-change.component.jsx b/client/src/components/job-send-parts-price-change/job-send-parts-price-change.component.jsx index 04609f98b..7f218520c 100644 --- a/client/src/components/job-send-parts-price-change/job-send-parts-price-change.component.jsx +++ b/client/src/components/job-send-parts-price-change/job-send-parts-price-change.component.jsx @@ -1,31 +1,31 @@ -import { Button, notification } from "antd"; +import {Button, notification} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; -export default function JobSendPartPriceChangeComponent({ job }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const handleClick = async () => { - setLoading(true); - try { - const ppcData = await axios.post("/job/ppc", { jobid: job.id }); - await axios.post("http://localhost:1337/ppc/", ppcData.data); - } catch (error) { - notification.open({ - type: "error", - message: t("jobs.errors.partspricechange", { - error: JSON.stringify(error), - }), - }); - } finally { - setLoading(false); - } - }; +export default function JobSendPartPriceChangeComponent({job}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const handleClick = async () => { + setLoading(true); + try { + const ppcData = await axios.post("/job/ppc", {jobid: job.id}); + await axios.post("http://localhost:1337/ppc/", ppcData.data); + } catch (error) { + notification.open({ + type: "error", + message: t("jobs.errors.partspricechange", { + error: JSON.stringify(error), + }), + }); + } finally { + setLoading(false); + } + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/job-sync-button/job-sync-button.component.jsx b/client/src/components/job-sync-button/job-sync-button.component.jsx index 042664c49..08c294b1f 100644 --- a/client/src/components/job-sync-button/job-sync-button.component.jsx +++ b/client/src/components/job-sync-button/job-sync-button.component.jsx @@ -1,23 +1,23 @@ -import { Button } from "antd"; +import {Button} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { SyncOutlined } from "@ant-design/icons"; -import { useHistory } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {SyncOutlined} from "@ant-design/icons"; +import {useNavigate} from "react-router-dom"; -export default function JobSyncButton({ job }) { - const { t } = useTranslation(); - const history = useHistory(); - const handleClick = () => { - history.push( - `/manage/available?availableJobId=${job.available_jobs[0].id}&clm_no=${job.clm_no}` - ); - }; - if (job && job.available_jobs && job.available_jobs.length > 0) - return ( - - ); - else return null; +export default function JobSyncButton({job}) { + const {t} = useTranslation(); + const history = useNavigate(); + const handleClick = () => { + history( + `/manage/available?availableJobId=${job.available_jobs[0].id}&clm_no=${job.clm_no}` + ); + }; + if (job && job.available_jobs && job.available_jobs.length > 0) + return ( + + ); + else return null; } diff --git a/client/src/components/job-totals-table/job-totals-table.component.jsx b/client/src/components/job-totals-table/job-totals-table.component.jsx index 49536ce22..f56322c75 100644 --- a/client/src/components/job-totals-table/job-totals-table.component.jsx +++ b/client/src/components/job-totals-table/job-totals-table.component.jsx @@ -1,12 +1,12 @@ -import { Card, Col, Collapse, Result, Row } from "antd"; +import {Card, Col, Collapse, Result, Row} from "antd"; //import { JsonEditor as Editor } from "jsoneditor-react"; //import "jsoneditor-react/es/editor.min.css"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; import JobCalculateTotals from "../job-calculate-totals/job-calculate-totals.component"; import "./job-totals-table.styles.scss"; import JobTotalsTableLabor from "./job-totals.table.labor.component"; @@ -15,87 +15,88 @@ import JobTotalsTableParts from "./job-totals.table.parts.component"; import JobTotalsTableTotals from "./job-totals.table.totals.component"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - jobRO: selectJobReadOnly, + currentUser: selectCurrentUser, + jobRO: selectJobReadOnly, }); const colSpan = { - md: { span: 24 }, - lg: { span: 12 }, + md: {span: 24}, + lg: {span: 12}, }; -export function JobsTotalsTableComponent({ jobRO, currentUser, job }) { - const { t } = useTranslation(); +export function JobsTotalsTableComponent({jobRO, currentUser, job}) { + const {t} = useTranslation(); + + if (!!!job.job_totals) { + return ( + + } + /> + + ); + } - if (!!!job.job_totals) { return ( - - } - /> - - ); - } - - return ( -
- -
- - - - - - - - - - - - +
+ +
+ + + - - - - - - - - - - - - - {(currentUser.email.includes("@imex.") || - currentUser.email.includes("@rome.")) && ( - - - - - -
+
+ + + + + + + + + + + + + + + + + + + + + {(currentUser.email.includes("@imex.") || + currentUser.email.includes("@rome.")) && ( + + + + + +
                           {JSON.stringify(
-                            {
-                              CIECA: job.cieca_ttl && job.cieca_ttl.data,
-                              CIECASTL: job.cieca_stl && job.cieca_stl.data,
-                              ImEXCalc: job.job_totals,
-                            },
-                            null,
-                            2
+                              {
+                                  CIECA: job.cieca_ttl && job.cieca_ttl.data,
+                                  CIECASTL: job.cieca_stl && job.cieca_stl.data,
+                                  ImEXCalc: job.job_totals,
+                              },
+                              null,
+                              2
                           )}
                         
-
-
-
-
- - )} - - - - - ); + + + + + + )} + + + + + ); } + export default connect(mapStateToProps, null)(JobsTotalsTableComponent); diff --git a/client/src/components/job-totals-table/job-totals.table.labor.component.jsx b/client/src/components/job-totals-table/job-totals.table.labor.component.jsx index 42cfe7c66..bb92988a7 100644 --- a/client/src/components/job-totals-table/job-totals.table.labor.component.jsx +++ b/client/src/components/job-totals-table/job-totals.table.labor.component.jsx @@ -1,185 +1,185 @@ -import { Space, Table } from "antd"; +import {Space, Table} from "antd"; import Dinero from "dinero.js"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {alphaSort} from "../../utils/sorters"; -export default function JobTotalsTableLabor({ job }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: { - columnKey: "profitcenter_labor", - field: "profitcenter_labor", - order: "ascend", - }, - filteredInfo: {}, - }); +export default function JobTotalsTableLabor({job}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: { + columnKey: "profitcenter_labor", + field: "profitcenter_labor", + order: "ascend", + }, + filteredInfo: {}, + }); - const data = useMemo(() => { - return Object.keys(job.job_totals.rates) - .filter( - (key) => - key !== "mapa" && - key !== "mash" && - key !== "subtotal" && - key !== "rates_subtotal" - ) - .map((key) => { - return { - id: key, - ...job.job_totals.rates[key], - }; - }); - }, [job.job_totals.rates]); + const data = useMemo(() => { + return Object.keys(job.job_totals.rates) + .filter( + (key) => + key !== "mapa" && + key !== "mash" && + key !== "subtotal" && + key !== "rates_subtotal" + ) + .map((key) => { + return { + id: key, + ...job.job_totals.rates[key], + }; + }); + }, [job.job_totals.rates]); - const columns = [ - { - title: t("joblines.fields.profitcenter_labor"), - dataIndex: "profitcenter_labor", - key: "profitcenter_labor", - defaultSortOrder: "ascend", - sorter: (a, b) => - alphaSort( - t(`jobs.fields.rate_${a.id.toLowerCase()}`), - t(`jobs.fields.rate_${b.id.toLowerCase()}`) - ), - sortOrder: - state.sortedInfo.columnKey === "profitcenter_labor" && - state.sortedInfo.order, - render: (text, record) => - t(`jobs.fields.rate_${record.id.toLowerCase()}`), - }, - { - title: t("jobs.labels.rates"), - dataIndex: "rate", - key: "rate", - align: "right", - sorter: (a, b) => a.rate - b.rate, - sortOrder: - state.sortedInfo.columnKey === "rate" && state.sortedInfo.order, - render: (text, record) => ( - {record.rate} - ), - }, - { - title: t("joblines.fields.mod_lb_hrs"), - dataIndex: "mod_lb_hrs", + const columns = [ + { + title: t("joblines.fields.profitcenter_labor"), + dataIndex: "profitcenter_labor", + key: "profitcenter_labor", + defaultSortOrder: "ascend", + sorter: (a, b) => + alphaSort( + t(`jobs.fields.rate_${a.id.toLowerCase()}`), + t(`jobs.fields.rate_${b.id.toLowerCase()}`) + ), + sortOrder: + state.sortedInfo.columnKey === "profitcenter_labor" && + state.sortedInfo.order, + render: (text, record) => + t(`jobs.fields.rate_${record.id.toLowerCase()}`), + }, + { + title: t("jobs.labels.rates"), + dataIndex: "rate", + key: "rate", + align: "right", + sorter: (a, b) => a.rate - b.rate, + sortOrder: + state.sortedInfo.columnKey === "rate" && state.sortedInfo.order, + render: (text, record) => ( + {record.rate} + ), + }, + { + title: t("joblines.fields.mod_lb_hrs"), + dataIndex: "mod_lb_hrs", - key: "mod_lb_hrs", - sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs, - sortOrder: - state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order, + key: "mod_lb_hrs", + sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs, + sortOrder: + state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order, - render: (text, record) => record.hours.toFixed(1), - }, - { - title: t("joblines.fields.total"), - dataIndex: "total", - key: "total", - align: "right", - sorter: (a, b) => a.total.amount - b.total.amount, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => record.hours.toFixed(1), + }, + { + title: t("joblines.fields.total"), + dataIndex: "total", + key: "total", + align: "right", + sorter: (a, b) => a.total.amount - b.total.amount, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => Dinero(record.total).toFormat(), - }, - ]; + render: (text, record) => Dinero(record.total).toFormat(), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - return ( -
( - <> - - - {t("jobs.labels.labor_rates_subtotal")} - - - - {( - job.job_totals.rates.mapa.hours + - job.job_totals.rates.mash.hours - ).toFixed(1)} - - - - {Dinero(job.job_totals.rates.rates_subtotal).toFormat()} - - - - - - - {t("jobs.labels.mapa")} - {job.materials && - job.materials.MAPA && - job.materials.MAPA.cal_maxdlr !== undefined && - t("jobs.labels.threshhold", { - amount: job.materials.MAPA.cal_maxdlr, - })} - - - - - {job.job_totals.rates.mapa.rate} - - - - {job.job_totals.rates.mapa.hours.toFixed(1)} - - - {Dinero(job.job_totals.rates.mapa.total).toFormat()} - - - - - - {t("jobs.labels.mash")} - {job.materials && - job.materials.MASH && - job.materials.MASH.cal_maxdlr !== undefined && - t("jobs.labels.threshhold", { - amount: job.materials.MASH.cal_maxdlr, - })} - - - - - {job.job_totals.rates.mash.rate} - - - - {job.job_totals.rates.mash.hours.toFixed(1)} - - - {Dinero(job.job_totals.rates.mash.total).toFormat()} - - - - - {t("jobs.labels.rates_subtotal")} - - - - - - {Dinero(job.job_totals.rates.subtotal).toFormat()} - - - - - )} - /> - ); + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + return ( +
( + <> + + + {t("jobs.labels.labor_rates_subtotal")} + + + + {( + job.job_totals.rates.mapa.hours + + job.job_totals.rates.mash.hours + ).toFixed(1)} + + + + {Dinero(job.job_totals.rates.rates_subtotal).toFormat()} + + + + + + + {t("jobs.labels.mapa")} + {job.materials && + job.materials.MAPA && + job.materials.MAPA.cal_maxdlr !== undefined && + t("jobs.labels.threshhold", { + amount: job.materials.MAPA.cal_maxdlr, + })} + + + + + {job.job_totals.rates.mapa.rate} + + + + {job.job_totals.rates.mapa.hours.toFixed(1)} + + + {Dinero(job.job_totals.rates.mapa.total).toFormat()} + + + + + + {t("jobs.labels.mash")} + {job.materials && + job.materials.MASH && + job.materials.MASH.cal_maxdlr !== undefined && + t("jobs.labels.threshhold", { + amount: job.materials.MASH.cal_maxdlr, + })} + + + + + {job.job_totals.rates.mash.rate} + + + + {job.job_totals.rates.mash.hours.toFixed(1)} + + + {Dinero(job.job_totals.rates.mash.total).toFormat()} + + + + + {t("jobs.labels.rates_subtotal")} + + + + + + {Dinero(job.job_totals.rates.subtotal).toFormat()} + + + + + )} + /> + ); } diff --git a/client/src/components/job-totals-table/job-totals.table.other.component.jsx b/client/src/components/job-totals-table/job-totals.table.other.component.jsx index ac132f1a6..3fed60af3 100644 --- a/client/src/components/job-totals-table/job-totals.table.other.component.jsx +++ b/client/src/components/job-totals-table/job-totals.table.other.component.jsx @@ -1,106 +1,106 @@ -import { Table } from "antd"; +import {Table} from "antd"; import Dinero from "dinero.js"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../utils/sorters"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../utils/sorters"; -export default function JobTotalsTableOther({ job }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: {}, - }); +export default function JobTotalsTableOther({job}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {}, + }); - const data = useMemo(() => { - return [ - ...((job.job_totals.additional.additionalCostItems && - job.job_totals.additional.additionalCostItems.map((i) => { - return { - key: i.key, - total: i.total, - }; - })) || - []), - { - key: t("jobs.fields.adjustment_bottom_line"), - total: job.job_totals.additional.adjustments, - }, - { - key: t("jobs.fields.towing_payable"), - total: job.job_totals.additional.towing, - }, - { - key: t("jobs.fields.storage_payable"), - total: job.job_totals.additional.storage, - }, - // { - // key: t("jobs.fields.ca_bc_pvrt"), - // total: job.job_totals.additional.pvrt, - // }, + const data = useMemo(() => { + return [ + ...((job.job_totals.additional.additionalCostItems && + job.job_totals.additional.additionalCostItems.map((i) => { + return { + key: i.key, + total: i.total, + }; + })) || + []), + { + key: t("jobs.fields.adjustment_bottom_line"), + total: job.job_totals.additional.adjustments, + }, + { + key: t("jobs.fields.towing_payable"), + total: job.job_totals.additional.towing, + }, + { + key: t("jobs.fields.storage_payable"), + total: job.job_totals.additional.storage, + }, + // { + // key: t("jobs.fields.ca_bc_pvrt"), + // total: job.job_totals.additional.pvrt, + // }, + ]; + }, [job.job_totals, t]); + + const columns = [ + { + title: t("general.labels.item"), + dataIndex: "key", + key: "key", + sorter: (a, b) => alphaSort(a.key, b.key), + sortOrder: state.sortedInfo.columnKey === "key" && state.sortedInfo.order, + width: "0%", + }, + { + title: t("joblines.fields.total"), + dataIndex: "total", + key: "total", + sorter: (a, b) => a.total.amount - b.total.amount, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + width: "20%", + align: "right", + render: (text, record) => Dinero(record.total).toFormat(), + }, ]; - }, [job.job_totals, t]); - const columns = [ - { - title: t("general.labels.item"), - dataIndex: "key", - key: "key", - sorter: (a, b) => alphaSort(a.key, b.key), - sortOrder: state.sortedInfo.columnKey === "key" && state.sortedInfo.order, - width: "0%", - }, - { - title: t("joblines.fields.total"), - dataIndex: "total", - key: "total", - sorter: (a, b) => a.total.amount - b.total.amount, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - width: "20%", - align: "right", - render: (text, record) => Dinero(record.total).toFormat(), - }, - ]; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + return ( +
( + <> + + + {t("jobs.labels.additionaltotal")} + - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - return ( -
( - <> - - - {t("jobs.labels.additionaltotal")} - + + + {Dinero(job.job_totals.additional.total).toFormat()} + + + + + + {t("jobs.labels.subletstotal")} + - - - {Dinero(job.job_totals.additional.total).toFormat()} - - - - - - {t("jobs.labels.subletstotal")} - - - - - {Dinero(job.job_totals.parts.sublets.total).toFormat()} - - - - - )} - /> - ); + + + {Dinero(job.job_totals.parts.sublets.total).toFormat()} + + + + + )} + /> + ); } diff --git a/client/src/components/job-totals-table/job-totals.table.parts.component.jsx b/client/src/components/job-totals-table/job-totals.table.parts.component.jsx index afcf9e14a..313de9e61 100644 --- a/client/src/components/job-totals-table/job-totals.table.parts.component.jsx +++ b/client/src/components/job-totals-table/job-totals.table.parts.component.jsx @@ -1,131 +1,131 @@ -import { Table } from "antd"; +import {Table} from "antd"; import Dinero from "dinero.js"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { alphaSort } from "../../utils/sorters"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {alphaSort} from "../../utils/sorters"; -export default function JobTotalsTableParts({ job }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: {}, - }); - - const insuranceAdjustments = useMemo(() => { - if (!job.job_totals) return []; - if (!job.job_totals?.parts?.adjustments) return []; - const adjs = []; - Object.keys(job.job_totals?.parts?.adjustments).forEach((key) => { - if (Dinero(job.job_totals?.parts?.adjustments[key]).getAmount() !== 0) { - adjs.push({ - id: key, - amount: Dinero(job.job_totals.parts.adjustments[key]), - }); - } +export default function JobTotalsTableParts({job}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {}, }); - return adjs; - }, [job.job_totals]); + const insuranceAdjustments = useMemo(() => { + if (!job.job_totals) return []; + if (!job.job_totals?.parts?.adjustments) return []; + const adjs = []; + Object.keys(job.job_totals?.parts?.adjustments).forEach((key) => { + if (Dinero(job.job_totals?.parts?.adjustments[key]).getAmount() !== 0) { + adjs.push({ + id: key, + amount: Dinero(job.job_totals.parts.adjustments[key]), + }); + } + }); - const data = useMemo(() => { - return Object.keys(job.job_totals.parts.parts.list) - .filter( - (key) => - key !== "mapa" && - key !== "mash" && - key !== "subtotal" && - key !== "rates_subtotal" - ) - .map((key) => { - return { - id: key, - ...job.job_totals.parts.parts.list[key], - }; - }); - }, [job.job_totals.parts.parts.list]); + return adjs; + }, [job.job_totals]); - const columns = [ - { - title: t("joblines.fields.part_type"), - dataIndex: "id", - key: "id", - sorter: (a, b) => - alphaSort( - t(`jobs.fields.${a.id.toLowerCase()}`), - t(`jobs.fields.${b.id.toLowerCase()}`) - ), - width: "80%", - sortOrder: state.sortedInfo.columnKey === "id" && state.sortedInfo.order, - render: (text, record) => t(`jobs.fields.${record.id.toLowerCase()}`), - }, - { - title: t("joblines.fields.total"), - dataIndex: "total", - key: "total", - sorter: (a, b) => a.total.amount - b.total.amount, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - width: "20%", - align: "right", - render: (text, record) => Dinero(record.total).toFormat(), - }, - ]; + const data = useMemo(() => { + return Object.keys(job.job_totals.parts.parts.list) + .filter( + (key) => + key !== "mapa" && + key !== "mash" && + key !== "subtotal" && + key !== "rates_subtotal" + ) + .map((key) => { + return { + id: key, + ...job.job_totals.parts.parts.list[key], + }; + }); + }, [job.job_totals.parts.parts.list]); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - return ( -
( - <> - - - {t("jobs.labels.prt_dsmk_total")} - - - {Dinero(job.job_totals.parts.parts.prt_dsmk_total).toFormat()} - - + const columns = [ + { + title: t("joblines.fields.part_type"), + dataIndex: "id", + key: "id", + sorter: (a, b) => + alphaSort( + t(`jobs.fields.${a.id.toLowerCase()}`), + t(`jobs.fields.${b.id.toLowerCase()}`) + ), + width: "80%", + sortOrder: state.sortedInfo.columnKey === "id" && state.sortedInfo.order, + render: (text, record) => t(`jobs.fields.${record.id.toLowerCase()}`), + }, + { + title: t("joblines.fields.total"), + dataIndex: "total", + key: "total", + sorter: (a, b) => a.total.amount - b.total.amount, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + width: "20%", + align: "right", + render: (text, record) => Dinero(record.total).toFormat(), + }, + ]; - - - {t("jobs.labels.partstotal")} - + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + return ( +
( + <> + + + {t("jobs.labels.prt_dsmk_total")} + + + {Dinero(job.job_totals.parts.parts.prt_dsmk_total).toFormat()} + + - - - {Dinero(job.job_totals.parts.parts.total).toFormat()} - - - - {insuranceAdjustments.length > 0 && ( - - - {t("jobs.labels.profileadjustments")} - - - )} - {insuranceAdjustments.map((adj, idx) => ( - - - {t(`jobs.fields.${adj.id.toLowerCase()}`)} - + + + {t("jobs.labels.partstotal")} + - - {adj.amount.toFormat()} - - - ))} - - )} - /> - ); + + + {Dinero(job.job_totals.parts.parts.total).toFormat()} + + + + {insuranceAdjustments.length > 0 && ( + + + {t("jobs.labels.profileadjustments")} + + + )} + {insuranceAdjustments.map((adj, idx) => ( + + + {t(`jobs.fields.${adj.id.toLowerCase()}`)} + + + + {adj.amount.toFormat()} + + + ))} + + )} + /> + ); } diff --git a/client/src/components/job-totals-table/job-totals.table.totals.component.jsx b/client/src/components/job-totals-table/job-totals.table.totals.component.jsx index ee9645bc5..415df9695 100644 --- a/client/src/components/job-totals-table/job-totals.table.totals.component.jsx +++ b/client/src/components/job-totals-table/job-totals.table.totals.component.jsx @@ -1,204 +1,205 @@ -import { Table } from "antd"; +import {Table} from "antd"; import Dinero from "dinero.js"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobTotalsTableTotals); -export function JobTotalsTableTotals({ bodyshop, job }) { - const { t } = useTranslation(); +export function JobTotalsTableTotals({bodyshop, job}) { + const {t} = useTranslation(); - const data = useMemo(() => { - return [ - { - key: t("jobs.labels.subtotal"), - total: job.job_totals.totals.subtotal, - bold: true, - }, + const data = useMemo(() => { + return [ + { + key: t("jobs.labels.subtotal"), + total: job.job_totals.totals.subtotal, + bold: true, + }, - ...(job.job_totals.totals.us_sales_tax_breakdown - ? [ - { - key: `${ - bodyshop.md_responsibility_centers.taxes.tax_ty1?.tax_type1 || - "T1" - } - ${[ - job.cieca_pft.ty1_rate1, - job.cieca_pft.ty1_rate2, - job.cieca_pft.ty1_rate3, - job.cieca_pft.ty1_rate4, - job.cieca_pft.ty1_rate5, - ] - .filter((i) => i > 0) - .join(", ")}%`, - total: job.job_totals.totals.us_sales_tax_breakdown.ty1Tax, - }, - { - key: `${ - bodyshop.md_responsibility_centers.taxes.tax_ty2?.tax_type2 || - "T2" - } - ${[ - job.cieca_pft.ty2_rate1, - job.cieca_pft.ty2_rate2, - job.cieca_pft.ty2_rate3, - job.cieca_pft.ty2_rate4, - job.cieca_pft.ty2_rate5, - ] - .filter((i) => i > 0) - .join(", ")}%`, - total: job.job_totals.totals.us_sales_tax_breakdown.ty2Tax, - }, - { - key: `${ - bodyshop.md_responsibility_centers.taxes.tax_ty3?.tax_type3 || - "T3" - } - ${[ - job.cieca_pft.ty3_rate1, - job.cieca_pft.ty3_rate2, - job.cieca_pft.ty3_rate3, - job.cieca_pft.ty3_rate4, - job.cieca_pft.ty3_rate5, - ] - .filter((i) => i > 0) - .join(", ")}%`, - total: job.job_totals.totals.us_sales_tax_breakdown.ty3Tax, - }, - { - key: `${ - bodyshop.md_responsibility_centers.taxes.tax_ty4?.tax_type4 || - "T4" - } - ${[ - job.cieca_pft.ty4_rate1, - job.cieca_pft.ty4_rate2, - job.cieca_pft.ty4_rate3, - job.cieca_pft.ty4_rate4, - job.cieca_pft.ty4_rate5, - ] - .filter((i) => i > 0) - .join(", ")}%`, - total: job.job_totals.totals.us_sales_tax_breakdown.ty4Tax, - }, - { - key: `${ - bodyshop.md_responsibility_centers.taxes.tax_ty5?.tax_type5 || - "TT" - } - ${[ - job.cieca_pft.ty5_rate1, - job.cieca_pft.ty5_rate2, - job.cieca_pft.ty5_rate3, - job.cieca_pft.ty5_rate4, - job.cieca_pft.ty5_rate5, - ] - .filter((i) => i > 0) - .join(", ")}%`, - total: job.job_totals.totals.us_sales_tax_breakdown.ty5Tax, - }, - { - key: t("jobs.labels.total_sales_tax"), - bold: true, - total: Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty1Tax) - .add( - Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty2Tax) - ) - .add( - Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty3Tax) - ) - .add( - Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty4Tax) - ) - .add( - Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty5Tax) - ).toJSON(), - }, - ].filter((item) => item.total.amount !== 0) - : [ - { - key: t("jobs.labels.state_tax_amt"), - total: job.job_totals.totals.state_tax, - }, - ]), + ...(job.job_totals.totals.us_sales_tax_breakdown + ? [ + { + key: `${ + bodyshop.md_responsibility_centers.taxes.tax_ty1?.tax_type1 || + "T1" + } - ${[ + job.cieca_pft.ty1_rate1, + job.cieca_pft.ty1_rate2, + job.cieca_pft.ty1_rate3, + job.cieca_pft.ty1_rate4, + job.cieca_pft.ty1_rate5, + ] + .filter((i) => i > 0) + .join(", ")}%`, + total: job.job_totals.totals.us_sales_tax_breakdown.ty1Tax, + }, + { + key: `${ + bodyshop.md_responsibility_centers.taxes.tax_ty2?.tax_type2 || + "T2" + } - ${[ + job.cieca_pft.ty2_rate1, + job.cieca_pft.ty2_rate2, + job.cieca_pft.ty2_rate3, + job.cieca_pft.ty2_rate4, + job.cieca_pft.ty2_rate5, + ] + .filter((i) => i > 0) + .join(", ")}%`, + total: job.job_totals.totals.us_sales_tax_breakdown.ty2Tax, + }, + { + key: `${ + bodyshop.md_responsibility_centers.taxes.tax_ty3?.tax_type3 || + "T3" + } - ${[ + job.cieca_pft.ty3_rate1, + job.cieca_pft.ty3_rate2, + job.cieca_pft.ty3_rate3, + job.cieca_pft.ty3_rate4, + job.cieca_pft.ty3_rate5, + ] + .filter((i) => i > 0) + .join(", ")}%`, + total: job.job_totals.totals.us_sales_tax_breakdown.ty3Tax, + }, + { + key: `${ + bodyshop.md_responsibility_centers.taxes.tax_ty4?.tax_type4 || + "T4" + } - ${[ + job.cieca_pft.ty4_rate1, + job.cieca_pft.ty4_rate2, + job.cieca_pft.ty4_rate3, + job.cieca_pft.ty4_rate4, + job.cieca_pft.ty4_rate5, + ] + .filter((i) => i > 0) + .join(", ")}%`, + total: job.job_totals.totals.us_sales_tax_breakdown.ty4Tax, + }, + { + key: `${ + bodyshop.md_responsibility_centers.taxes.tax_ty5?.tax_type5 || + "TT" + } - ${[ + job.cieca_pft.ty5_rate1, + job.cieca_pft.ty5_rate2, + job.cieca_pft.ty5_rate3, + job.cieca_pft.ty5_rate4, + job.cieca_pft.ty5_rate5, + ] + .filter((i) => i > 0) + .join(", ")}%`, + total: job.job_totals.totals.us_sales_tax_breakdown.ty5Tax, + }, + { + key: t("jobs.labels.total_sales_tax"), + bold: true, + total: Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty1Tax) + .add( + Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty2Tax) + ) + .add( + Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty3Tax) + ) + .add( + Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty4Tax) + ) + .add( + Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty5Tax) + ).toJSON(), + }, + ].filter((item) => item.total.amount !== 0) + : [ + { + key: t("jobs.labels.state_tax_amt"), + total: job.job_totals.totals.state_tax, + }, + ]), - { - key: t("jobs.labels.total_repairs"), - total: job.job_totals.totals.total_repairs, - bold: true, - }, - { - key: t("jobs.fields.ded_amt"), - total: job.job_totals.totals.custPayable.deductible, - }, - // { - // key: t("jobs.fields.federal_tax_payable"), - // total: job.job_totals.totals.custPayable.federal_tax, - // }, - { - key: t("jobs.fields.other_amount_payable"), - total: job.job_totals.totals.custPayable.other_customer_amount, - }, - { - key: t("jobs.fields.depreciation_taxes"), - total: job.job_totals.totals.custPayable.dep_taxes, - }, + { + key: t("jobs.labels.total_repairs"), + total: job.job_totals.totals.total_repairs, + bold: true, + }, + { + key: t("jobs.fields.ded_amt"), + total: job.job_totals.totals.custPayable.deductible, + }, + // { + // key: t("jobs.fields.federal_tax_payable"), + // total: job.job_totals.totals.custPayable.federal_tax, + // }, + { + key: t("jobs.fields.other_amount_payable"), + total: job.job_totals.totals.custPayable.other_customer_amount, + }, + { + key: t("jobs.fields.depreciation_taxes"), + total: job.job_totals.totals.custPayable.dep_taxes, + }, - { - key: t("jobs.labels.total_cust_payable"), - total: job.job_totals.totals.custPayable.total, - bold: true, - }, - { - key: t("jobs.labels.net_repairs"), - total: job.job_totals.totals.net_repairs, - bold: true, - }, + { + key: t("jobs.labels.total_cust_payable"), + total: job.job_totals.totals.custPayable.total, + bold: true, + }, + { + key: t("jobs.labels.net_repairs"), + total: job.job_totals.totals.net_repairs, + bold: true, + }, + ]; + }, [job.job_totals, job.cieca_pft, t, bodyshop.md_responsibility_centers]); + + const columns = [ + { + //title: t("joblines.fields.part_type"), + dataIndex: "key", + key: "key", + width: "80%", + onCell: (record, rowIndex) => { + return {style: {fontWeight: record.bold && "bold"}}; + }, + }, + { + title: t("joblines.fields.total"), + dataIndex: "total", + key: "total", + align: "right", + render: (text, record) => Dinero(record.total).toFormat(), + width: "20%", + onCell: (record, rowIndex) => { + return {style: {fontWeight: record.bold && "bold"}}; + }, + }, ]; - }, [job.job_totals, job.cieca_pft, t, bodyshop.md_responsibility_centers]); - const columns = [ - { - //title: t("joblines.fields.part_type"), - dataIndex: "key", - key: "key", - width: "80%", - onCell: (record, rowIndex) => { - return { style: { fontWeight: record.bold && "bold" } }; - }, - }, - { - title: t("joblines.fields.total"), - dataIndex: "total", - key: "total", - align: "right", - render: (text, record) => Dinero(record.total).toFormat(), - width: "20%", - onCell: (record, rowIndex) => { - return { style: { fontWeight: record.bold && "bold" } }; - }, - }, - ]; - - return ( -
- ); + return ( +
+ ); } diff --git a/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx b/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx index edef81343..63133a18d 100644 --- a/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx +++ b/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx @@ -1,64 +1,62 @@ -import { DownCircleFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, Dropdown, Menu, notification } from "antd"; +import {DownCircleFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, Dropdown, notification} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_STATUS } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_STATUS} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect(mapStateToProps, mapDispatchToProps)(JobsAdminStatus); -export function JobsAdminStatus({ insertAuditTrail, bodyshop, job }) { - const { t } = useTranslation(); +export function JobsAdminStatus({insertAuditTrail, bodyshop, job}) { + const {t} = useTranslation(); - const [mutationUpdateJobstatus] = useMutation(UPDATE_JOB_STATUS); - const updateJobStatus = (status) => { - mutationUpdateJobstatus({ - variables: { jobId: job.id, status: status }, - }) - .then((r) => { - notification["success"]({ message: t("jobs.successes.save") }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.admin_jobstatuschange(status), - }); - // refetch(); - }) - .catch((error) => { - notification["error"]({ message: t("jobs.errors.saving") }); - }); - }; + const [mutationUpdateJobstatus] = useMutation(UPDATE_JOB_STATUS); + const updateJobStatus = (status) => { + mutationUpdateJobstatus({ + variables: {jobId: job.id, status: status}, + }) + .then((r) => { + notification["success"]({message: t("jobs.successes.save")}); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobstatuschange(status), + }); + // refetch(); + }) + .catch((error) => { + notification["error"]({message: t("jobs.errors.saving")}); + }); + }; - const statusmenu = ( - { - updateJobStatus(e.key); - }} - > - {bodyshop.md_ro_statuses.statuses.map((item) => ( - {item} - ))} - - ); + const statusMenu = { + items: bodyshop.md_ro_statuses.statuses.map((item) => ({ + key: item, + label: item, + })), + onClick: (e) => { + updateJobStatus(e.key); + }, + } - return ( - - - - ); + + + + ); } diff --git a/client/src/components/jobs-admin-class/jobs-admin-class.component.jsx b/client/src/components/jobs-admin-class/jobs-admin-class.component.jsx index 55142344e..4d5b80541 100644 --- a/client/src/components/jobs-admin-class/jobs-admin-class.component.jsx +++ b/client/src/components/jobs-admin-class/jobs-admin-class.component.jsx @@ -1,84 +1,84 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification, Popconfirm, Select } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Popconfirm, Select} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobsAdminClass); -export function JobsAdminClass({ bodyshop, job }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [updateJob] = useMutation(UPDATE_JOB); +export function JobsAdminClass({bodyshop, job}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [updateJob] = useMutation(UPDATE_JOB); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateJob({ - variables: { jobId: job.id, job: values }, - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateJob({ + variables: {jobId: job.id, job: values}, + }); - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - //Get the owner details, populate it all back into the job. - }; + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + //Get the owner details, populate it all back into the job. + }; - useEffect(() => { - //form.resetFields(); - }, [form, job]); + useEffect(() => { + //form.resetFields(); + }, [form, job]); - return ( -
-
- - - - + return ( +
+
+ + + + - form.submit()} - > - - -
- ); + form.submit()} + > + + +
+ ); } diff --git a/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx b/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx index 5ac31da74..200a24975 100644 --- a/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx +++ b/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx @@ -1,197 +1,198 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { DateTimeFormat } from "./../../utils/DateFormatter"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {DateTimeFormat} from "./../../utils/DateFormatter"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsAdminDatesChange); -export function JobsAdminDatesChange({ insertAuditTrail, job }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [updateJob] = useMutation(UPDATE_JOB); +export function JobsAdminDatesChange({insertAuditTrail, job}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [updateJob] = useMutation(UPDATE_JOB); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateJob({ - variables: { jobId: job.id, job: values }, - refetchQueries: ["GET_JOB_BY_PK"], - awaitRefetchQueries: true, - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateJob({ + variables: {jobId: job.id, job: values}, + refetchQueries: ["GET_JOB_BY_PK"], + awaitRefetchQueries: true, + }); - const changedAuditFields = form.getFieldsValue( - true, - (meta) => meta && meta.touched + const changedAuditFields = form.getFieldsValue( + true, + (meta) => meta && meta.touched + ); + + Object.keys(changedAuditFields).forEach((key) => { + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobfieldchange( + key, + changedAuditFields[key] instanceof dayjs + ? DateTimeFormat(changedAuditFields[key]) + : changedAuditFields[key] + ), + }); + }); + + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + + form.resetFields(); + + setLoading(false); + //Get the owner details, populate it all back into the job. + }; + + useEffect(() => { + //form.resetFields(); + }, [form, job]); + + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
); - - Object.keys(changedAuditFields).forEach((key) => { - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.admin_jobfieldchange( - key, - changedAuditFields[key] instanceof moment - ? DateTimeFormat(changedAuditFields[key]) - : changedAuditFields[key] - ), - }); - }); - - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - form.resetFields(); - form.resetFields(); - setLoading(false); - //Get the owner details, populate it all back into the job. - }; - - useEffect(() => { - //form.resetFields(); - }, [form, job]); - - return ( -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ); } diff --git a/client/src/components/jobs-admin-delete-intake/jobs-admin-delete-intake.component.jsx b/client/src/components/jobs-admin-delete-intake/jobs-admin-delete-intake.component.jsx index 190778437..68b50c3c2 100644 --- a/client/src/components/jobs-admin-delete-intake/jobs-admin-delete-intake.component.jsx +++ b/client/src/components/jobs-admin-delete-intake/jobs-admin-delete-intake.component.jsx @@ -1,79 +1,79 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import { gql } from "@apollo/client"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -export default function JobAdminDeleteIntake({ job }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [deleteIntake] = useMutation(gql` - mutation DELETE_INTAKE($jobId: uuid!) { - update_jobs_by_pk( - pk_columns: { id: $jobId } - _set: { intakechecklist: null } - ) { - id - intakechecklist - } - } - `); +import {gql, useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; - const [DELETE_DELIVERY] = useMutation(gql` - mutation DELETE_DELIVERY($jobId: uuid!) { - update_jobs_by_pk( - pk_columns: { id: $jobId } - _set: { deliverchecklist: null } - ) { - id - deliverchecklist - } - } - `); +export default function JobAdminDeleteIntake({job}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [deleteIntake] = useMutation(gql` + mutation DELETE_INTAKE($jobId: uuid!) { + update_jobs_by_pk( + pk_columns: { id: $jobId } + _set: { intakechecklist: null } + ) { + id + intakechecklist + } + } + `); - const handleDelete = async (values) => { - setLoading(true); - const result = await deleteIntake({ - variables: { jobId: job.id }, - }); + const [DELETE_DELIVERY] = useMutation(gql` + mutation DELETE_DELIVERY($jobId: uuid!) { + update_jobs_by_pk( + pk_columns: { id: $jobId } + _set: { deliverchecklist: null } + ) { + id + deliverchecklist + } + } + `); - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + const handleDelete = async (values) => { + setLoading(true); + const result = await deleteIntake({ + variables: {jobId: job.id}, + }); - const handleDeleteDelivery = async (values) => { - setLoading(true); - const result = await DELETE_DELIVERY({ - variables: { jobId: job.id }, - }); + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + const handleDeleteDelivery = async (values) => { + setLoading(true); + const result = await DELETE_DELIVERY({ + variables: {jobId: job.id}, + }); - return ( - <> - - - - ); + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + + return ( + <> + + + + ); } diff --git a/client/src/components/jobs-admin-mark-reexport/jobs-admin-mark-reexport.component.jsx b/client/src/components/jobs-admin-mark-reexport/jobs-admin-mark-reexport.component.jsx index c47c30def..3b4cbe9bd 100644 --- a/client/src/components/jobs-admin-mark-reexport/jobs-admin-mark-reexport.component.jsx +++ b/client/src/components/jobs-admin-mark-reexport/jobs-admin-mark-reexport.component.jsx @@ -1,191 +1,189 @@ -import { gql, useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {gql, useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; -import moment from "moment"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobAdminMarkReexport); export function JobAdminMarkReexport({ - insertAuditTrail, - bodyshop, - currentUser, - job, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const [markJobForReexport] = useMutation(gql` - mutation MARK_JOB_FOR_REEXPORT($jobId: uuid!) { - update_jobs_by_pk( - pk_columns: { id: $jobId } - _set: { date_exported: null - status: "${bodyshop.md_ro_statuses.default_invoiced}" + insertAuditTrail, + bodyshop, + currentUser, + job, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + const [markJobForReexport] = useMutation(gql` + mutation MARK_JOB_FOR_REEXPORT($jobId: uuid!) { + update_jobs_by_pk( + pk_columns: { id: $jobId } + _set: { date_exported: null + status: "${bodyshop.md_ro_statuses.default_invoiced}" + } + ) { + id + date_exported + status + date_invoiced + } } - ) { - id - date_exported - status - date_invoiced - } - } - `); + `); - const [markJobExported] = useMutation(gql` - mutation MARK_JOB_AS_EXPORTED($jobId: uuid!, $date_exported: timestamptz!) { - update_jobs_by_pk( - pk_columns: { id: $jobId } - _set: { date_exported: $date_exported - status: "${bodyshop.md_ro_statuses.default_exported}" + const [markJobExported] = useMutation(gql` + mutation MARK_JOB_AS_EXPORTED($jobId: uuid!, $date_exported: timestamptz!) { + update_jobs_by_pk( + pk_columns: { id: $jobId } + _set: { date_exported: $date_exported + status: "${bodyshop.md_ro_statuses.default_exported}" + } + ) { + id + date_exported + date_invoiced + status + } } - ) { - id - date_exported - date_invoiced - status - } - } - `); - const [markJobUninvoiced] = useMutation(gql` - mutation MARK_JOB_AS_UNINVOICED($jobId: uuid!, ) { - update_jobs_by_pk( - pk_columns: { id: $jobId } - _set: { date_exported: null - date_invoiced: null - status: "${bodyshop.md_ro_statuses.default_delivered}" + `); + const [markJobUninvoiced] = useMutation(gql` + mutation MARK_JOB_AS_UNINVOICED($jobId: uuid!, ) { + update_jobs_by_pk( + pk_columns: { id: $jobId } + _set: { date_exported: null + date_invoiced: null + status: "${bodyshop.md_ro_statuses.default_delivered}" + } + ) { + id + date_exported + date_invoiced + status + } } - ) { - id - date_exported - date_invoiced - status - } - } - `); + `); - const handleMarkForExport = async () => { - setLoading(true); - const result = await markJobForReexport({ - variables: { jobId: job.id }, - }); + const handleMarkForExport = async () => { + setLoading(true); + const result = await markJobForReexport({ + variables: {jobId: job.id}, + }); - if (!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.admin_jobmarkforreexport(), - }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + if (!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobmarkforreexport(), + }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; - const handleMarkExported = async () => { - setLoading(true); - const result = await markJobExported({ - variables: { jobId: job.id, date_exported: moment() }, - }); + const handleMarkExported = async () => { + setLoading(true); + const result = await markJobExported({ + variables: {jobId: job.id, date_exported: dayjs()}, + }); - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - jobid: job.id, - successful: true, - message: JSON.stringify([t("general.labels.markedexported")]), - useremail: currentUser.email, - }, - ], - }, - }); + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + jobid: job.id, + successful: true, + message: JSON.stringify([t("general.labels.markedexported")]), + useremail: currentUser.email, + }, + ], + }, + }); - if (!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.admin_jobmarkexported(), - }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + if (!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobmarkexported(), + }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; - const handleUninvoice = async () => { - setLoading(true); - const result = await markJobUninvoiced({ - variables: { jobId: job.id }, - }); + const handleUninvoice = async () => { + setLoading(true); + const result = await markJobUninvoiced({ + variables: {jobId: job.id}, + }); - if (!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.admin_jobuninvoice(), - }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + if (!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobuninvoice(), + }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; - return ( - <> - - - - - ); + return ( + <> + + + + + ); } diff --git a/client/src/components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component.jsx b/client/src/components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component.jsx index 27f468526..737753cdb 100644 --- a/client/src/components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component.jsx +++ b/client/src/components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component.jsx @@ -1,63 +1,64 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; import OwnerSearchSelect from "../owner-search-select/owner-search-select.component"; -export default function JobAdminOwnerReassociate({ job }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [updateJob] = useMutation(UPDATE_JOB); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateJob({ - variables: { jobId: job.id, job: { ownerid: values.ownerid } }, - }); - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - //Get the owner details, populate it all back into the job. - }; +export default function JobAdminOwnerReassociate({job}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [updateJob] = useMutation(UPDATE_JOB); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateJob({ + variables: {jobId: job.id, job: {ownerid: values.ownerid}}, + }); - useEffect(() => { - //form.resetFields(); - }, [form, job]); + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + //Get the owner details, populate it all back into the job. + }; - return ( -
-
{t("jobs.labels.ownerassociation")}
-
- - - - -
{t("jobs.labels.associationwarning")}
- -
- ); + useEffect(() => { + //form.resetFields(); + }, [form, job]); + + return ( +
+
{t("jobs.labels.ownerassociation")}
+
+ + + + +
{t("jobs.labels.associationwarning")}
+ +
+ ); } diff --git a/client/src/components/jobs-admin-unvoid/jobs-admin-unvoid.component.jsx b/client/src/components/jobs-admin-unvoid/jobs-admin-unvoid.component.jsx index 7963fd05f..1fe074ca3 100644 --- a/client/src/components/jobs-admin-unvoid/jobs-admin-unvoid.component.jsx +++ b/client/src/components/jobs-admin-unvoid/jobs-admin-unvoid.component.jsx @@ -1,117 +1,114 @@ -import { gql, useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {gql, useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect(mapStateToProps, mapDispatchToProps)(JobsAdminUnvoid); export function JobsAdminUnvoid({ - insertAuditTrail, - bodyshop, - job, - currentUser, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [updateJob] = useMutation(gql` -mutation UNVOID_JOB($jobId: uuid!) { - update_jobs_by_pk(pk_columns: {id: $jobId}, _set: {voided: false, status: "${ + insertAuditTrail, + bodyshop, + job, + currentUser, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [updateJob] = useMutation(gql` + mutation UNVOID_JOB($jobId: uuid!) { + update_jobs_by_pk(pk_columns: {id: $jobId}, _set: {voided: false, status: "${ bodyshop.md_ro_statuses.default_imported - }", date_void: null}) { + }", date_void: null}) { id - date_void - voided - status - } - insert_notes(objects: {jobid: $jobId, audit: true, created_by: "${ + date_void + voided + status + } + insert_notes(objects: {jobid: $jobId, audit: true, created_by: "${ currentUser.email - }", text: "${t("jobs.labels.unvoidnote")}"}) { + }", text: "${t("jobs.labels.unvoidnote")}"}) { returning { - id - } - } -} - - `); - - // const result = await voidJob({ - // variables: { - // jobId: job.id, - // job: { - // status: bodyshop.md_ro_statuses.default_void, - // voided: true, - // }, - // note: [ - // { - // jobid: job.id, - // created_by: currentUser.email, - // audit: true, - // text: t("jobs.labels.voidnote", { - // date: moment().format("MM/DD/yyy"), - // time: moment().format("hh:mm a"), - // }), - // }, - // ], - // }, - // }); - - // if (!!!result.errors) { - // notification["success"]({ - // message: t("jobs.successes.voided"), - // }); - // //go back to jobs list. - // history.push(`/manage/`); - // } else { - // notification["error"]({ - // message: t("jobs.errors.voiding", { - // error: JSON.stringify(result.errors), - // }), - // }); - // } - - const handleUpdate = async (values) => { - setLoading(true); - const result = await updateJob({ - variables: { jobId: job.id }, - }); - - if (!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.admin_jobunvoid(), - }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - //Get the owner details, populate it all back into the job. - }; - - return ( - - ); + id + } + } + } + + `); + + // const result = await voidJob({ + // variables: { + // jobId: job.id, + // job: { + // status: bodyshop.md_ro_statuses.default_void, + // voided: true, + // }, + // note: [ + // { + // jobid: job.id, + // created_by: currentUser.email, + // audit: true, + // text: t("jobs.labels.voidnote", { + // date: dayjs().format("MM/DD/yyy"), + // time: dayjs().format("hh:mm a"), + // }), + // }, + // ], + // }, + // }); + + // if (!!!result.errors) { + // notification["success"]({ + // message: t("jobs.successes.voided"), + // }); + // //go back to jobs list. + // history.push(`/manage/`); + // } else { + // notification["error"]({ + // message: t("jobs.errors.voiding", { + // error: JSON.stringify(result.errors), + // }), + // }); + // } + + const handleUpdate = async (values) => { + setLoading(true); + const result = await updateJob({ + variables: {jobId: job.id}, + }); + + if (!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobunvoid(), + }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + //Get the owner details, populate it all back into the job. + }; + + return ( + + ); } diff --git a/client/src/components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component.jsx b/client/src/components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component.jsx index 060d24de5..60e9c268e 100644 --- a/client/src/components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component.jsx +++ b/client/src/components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component.jsx @@ -1,63 +1,64 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; import VehicleSearchSelect from "../vehicle-search-select/vehicle-search-select.component"; -export default function JobAdminOwnerReassociate({ job }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [updateJob] = useMutation(UPDATE_JOB); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateJob({ - variables: { jobId: job.id, job: { vehicleid: values.vehicleid } }, - }); - if (!!!result.errors) { - notification["success"]({ message: t("jobs.successes.save") }); - } else { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - //Get the owner details, populate it all back into the job. - }; +export default function JobAdminOwnerReassociate({job}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [updateJob] = useMutation(UPDATE_JOB); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateJob({ + variables: {jobId: job.id, job: {vehicleid: values.vehicleid}}, + }); - useEffect(() => { - //form.resetFields(); - }, [form, job]); + if (!!!result.errors) { + notification["success"]({message: t("jobs.successes.save")}); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + //Get the owner details, populate it all back into the job. + }; - return ( -
-
{t("jobs.labels.vehicleassociation")}
-
- - - - -
{t("jobs.labels.associationwarning")}
- -
- ); + useEffect(() => { + //form.resetFields(); + }, [form, job]); + + return ( +
+
{t("jobs.labels.vehicleassociation")}
+
+ + + + +
{t("jobs.labels.associationwarning")}
+ +
+ ); } diff --git a/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx b/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx index d2f41f5a8..a0dc4491b 100644 --- a/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx +++ b/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx @@ -1,158 +1,159 @@ -import { DownloadOutlined, SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, notification, Space, Table } from "antd"; +import {DownloadOutlined, SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, notification, Space, Table} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectPartnerVersion } from "../../redux/application/application.selectors"; -import { alphaSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectPartnerVersion} from "../../redux/application/application.selectors"; +import {alphaSort} from "../../utils/sorters"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - partnerVersion: selectPartnerVersion, + //currentUser: selectCurrentUser + partnerVersion: selectPartnerVersion, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobsAvailableScan); -export function JobsAvailableScan({ partnerVersion, refetch }) { - const [estimatesOnDisk, setEstimatesOnDisk] = useState([]); - const [loading, setLoading] = useState(false); - const [searchText, setSearchText] = useState(""); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const { t } = useTranslation(); - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const handleImport = async (filepath) => { - setLoading(true); - const response = await axios.post("http://localhost:1337/import/", { - filepath, +export function JobsAvailableScan({partnerVersion, refetch}) { + const [estimatesOnDisk, setEstimatesOnDisk] = useState([]); + const [loading, setLoading] = useState(false); + const [searchText, setSearchText] = useState(""); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, }); - if (response.data.success) { - //Came through - if (refetch) refetch(); - } else { - notification["error"]({ - message: t("jobs.errors.scanimport", { message: response.data.error }), - }); - } - setLoading(false); - }; + const {t} = useTranslation(); - const columns = [ - { - title: t("jobs.fields.cieca_id"), - dataIndex: "cieca_id", - key: "cieca_id", - sorter: (a, b) => alphaSort(a, b), - sortOrder: - state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - sorter: (a, b) => alphaSort(a.owner, b.owner), - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - sorter: (a, b) => alphaSort(a.vehicle, b.vehicle), - sortOrder: - state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), - sortOrder: - state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, - }, - { - title: t("general.labels.actions"), - key: "actions", - render: (text, record) => ( - - ), - }, - ]; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const scanEstimates = async () => { - setLoading(true); - const estimatesOnDiskResponse = await axios.post( - "http://localhost:1337/scan/" + const handleImport = async (filepath) => { + setLoading(true); + const response = await axios.post("http://localhost:1337/import/", { + filepath, + }); + if (response.data.success) { + //Came through + if (refetch) refetch(); + } else { + notification["error"]({ + message: t("jobs.errors.scanimport", {message: response.data.error}), + }); + } + setLoading(false); + }; + + const columns = [ + { + title: t("jobs.fields.cieca_id"), + dataIndex: "cieca_id", + key: "cieca_id", + sorter: (a, b) => alphaSort(a, b), + sortOrder: + state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.owner, b.owner), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + sorter: (a, b) => alphaSort(a.vehicle, b.vehicle), + sortOrder: + state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), + sortOrder: + state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, + }, + { + title: t("general.labels.actions"), + key: "actions", + render: (text, record) => ( + + ), + }, + ]; + + const scanEstimates = async () => { + setLoading(true); + const estimatesOnDiskResponse = await axios.post( + "http://localhost:1337/scan/" + ); + setEstimatesOnDisk(estimatesOnDiskResponse.data); + setLoading(false); + }; + + const data = estimatesOnDisk + ? searchText + ? estimatesOnDisk.filter( + (j) => + (j.owner || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.vehicle || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : estimatesOnDisk + : []; + + return ( + + + + { + setSearchText(e.currentTarget.value); + }} + /> + + } + > +
+ ); - setEstimatesOnDisk(estimatesOnDiskResponse.data); - setLoading(false); - }; - - const data = estimatesOnDisk - ? searchText - ? estimatesOnDisk.filter( - (j) => - (j.owner || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.vehicle || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) - ) - : estimatesOnDisk - : []; - - return ( - - - - { - setSearchText(e.currentTarget.value); - }} - /> - - } - > -
- - ); } diff --git a/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js b/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js index 6849609be..8d7c6d58d 100644 --- a/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js +++ b/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js @@ -1,78 +1,78 @@ -import { gql } from "@apollo/client"; +import {gql} from "@apollo/client"; import _ from "lodash"; -import { GET_ALL_JOBLINES_BY_PK } from "../../graphql/jobs-lines.queries"; +import {GET_ALL_JOBLINES_BY_PK} from "../../graphql/jobs-lines.queries"; export const GetSupplementDelta = async (client, jobId, newLines) => { - const { - data: { joblines: existingLinesFromDb }, - } = await client.query({ - query: GET_ALL_JOBLINES_BY_PK, - variables: { id: jobId }, - }); - - const existingLines = _.cloneDeep(existingLinesFromDb); - const linesToInsert = []; - const linesToUpdate = []; - - newLines.forEach((newLine) => { - const matchingIndex = existingLines.findIndex( - (eL) => eL.unq_seq === newLine.unq_seq - ); - - //Should do a check to make sure there is only 1 matching unq sequence number. - - if (matchingIndex >= 0) { - //Found a relevant matching line. Add it to lines to update. - linesToUpdate.push({ - id: existingLines[matchingIndex].id, - newData: { ...newLine, removed: false, act_price_before_ppc: null }, - }); - - //Splice out item we found for performance. - existingLines.splice(matchingIndex, 1); - } else { - //Didn't find a match. Must be a new line. - linesToInsert.push(newLine); - } - }); - - //Wahtever is left in the existing lines, are lines that should be removed. - const insertQueries = linesToInsert.reduce((acc, value, idx) => { - return acc + generateInsertQuery(value, idx, jobId); - }, ""); - - const updateQueries = linesToUpdate.reduce((acc, value, idx) => { - return acc + generateUpdateQuery(value, idx); - }, ""); - - const removeQueries = existingLines - .filter((l) => !l.manual_line) - .reduce((acc, value, idx) => { - return acc + generateRemoveQuery(value, idx); - }, ""); - //console.log(insertQueries, updateQueries, removeQueries); - - if ((insertQueries + updateQueries + removeQueries).trim() === "") { - return new Promise((resolve, reject) => { - resolve(null); + const { + data: {joblines: existingLinesFromDb}, + } = await client.query({ + query: GET_ALL_JOBLINES_BY_PK, + variables: {id: jobId}, }); - } - return new Promise((resolve, reject) => { - resolve(gql` - mutation SUPPLEMENT_EST_LINES{ - ${insertQueries + updateQueries + removeQueries} + const existingLines = _.cloneDeep(existingLinesFromDb); + const linesToInsert = []; + const linesToUpdate = []; + + newLines.forEach((newLine) => { + const matchingIndex = existingLines.findIndex( + (eL) => eL.unq_seq === newLine.unq_seq + ); + + //Should do a check to make sure there is only 1 matching unq sequence number. + + if (matchingIndex >= 0) { + //Found a relevant matching line. Add it to lines to update. + linesToUpdate.push({ + id: existingLines[matchingIndex].id, + newData: {...newLine, removed: false, act_price_before_ppc: null}, + }); + + //Splice out item we found for performance. + existingLines.splice(matchingIndex, 1); + } else { + //Didn't find a match. Must be a new line. + linesToInsert.push(newLine); + } + }); + + //Wahtever is left in the existing lines, are lines that should be removed. + const insertQueries = linesToInsert.reduce((acc, value, idx) => { + return acc + generateInsertQuery(value, idx, jobId); + }, ""); + + const updateQueries = linesToUpdate.reduce((acc, value, idx) => { + return acc + generateUpdateQuery(value, idx); + }, ""); + + const removeQueries = existingLines + .filter((l) => !l.manual_line) + .reduce((acc, value, idx) => { + return acc + generateRemoveQuery(value, idx); + }, ""); + //console.log(insertQueries, updateQueries, removeQueries); + + if ((insertQueries + updateQueries + removeQueries).trim() === "") { + return new Promise((resolve, reject) => { + resolve(null); + }); } - `); - }); + + return new Promise((resolve, reject) => { + resolve(gql` + mutation SUPPLEMENT_EST_LINES{ + ${insertQueries + updateQueries + removeQueries} + } + `); + }); }; const generateInsertQuery = (lineToInsert, index, jobId) => { - return ` + return ` insert_joblines${index}: insert_joblines(objects: ${JSON.stringify({ - ...lineToInsert, - jobid: jobId, - }).replace(/"(\w+)"\s*:/g, "$1:")}) { + ...lineToInsert, + jobid: jobId, + }).replace(/"(\w+)"\s*:/g, "$1:")}) { returning { id } @@ -80,13 +80,13 @@ const generateInsertQuery = (lineToInsert, index, jobId) => { }; const generateUpdateQuery = (lineToUpdate, index) => { - return ` + return ` update_joblines${index}: update_joblines(where: { id: { _eq: "${ - lineToUpdate.id - }" } }, _set: ${JSON.stringify(lineToUpdate.newData).replace( - /"(\w+)"\s*:/g, - "$1:" - )}) { + lineToUpdate.id + }" } }, _set: ${JSON.stringify(lineToUpdate.newData).replace( + /"(\w+)"\s*:/g, + "$1:" + )}) { returning { id } @@ -94,7 +94,7 @@ const generateUpdateQuery = (lineToUpdate, index) => { }; const generateRemoveQuery = (lineToRemove, index) => { - return ` + return ` update_joblines_r${index}: update_joblines(where: {id: {_eq: "${lineToRemove.id}"}}, _set: {removed: true}) { returning{ id diff --git a/client/src/components/jobs-available-table/jobs-available-supplement.headerfields.js b/client/src/components/jobs-available-table/jobs-available-supplement.headerfields.js index 07e91f8ea..348779424 100644 --- a/client/src/components/jobs-available-table/jobs-available-supplement.headerfields.js +++ b/client/src/components/jobs-available-table/jobs-available-supplement.headerfields.js @@ -1,234 +1,234 @@ const headerFields = [ - //AD1 - "ins_co_id", - "ins_co_nm", - "ins_addr1", - "ins_addr2", - "ins_city", - "ins_st", - "ins_zip", - "ins_ctry", - "ins_ea", - "policy_no", - "ded_amt", - "ded_status", - "asgn_no", - "asgn_date", - "asgn_type", - "clm_no", - "clm_ofc_id", - "clm_ofc_nm", - "clm_addr1", - "clm_addr2", - "clm_city", - "clm_st", - "clm_zip", - "clm_ctry", - "clm_ph1", - "clm_ph1x", - "clm_ph2", - "clm_ph2x", - "clm_fax", - "clm_faxx", - "clm_ct_ln", - "clm_ct_fn", - "clm_title", - "clm_ct_ph", - "clm_ct_phx", - "clm_ea", - "payee_nms", - "pay_type", - "pay_date", - "pay_chknm", - "pay_amt", - "agt_co_id", - "agt_co_nm", - "agt_addr1", - "agt_addr2", - "agt_city", - "agt_st", - "agt_zip", - "agt_ctry", - "agt_ph1", - "agt_ph1x", - "agt_ph2", - "agt_ph2x", - "agt_fax", - "agt_faxx", - "agt_ct_ln", - "agt_ct_fn", - "agt_ct_ph", - "agt_ct_phx", - "agt_ea", - "agt_lic_no", - "loss_date", - "loss_type", - "loss_desc", - "theft_ind", - "cat_no", - "tlos_ind", - "cust_pr", - "insd_ln", - "insd_fn", - "insd_title", - "insd_co_nm", - "insd_addr1", - "insd_addr2", - "insd_city", - "insd_st", - "insd_zip", - "insd_ctry", - "insd_ph1", - "insd_ph1x", - "insd_ph2", - "insd_ph2x", - "insd_fax", - "insd_faxx", - "insd_ea", - "ownr_ln", - "ownr_fn", - "ownr_title", - "ownr_co_nm", - "ownr_addr1", - "ownr_addr2", - "ownr_city", - "ownr_st", - "ownr_zip", - "ownr_ctry", - "ownr_ph1", - "ownr_ph1x", - "ownr_ph2", - "ownr_ph2x", - "ownr_fax", - "ownr_faxx", - "ownr_ea", - "ins_ph1", - "ins_ph1x", - "ins_ph2", - "ins_ph2x", - "ins_fax", - "ins_faxx", - "ins_ct_ln", - "ins_ct_fn", - "ins_title", - "ins_ct_ph", - "ins_ct_phx", - "loss_cat", - //AD2 - "clmt_ln", - "clmt_fn", - "clmt_title", - "clmt_co_nm", - "clmt_addr1", - "clmt_addr2", - "clmt_city", - "clmt_st", - "clmt_zip", - "clmt_ctry", - "clmt_ph1", - "clmt_ph1x", - "clmt_ph2", - "clmt_ph2x", - "clmt_fax", - "clmt_faxx", - "clmt_ea", - "est_co_id", - "est_co_nm", - "est_addr1", - "est_addr2", - "est_city", - "est_st", - "est_zip", - "est_ctry", - "est_ph1", - "est_ph1x", - "est_ph2", - "est_ph2x", - "est_fax", - "est_faxx", - "est_ct_ln", - "est_ct_fn", - "est_ea", - "est_lic_no", - "est_fileno", - "insp_ct_ln", - "insp_ct_fn", - "insp_addr1", - "insp_addr2", - "insp_city", - "insp_st", - "insp_zip", - "insp_ctry", - "insp_ph1", - "insp_ph1x", - "insp_ph2", - "insp_ph2x", - "insp_fax", - "insp_faxx", - "insp_ea", - "insp_code", - "insp_desc", - "insp_date", - "insp_time", - "rf_co_id", - "rf_co_nm", - "rf_addr1", - "rf_addr2", - "rf_city", - "rf_st", - "rf_zip", - "rf_ctry", - "rf_ph1", - "rf_ph1x", - "rf_ph2", - "rf_ph2x", - "rf_fax", - "rf_faxx", - "rf_ct_ln", - "rf_ct_fn", - "rf_ea", - "rf_tax_id", - "rf_lic_no", - "rf_bar_no", - "ro_in_date", - "ro_in_time", - "tar_date", - "tar_time", - "ro_cmpdate", - "ro_cmptime", - "date_out", - "time_out", - "rf_estimtr", - "mktg_type", - "mktg_src", - "loc_nm", - "loc_addr1", - "loc_addr2", - "loc_city", - "loc_st", - "loc_zip", - "loc_ctry", - "loc_ph1", - "loc_ph1x", - "loc_ph2", - "loc_ph2x", - "loc_fax", - "loc_faxx", - "loc_ct_ln", - "loc_ct_fn", - "loc_title", - "loc_ph", - "loc_phx", - "loc_ea", - //VEH - "plate_no", - "plate_st", - "v_vin", - "v_model_yr", - "v_make_desc", - "v_model_desc", - "v_options", - "v_color", + //AD1 + "ins_co_id", + "ins_co_nm", + "ins_addr1", + "ins_addr2", + "ins_city", + "ins_st", + "ins_zip", + "ins_ctry", + "ins_ea", + "policy_no", + "ded_amt", + "ded_status", + "asgn_no", + "asgn_date", + "asgn_type", + "clm_no", + "clm_ofc_id", + "clm_ofc_nm", + "clm_addr1", + "clm_addr2", + "clm_city", + "clm_st", + "clm_zip", + "clm_ctry", + "clm_ph1", + "clm_ph1x", + "clm_ph2", + "clm_ph2x", + "clm_fax", + "clm_faxx", + "clm_ct_ln", + "clm_ct_fn", + "clm_title", + "clm_ct_ph", + "clm_ct_phx", + "clm_ea", + "payee_nms", + "pay_type", + "pay_date", + "pay_chknm", + "pay_amt", + "agt_co_id", + "agt_co_nm", + "agt_addr1", + "agt_addr2", + "agt_city", + "agt_st", + "agt_zip", + "agt_ctry", + "agt_ph1", + "agt_ph1x", + "agt_ph2", + "agt_ph2x", + "agt_fax", + "agt_faxx", + "agt_ct_ln", + "agt_ct_fn", + "agt_ct_ph", + "agt_ct_phx", + "agt_ea", + "agt_lic_no", + "loss_date", + "loss_type", + "loss_desc", + "theft_ind", + "cat_no", + "tlos_ind", + "cust_pr", + "insd_ln", + "insd_fn", + "insd_title", + "insd_co_nm", + "insd_addr1", + "insd_addr2", + "insd_city", + "insd_st", + "insd_zip", + "insd_ctry", + "insd_ph1", + "insd_ph1x", + "insd_ph2", + "insd_ph2x", + "insd_fax", + "insd_faxx", + "insd_ea", + "ownr_ln", + "ownr_fn", + "ownr_title", + "ownr_co_nm", + "ownr_addr1", + "ownr_addr2", + "ownr_city", + "ownr_st", + "ownr_zip", + "ownr_ctry", + "ownr_ph1", + "ownr_ph1x", + "ownr_ph2", + "ownr_ph2x", + "ownr_fax", + "ownr_faxx", + "ownr_ea", + "ins_ph1", + "ins_ph1x", + "ins_ph2", + "ins_ph2x", + "ins_fax", + "ins_faxx", + "ins_ct_ln", + "ins_ct_fn", + "ins_title", + "ins_ct_ph", + "ins_ct_phx", + "loss_cat", + //AD2 + "clmt_ln", + "clmt_fn", + "clmt_title", + "clmt_co_nm", + "clmt_addr1", + "clmt_addr2", + "clmt_city", + "clmt_st", + "clmt_zip", + "clmt_ctry", + "clmt_ph1", + "clmt_ph1x", + "clmt_ph2", + "clmt_ph2x", + "clmt_fax", + "clmt_faxx", + "clmt_ea", + "est_co_id", + "est_co_nm", + "est_addr1", + "est_addr2", + "est_city", + "est_st", + "est_zip", + "est_ctry", + "est_ph1", + "est_ph1x", + "est_ph2", + "est_ph2x", + "est_fax", + "est_faxx", + "est_ct_ln", + "est_ct_fn", + "est_ea", + "est_lic_no", + "est_fileno", + "insp_ct_ln", + "insp_ct_fn", + "insp_addr1", + "insp_addr2", + "insp_city", + "insp_st", + "insp_zip", + "insp_ctry", + "insp_ph1", + "insp_ph1x", + "insp_ph2", + "insp_ph2x", + "insp_fax", + "insp_faxx", + "insp_ea", + "insp_code", + "insp_desc", + "insp_date", + "insp_time", + "rf_co_id", + "rf_co_nm", + "rf_addr1", + "rf_addr2", + "rf_city", + "rf_st", + "rf_zip", + "rf_ctry", + "rf_ph1", + "rf_ph1x", + "rf_ph2", + "rf_ph2x", + "rf_fax", + "rf_faxx", + "rf_ct_ln", + "rf_ct_fn", + "rf_ea", + "rf_tax_id", + "rf_lic_no", + "rf_bar_no", + "ro_in_date", + "ro_in_time", + "tar_date", + "tar_time", + "ro_cmpdate", + "ro_cmptime", + "date_out", + "time_out", + "rf_estimtr", + "mktg_type", + "mktg_src", + "loc_nm", + "loc_addr1", + "loc_addr2", + "loc_city", + "loc_st", + "loc_zip", + "loc_ctry", + "loc_ph1", + "loc_ph1x", + "loc_ph2", + "loc_ph2x", + "loc_fax", + "loc_faxx", + "loc_ct_ln", + "loc_ct_fn", + "loc_title", + "loc_ph", + "loc_phx", + "loc_ea", + //VEH + "plate_no", + "plate_st", + "v_vin", + "v_model_yr", + "v_make_desc", + "v_model_desc", + "v_options", + "v_color", ]; export default headerFields; diff --git a/client/src/components/jobs-available-table/jobs-available-table.component.jsx b/client/src/components/jobs-available-table/jobs-available-table.component.jsx index 508eddc6f..475979e7f 100644 --- a/client/src/components/jobs-available-table/jobs-available-table.component.jsx +++ b/client/src/components/jobs-available-table/jobs-available-table.component.jsx @@ -1,262 +1,254 @@ -import { - DeleteFilled, - DownloadOutlined, - PlusCircleFilled, - SyncOutlined, -} from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Alert, Button, Card, Input, notification, Space, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { - DELETE_ALL_AVAILABLE_JOBS, - DELETE_AVAILABLE_JOB, -} from "../../graphql/available-jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {DeleteFilled, DownloadOutlined, PlusCircleFilled, SyncOutlined,} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Alert, Button, Card, Input, notification, Space, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {DELETE_ALL_AVAILABLE_JOBS, DELETE_AVAILABLE_JOB,} from "../../graphql/available-jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { TimeAgoFormatter } from "../../utils/DateFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {TimeAgoFormatter} from "../../utils/DateFormatter"; +import {alphaSort} from "../../utils/sorters"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsAvailableComponent); export function JobsAvailableComponent({ - bodyshop, - loading, - data, - refetch, - addJobAsNew, - addJobAsSupp, -}) { - const [deleteAllAvailableJobs] = useMutation(DELETE_ALL_AVAILABLE_JOBS); - const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB); - const { t } = useTranslation(); - const [searchText, setSearchText] = useState(""); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + bodyshop, + loading, + data, + refetch, + addJobAsNew, + addJobAsSupp, + }) { + const [deleteAllAvailableJobs] = useMutation(DELETE_ALL_AVAILABLE_JOBS); + const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB); + const {t} = useTranslation(); + const [searchText, setSearchText] = useState(""); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("jobs.fields.cieca_id"), - dataIndex: "cieca_id", - key: "cieca_id", - sorter: (a, b) => alphaSort(a.cieca_id, b.cieca_id), - sortOrder: - state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "job_id", - key: "job_id", - //width: "8%", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, - sorter: (a, b) => - alphaSort(a.job && a.job.ro_number, b.job && b.job.ro_number), - sortOrder: - state.sortedInfo.columnKey === "job_id" && state.sortedInfo.order, - render: (text, record) => - record.job ? ( - - {(record.job && record.job.ro_number) || t("general.labels.na")} - - ) : ( -
- {(record.job && record.job.ro_number) || t("general.labels.na")} -
- ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "ownr_name", - key: "ownr_name", - ellipsis: true, - sorter: (a, b) => alphaSort(a.ownr_name, b.ownr_name), - sortOrder: - state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle_info", - key: "vehicle_info", - sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info), - sortOrder: - state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), - sortOrder: - state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.clm_total"), - dataIndex: "clm_amt", - key: "clm_amt", - sorter: (a, b) => a.clm_amt - b.clm_amt, - sortOrder: - state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order, - render: (text, record) => ( - {record.clm_amt} - ), - }, - { - title: t("jobs.fields.uploaded_by"), - dataIndex: "uploaded_by", - key: "uploaded_by", - sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by), - sortOrder: - state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.updated_at"), - dataIndex: "updated_at", - key: "updated_at", - sorter: (a, b) => new Date(a.updated_at) - new Date(b.updated_at), - sortOrder: - state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order, - render: (text, record) => ( - {record.updated_at} - ), - }, - { - title: t("general.labels.actions"), - key: "actions", - render: (text, record) => { - const isClosed = - record.job && - (record.job.status === bodyshop.md_ro_statuses.default_exported || - record.job.status === bodyshop.md_ro_statuses.default_invoiced); - return ( - - - {!isClosed && ( - <> - - - - )} - {isClosed && ( - - )} - - ); - }, - }, - ]; + const columns = [ + { + title: t("jobs.fields.cieca_id"), + dataIndex: "cieca_id", + key: "cieca_id", + sorter: (a, b) => alphaSort(a.cieca_id, b.cieca_id), + sortOrder: + state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "job_id", + key: "job_id", + //width: "8%", + // onFilter: (value, record) => record.ro_number.includes(value), + // filteredValue: state.filteredInfo.text || null, + sorter: (a, b) => + alphaSort(a.job && a.job.ro_number, b.job && b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "job_id" && state.sortedInfo.order, + render: (text, record) => + record.job ? ( + + {(record.job && record.job.ro_number) || t("general.labels.na")} + + ) : ( +
+ {(record.job && record.job.ro_number) || t("general.labels.na")} +
+ ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "ownr_name", + key: "ownr_name", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ownr_name, b.ownr_name), + sortOrder: + state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle_info", + key: "vehicle_info", + sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info), + sortOrder: + state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), + sortOrder: + state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_amt", + key: "clm_amt", + sorter: (a, b) => a.clm_amt - b.clm_amt, + sortOrder: + state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order, + render: (text, record) => ( + {record.clm_amt} + ), + }, + { + title: t("jobs.fields.uploaded_by"), + dataIndex: "uploaded_by", + key: "uploaded_by", + sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by), + sortOrder: + state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.updated_at"), + dataIndex: "updated_at", + key: "updated_at", + sorter: (a, b) => new Date(a.updated_at) - new Date(b.updated_at), + sortOrder: + state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order, + render: (text, record) => ( + {record.updated_at} + ), + }, + { + title: t("general.labels.actions"), + key: "actions", + render: (text, record) => { + const isClosed = + record.job && + (record.job.status === bodyshop.md_ro_statuses.default_exported || + record.job.status === bodyshop.md_ro_statuses.default_invoiced); + return ( + + + {!isClosed && ( + <> + + + + )} + {isClosed && ( + + )} + + ); + }, + }, + ]; - const availableJobs = data - ? searchText - ? data.available_jobs.filter( - (j) => - (j.ownr_name || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.vehicle_info || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) - ) - : data.available_jobs - : []; + const availableJobs = data + ? searchText + ? data.available_jobs.filter( + (j) => + (j.ownr_name || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.vehicle_info || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : data.available_jobs + : []; - return ( - - - + return ( + + + - { - setSearchText(e.currentTarget.value); - }} - /> - - } - > -
- - ); + { + setSearchText(e.currentTarget.value); + }} + /> + + } + > +
+ + ); } diff --git a/client/src/components/jobs-available-table/jobs-available-table.container.jsx b/client/src/components/jobs-available-table/jobs-available-table.container.jsx index 5f6443775..74ffb54b1 100644 --- a/client/src/components/jobs-available-table/jobs-available-table.container.jsx +++ b/client/src/components/jobs-available-table/jobs-available-table.container.jsx @@ -1,35 +1,26 @@ -import { - gql, - useApolloClient, - useLazyQuery, - useMutation, - useQuery, -} from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Button, Col, Row, notification } from "antd"; +import {gql, useApolloClient, useLazyQuery, useMutation, useQuery,} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Col, notification, Row} from "antd"; import Axios from "axios"; import _ from "lodash"; -import moment from "moment"; +import dayjs from "../../utils/day"; import queryString from "query-string"; -import React, { useCallback, useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import React, {useCallback, useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import { - DELETE_AVAILABLE_JOB, - QUERY_AVAILABLE_JOBS, - QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK, + DELETE_AVAILABLE_JOB, + QUERY_AVAILABLE_JOBS, + QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK, } from "../../graphql/available-jobs.queries"; -import { INSERT_NEW_JOB, UPDATE_JOB } from "../../graphql/jobs.queries"; -import { INSERT_NEW_NOTE } from "../../graphql/notes.queries"; -import { SEARCH_VEHICLE_BY_VIN } from "../../graphql/vehicles.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {INSERT_NEW_JOB, UPDATE_JOB} from "../../graphql/jobs.queries"; +import {INSERT_NEW_NOTE} from "../../graphql/notes.queries"; +import {SEARCH_VEHICLE_BY_VIN} from "../../graphql/vehicles.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import CriticalPartsScan from "../../utils/criticalPartsScan"; import AlertComponent from "../alert/alert.component"; @@ -37,581 +28,581 @@ import JobsAvailableScan from "../jobs-available-scan/jobs-available-scan.compon import JobsFindModalContainer from "../jobs-find-modal/jobs-find-modal.container"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import OwnerFindModalContainer from "../owner-find-modal/owner-find-modal.container"; -import { GetSupplementDelta } from "./jobs-available-supplement.estlines.util"; +import {GetSupplementDelta} from "./jobs-available-supplement.estlines.util"; import HeaderFields from "./jobs-available-supplement.headerfields"; import JobsAvailableTableComponent from "./jobs-available-table.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); -export function JobsAvailableContainer({ - bodyshop, - currentUser, - insertAuditTrail, -}) { - const { CriticalPartsScanning } = useTreatments( - ["CriticalPartsScanning"], - {}, - bodyshop.imexshopid - ); - const { loading, error, data, refetch } = useQuery(QUERY_AVAILABLE_JOBS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { clm_no, availableJobId } = queryString.parse(useLocation().search); - const history = useHistory(); - const { t } = useTranslation(); - const [ownerModalVisible, setOwnerModalVisible] = useState(false); - const [jobModalVisible, setJobModalVisible] = useState(false); +export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail,}) { - const [selectedJob, setSelectedJob] = useState(null); - const [selectedOwner, setSelectedOwner] = useState(null); - const [partsQueueToggle, setPartsQueueToggle] = useState(bodyshop.md_functionality_toggles.parts_queue_toggle); + const {treatments: {CriticalPartsScanning}} = useSplitTreatments({ + attributes: {}, + names: ["CriticalPartsScanning"], + splitKey: bodyshop.imexshopid, + }); - const [insertLoading, setInsertLoading] = useState(false); + const {loading, error, data, refetch} = useQuery(QUERY_AVAILABLE_JOBS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const {clm_no, availableJobId} = queryString.parse(useLocation().search); + const history = useNavigate(); + const {t} = useTranslation(); - const [insertNote] = useMutation(INSERT_NEW_NOTE); - const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB); - const [updateJob] = useMutation(UPDATE_JOB); + const [ownerModalVisible, setOwnerModalVisible] = useState(false); + const [jobModalVisible, setJobModalVisible] = useState(false); - const [insertNewJob] = useMutation(INSERT_NEW_JOB); - const client = useApolloClient(); + const [selectedJob, setSelectedJob] = useState(null); + const [selectedOwner, setSelectedOwner] = useState(null); + const [partsQueueToggle, setPartsQueueToggle] = useState(bodyshop.md_functionality_toggles.parts_queue_toggle); - const estDataLazyLoad = useLazyQuery(QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK); - const [loadEstData, estDataRaw] = estDataLazyLoad; + const [insertLoading, setInsertLoading] = useState(false); - const importOptionsState = useState({ overrideHeaders: false }); - const importOptions = importOptionsState[0]; - const modalSearchState = useState(""); + const [insertNote] = useMutation(INSERT_NEW_NOTE); + const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB); + const [updateJob] = useMutation(UPDATE_JOB); - //Import Scenario - const onOwnerFindModalOk = async (lazyData) => { - logImEXEvent("job_import_new"); + const [insertNewJob] = useMutation(INSERT_NEW_JOB); + const client = useApolloClient(); - setOwnerModalVisible(false); + const estDataLazyLoad = useLazyQuery(QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK); + const [loadEstData, estDataRaw] = estDataLazyLoad; - setInsertLoading(true); - const estData = replaceEmpty( - lazyData?.available_jobs_by_pk || estDataRaw.data.available_jobs_by_pk - ); + const importOptionsState = useState({overrideHeaders: false}); + const importOptions = importOptionsState[0]; + const modalSearchState = useState(""); - if (!(estData && estData.est_data)) { - //We don't have the right data. Error! - setInsertLoading(false); - notification["error"]({ - message: t("jobs.errors.creating", { error: "No job data present." }), - }); - return; - } - // if (process.env.REACT_APP_COUNTRY === "USA") { - //Massage the CCC file set to remove duplicate UNQ_SEQ. - await ResolveCCCLineIssues(estData.est_data, bodyshop); - // } else { - //IO-539 Check for Parts Rate on PAL for SGI use case. - await CheckTaxRates(estData.est_data, bodyshop); - // } - // const newTotals = ( - // await Axios.post("/job/totals", { - // job: { - // ...estData.est_data, - // joblines: estData.est_data.joblines.data, - // }, - // }) - // ).data; + //Import Scenario + const onOwnerFindModalOk = async (lazyData) => { + logImEXEvent("job_import_new"); - let existingVehicles; - if (estData.est_data.v_vin) { - //There's vehicle data, need to double-check the VIN. - existingVehicles = await client.query({ - query: SEARCH_VEHICLE_BY_VIN, - variables: { - vin: estData.est_data.v_vin || estData.est_data.vehicle.data.v_vin, - }, - }); - } + setOwnerModalVisible(false); - const newJob = { - ...estData.est_data, - // clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), - // owner_owing: Dinero(newTotals.totals.custPayable.total).toFormat("0.00"), - // job_totals: newTotals, - date_open: moment(), - status: bodyshop.md_ro_statuses.default_imported, - notes: { - data: { - created_by: currentUser.email, - audit: true, - text: t("jobs.labels.importnote"), - }, - }, - queued_for_parts: partsQueueToggle, - ...(existingVehicles && existingVehicles.data.vehicles.length > 0 - ? { vehicleid: existingVehicles.data.vehicles[0].id, vehicle: null } - : {}), + setInsertLoading(true); + const estData = replaceEmpty( + lazyData?.available_jobs_by_pk || estDataRaw.data.available_jobs_by_pk + ); + + if (!(estData && estData.est_data)) { + //We don't have the right data. Error! + setInsertLoading(false); + notification["error"]({ + message: t("jobs.errors.creating", {error: "No job data present."}), + }); + return; + } + // if (process.env.REACT_APP_COUNTRY === "USA") { + //Massage the CCC file set to remove duplicate UNQ_SEQ. + await ResolveCCCLineIssues(estData.est_data, bodyshop); + // } else { + //IO-539 Check for Parts Rate on PAL for SGI use case. + await CheckTaxRates(estData.est_data, bodyshop); + // } + // const newTotals = ( + // await Axios.post("/job/totals", { + // job: { + // ...estData.est_data, + // joblines: estData.est_data.joblines.data, + // }, + // }) + // ).data; + + let existingVehicles; + if (estData.est_data.v_vin) { + //There's vehicle data, need to double-check the VIN. + existingVehicles = await client.query({ + query: SEARCH_VEHICLE_BY_VIN, + variables: { + vin: estData.est_data.v_vin || estData.est_data.vehicle.data.v_vin, + }, + }); + } + + const newJob = { + ...estData.est_data, + // clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), + // owner_owing: Dinero(newTotals.totals.custPayable.total).toFormat("0.00"), + // job_totals: newTotals, + date_open: dayjs(), + status: bodyshop.md_ro_statuses.default_imported, + notes: { + data: { + created_by: currentUser.email, + audit: true, + text: t("jobs.labels.importnote"), + }, + }, + queued_for_parts: partsQueueToggle, + ...(existingVehicles && existingVehicles.data.vehicles.length > 0 + ? {vehicleid: existingVehicles.data.vehicles[0].id, vehicle: null} + : {}), + }; + + if (selectedOwner) { + newJob.ownerid = selectedOwner; + delete newJob.owner; + } + if (newJob.vehicleid) { + delete newJob.vehicle; + } + + if (typeof newJob.kmin === "string") { + newJob.kmin = null; + } + + try { + const r = await insertNewJob({ + variables: { + job: newJob, + }, + }); + await Axios.post("/job/totalsssu", { + id: r.data.insert_jobs.returning[0].id, + }); + + if (CriticalPartsScanning.treatment === "on") { + CriticalPartsScan(r.data.insert_jobs.returning[0].id); + } + notification["success"]({ + message: t("jobs.successes.created"), + onClick: () => { + history(`/manage/jobs/${r.data.insert_jobs.returning[0].id}`); + }, + }); + //Job has been inserted. Clean up the available jobs record. + + insertAuditTrail({ + jobid: r.data.insert_jobs.returning[0].id, + operation: AuditTrailMapping.jobimported(), + }); + + await deleteJob({ + variables: {id: estData.id}, + }).then((r) => { + refetch(); + setInsertLoading(false); + }); + + setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); + } catch (r) { + //error while inserting + notification["error"]({ + message: t("jobs.errors.creating", {error: r.message}), + }); + refetch(); + setInsertLoading(false); + setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); + + } }; - if (selectedOwner) { - newJob.ownerid = selectedOwner; - delete newJob.owner; - } - if (newJob.vehicleid) { - delete newJob.vehicle; - } + //Supplement scenario + const onJobFindModalOk = async () => { + logImEXEvent("job_import_supplement"); - if (typeof newJob.kmin === "string") { - newJob.kmin = null; - } + setJobModalVisible(false); + setInsertLoading(true); - try { - const r = await insertNewJob({ - variables: { - job: newJob, - }, - }); - await Axios.post("/job/totalsssu", { - id: r.data.insert_jobs.returning[0].id, - }); + const estData = estDataRaw.data.available_jobs_by_pk; - if (CriticalPartsScanning.treatment === "on") { - CriticalPartsScan(r.data.insert_jobs.returning[0].id); - } - notification["success"]({ - message: t("jobs.successes.created"), - onClick: () => { - history.push(`/manage/jobs/${r.data.insert_jobs.returning[0].id}`); - }, - }); - //Job has been inserted. Clean up the available jobs record. + if (!(estData && estData.est_data)) { + //We don't have the right data. Error! + setInsertLoading(false); + notification["error"]({ + message: t("jobs.errors.creating", {error: "No job data present."}), + }); + } else { + //create upsert job + let supp = replaceEmpty({...estData.est_data}); + //IO-539 Check for Parts Rate on PAL for SGI use case. + await CheckTaxRates(supp, bodyshop); + await ResolveCCCLineIssues(supp, bodyshop); - insertAuditTrail({ - jobid: r.data.insert_jobs.returning[0].id, - operation: AuditTrailMapping.jobimported(), - }); - - await deleteJob({ - variables: { id: estData.id }, - }).then((r) => { - refetch(); - setInsertLoading(false); - }); - - setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); - } catch (r) { - //error while inserting - notification["error"]({ - message: t("jobs.errors.creating", { error: r.message }), - }); - refetch(); - setInsertLoading(false); - setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); - - } - }; - - //Supplement scenario - const onJobFindModalOk = async () => { - logImEXEvent("job_import_supplement"); - - setJobModalVisible(false); - setInsertLoading(true); - - const estData = estDataRaw.data.available_jobs_by_pk; - - if (!(estData && estData.est_data)) { - //We don't have the right data. Error! - setInsertLoading(false); - notification["error"]({ - message: t("jobs.errors.creating", { error: "No job data present." }), - }); - } else { - //create upsert job - let supp = replaceEmpty({ ...estData.est_data }); - //IO-539 Check for Parts Rate on PAL for SGI use case. - await CheckTaxRates(supp, bodyshop); - await ResolveCCCLineIssues(supp, bodyshop); - - delete supp.owner; - delete supp.vehicle; - delete supp.ins_co_nm; - if (!importOptions.overrideHeaders) { - HeaderFields.forEach((item) => delete supp[item]); - } - - let suppDelta = await GetSupplementDelta( - client, - selectedJob, - supp.joblines.data - ); - - delete supp.joblines; - if (suppDelta !== null) { - await client.mutate({ - mutation: gql` - ${suppDelta} - `, - }); - } - const updateResult = await updateJob({ - variables: { - jobId: selectedJob, - job: { - ...supp, - // clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), - // owner_owing: Dinero(newTotals.totals.custPayable.total).toFormat( - // "0.00" - // ), - // job_totals: newTotals, - queued_for_parts: partsQueueToggle, - }, - }, - }); - - setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); - - if (CriticalPartsScanning.treatment === "on") { - CriticalPartsScan(updateResult.data.update_jobs.returning[0].id); - } - if (updateResult.errors) { - //error while inserting - notification["error"]({ - message: t("jobs.errors.creating", { - error: JSON.stringify(updateResult.errors), - }), - }); - refetch(); - setInsertLoading(false); - return; - } - - const newTotals = await Axios.post("/job/totalsssu", { - id: selectedJob, - }); - - if (newTotals.status !== 200) { - notification["error"]({ - message: t("jobs.errors.totalscalc"), - }); - setInsertLoading(false); - return; - } - notification["success"]({ - message: t("jobs.successes.supplemented"), - onClick: () => { - history.push( - `/manage/jobs/${updateResult.data.update_jobs.returning[0].id}` - ); - }, - }); - //Job has been inserted. Clean up the available jobs record. - - deleteJob({ - variables: { id: estData.id }, - }).then((r) => { - refetch(); - setInsertLoading(false); - }); - - await insertNote({ - variables: { - noteInput: [ - { - jobid: selectedJob, - created_by: currentUser.email, - audit: true, - text: t("jobs.labels.supplementnote"), - }, - ], - }, - }); - insertAuditTrail({ - jobid: selectedJob, - operation: AuditTrailMapping.jobsupplement(), - }); - } - }; - - const owner = - estDataRaw.data && - estDataRaw.data.available_jobs_by_pk && - estDataRaw.data.available_jobs_by_pk.est_data && - estDataRaw.data.available_jobs_by_pk.est_data.owner && - estDataRaw.data.available_jobs_by_pk.est_data.owner.data && - !estDataRaw.data.available_jobs_by_pk.issupplement - ? estDataRaw.data.available_jobs_by_pk.est_data.owner.data - : null; - - const onOwnerModalCancel = () => { - setOwnerModalVisible(false); - setSelectedOwner(null); - setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); - }; - - const onJobModalCancel = () => { - setJobModalVisible(false); - modalSearchState[1](""); - setSelectedJob(null); - setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); - }; - - const addJobAsNew = (record) => { - loadEstData({ variables: { id: record.id } }); - setOwnerModalVisible(true); - }; - - const addJobAsSupp = useCallback((record) => { - loadEstData({ variables: { id: record.id } }); - modalSearchState[1](record.clm_no); - setJobModalVisible(true); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - if (availableJobId && clm_no) - addJobAsSupp({ id: availableJobId, clm_no: clm_no }); - }, [addJobAsSupp, availableJobId, clm_no]); - - if (error) return ; - - - return ( - - - - {currentUser.email.includes("@rome.") || - currentUser.email.includes("@imex.") ? ( - - ) : null} - - - - - - - - - - ); + let suppDelta = await GetSupplementDelta( + client, + selectedJob, + supp.joblines.data + ); + + delete supp.joblines; + if (suppDelta !== null) { + await client.mutate({ + mutation: gql` + ${suppDelta} + `, + }); + } + const updateResult = await updateJob({ + variables: { + jobId: selectedJob, + job: { + ...supp, + // clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), + // owner_owing: Dinero(newTotals.totals.custPayable.total).toFormat( + // "0.00" + // ), + // job_totals: newTotals, + queued_for_parts: partsQueueToggle, + }, + }, + }); + + setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); + + if (CriticalPartsScanning.treatment === "on") { + CriticalPartsScan(updateResult.data.update_jobs.returning[0].id); + } + if (updateResult.errors) { + //error while inserting + notification["error"]({ + message: t("jobs.errors.creating", { + error: JSON.stringify(updateResult.errors), + }), + }); + refetch(); + setInsertLoading(false); + return; + } + + const newTotals = await Axios.post("/job/totalsssu", { + id: selectedJob, + }); + + if (newTotals.status !== 200) { + notification["error"]({ + message: t("jobs.errors.totalscalc"), + }); + setInsertLoading(false); + return; + } + notification["success"]({ + message: t("jobs.successes.supplemented"), + onClick: () => { + history( + `/manage/jobs/${updateResult.data.update_jobs.returning[0].id}` + ); + }, + }); + //Job has been inserted. Clean up the available jobs record. + + deleteJob({ + variables: {id: estData.id}, + }).then((r) => { + refetch(); + setInsertLoading(false); + }); + + await insertNote({ + variables: { + noteInput: [ + { + jobid: selectedJob, + created_by: currentUser.email, + audit: true, + text: t("jobs.labels.supplementnote"), + }, + ], + }, + }); + insertAuditTrail({ + jobid: selectedJob, + operation: AuditTrailMapping.jobsupplement(), + }); + } + }; + + const owner = + estDataRaw.data && + estDataRaw.data.available_jobs_by_pk && + estDataRaw.data.available_jobs_by_pk.est_data && + estDataRaw.data.available_jobs_by_pk.est_data.owner && + estDataRaw.data.available_jobs_by_pk.est_data.owner.data && + !estDataRaw.data.available_jobs_by_pk.issupplement + ? estDataRaw.data.available_jobs_by_pk.est_data.owner.data + : null; + + const onOwnerModalCancel = () => { + setOwnerModalVisible(false); + setSelectedOwner(null); + setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); + }; + + const onJobModalCancel = () => { + setJobModalVisible(false); + modalSearchState[1](""); + setSelectedJob(null); + setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); + }; + + const addJobAsNew = (record) => { + loadEstData({variables: {id: record.id}}); + setOwnerModalVisible(true); + }; + + const addJobAsSupp = useCallback((record) => { + loadEstData({variables: {id: record.id}}); + modalSearchState[1](record.clm_no); + setJobModalVisible(true); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (availableJobId && clm_no) + addJobAsSupp({id: availableJobId, clm_no: clm_no}); + }, [addJobAsSupp, availableJobId, clm_no]); + + if (error) return ; + + + return ( + + + + {currentUser.email.includes("@rome.") || + currentUser.email.includes("@imex.") ? ( + + ) : null} + + + + + + + + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsAvailableContainer); function replaceEmpty(someObj, replaceValue = null) { - const replacer = (key, value) => - value === "" ? replaceValue || null : value; - //^ because you seem to want to replace (strings) "null" or "undefined" too - const temp = JSON.stringify(someObj, replacer); - return JSON.parse(temp); + const replacer = (key, value) => + value === "" ? replaceValue || null : value; + //^ because you seem to want to replace (strings) "null" or "undefined" too + const temp = JSON.stringify(someObj, replacer); + return JSON.parse(temp); } async function CheckTaxRates(estData, bodyshop) { - // //LKQ Check - // if ( - // !estData.parts_tax_rates?.PAL || - // estData.parts_tax_rates?.PAL?.prt_tax_rt === null || - // estData.parts_tax_rates?.PAL?.prt_tax_rt === 0 - // ) { - // const res = await confirmDialog( - // `Rome Online has detected that there is a missing tax rate for LKQ parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` - // ); - // if (res) { - // if (!estData.parts_tax_rates.PAL) { - // estData.parts_tax_rates.PAL = { - // prt_discp: 0, - // prt_mktyp: true, - // prt_mkupp: 0, - // prt_type: "PAL", - // }; - // } - // estData.parts_tax_rates.PAL.prt_tax_rt = - // bodyshop.bill_tax_rates.state_tax_rate / 100; - // estData.parts_tax_rates.PAL.prt_tax_in = true; - // } - // } - // //PAC Check - // if ( - // !estData.parts_tax_rates?.PAC || - // estData.parts_tax_rates?.PAC?.prt_tax_rt === null || - // estData.parts_tax_rates?.PAC?.prt_tax_rt === 0 - // ) { - // const res = await confirmDialog( - // `Rome Online has detected that there is a missing tax rate for rechromed parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` - // ); - // if (res) { - // if (!estData.parts_tax_rates.PAC) { - // estData.parts_tax_rates.PAC = { - // prt_discp: 0, - // prt_mktyp: true, - // prt_mkupp: 0, - // prt_type: "PAC", - // }; - // } - // estData.parts_tax_rates.PAC.prt_tax_rt = - // bodyshop.bill_tax_rates.state_tax_rate / 100; - // estData.parts_tax_rates.PAC.prt_tax_in = true; - // } - // } + // //LKQ Check + // if ( + // !estData.parts_tax_rates?.PAL || + // estData.parts_tax_rates?.PAL?.prt_tax_rt === null || + // estData.parts_tax_rates?.PAL?.prt_tax_rt === 0 + // ) { + // const res = await confirmDialog( + // `Rome Online has detected that there is a missing tax rate for LKQ parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` + // ); + // if (res) { + // if (!estData.parts_tax_rates.PAL) { + // estData.parts_tax_rates.PAL = { + // prt_discp: 0, + // prt_mktyp: true, + // prt_mkupp: 0, + // prt_type: "PAL", + // }; + // } + // estData.parts_tax_rates.PAL.prt_tax_rt = + // bodyshop.bill_tax_rates.state_tax_rate / 100; + // estData.parts_tax_rates.PAL.prt_tax_in = true; + // } + // } + // //PAC Check + // if ( + // !estData.parts_tax_rates?.PAC || + // estData.parts_tax_rates?.PAC?.prt_tax_rt === null || + // estData.parts_tax_rates?.PAC?.prt_tax_rt === 0 + // ) { + // const res = await confirmDialog( + // `Rome Online has detected that there is a missing tax rate for rechromed parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` + // ); + // if (res) { + // if (!estData.parts_tax_rates.PAC) { + // estData.parts_tax_rates.PAC = { + // prt_discp: 0, + // prt_mktyp: true, + // prt_mkupp: 0, + // prt_type: "PAC", + // }; + // } + // estData.parts_tax_rates.PAC.prt_tax_rt = + // bodyshop.bill_tax_rates.state_tax_rate / 100; + // estData.parts_tax_rates.PAC.prt_tax_in = true; + // } + // } - //PAM Check - if (!estData.parts_tax_rates?.PAM) { - estData.parts_tax_rates.PAM = estData.parts_tax_rates.PAC; - } + //PAM Check + if (!estData.parts_tax_rates?.PAM) { + estData.parts_tax_rates.PAM = estData.parts_tax_rates.PAC; + } - // //PAM Check - // if ( - // !estData.parts_tax_rates?.PAM || - // estData.parts_tax_rates?.PAM?.prt_tax_rt === null || - // estData.parts_tax_rates?.PAM?.prt_tax_rt === 0 - // ) { - // const res = await confirmDialog( - // `Rome Online has detected that there is a missing tax rate for remanufactured parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` - // ); - // if (res) { - // if (!estData.parts_tax_rates.PAM) { - // estData.parts_tax_rates.PAM = { - // prt_discp: 0, - // prt_mktyp: true, - // prt_mkupp: 0, - // prt_type: "PAM", - // }; - // } - // estData.parts_tax_rates.PAM.prt_tax_rt = - // bodyshop.bill_tax_rates.state_tax_rate / 100; - // estData.parts_tax_rates.PAM.prt_tax_in = true; - // } - // } + // //PAM Check + // if ( + // !estData.parts_tax_rates?.PAM || + // estData.parts_tax_rates?.PAM?.prt_tax_rt === null || + // estData.parts_tax_rates?.PAM?.prt_tax_rt === 0 + // ) { + // const res = await confirmDialog( + // `Rome Online has detected that there is a missing tax rate for remanufactured parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` + // ); + // if (res) { + // if (!estData.parts_tax_rates.PAM) { + // estData.parts_tax_rates.PAM = { + // prt_discp: 0, + // prt_mktyp: true, + // prt_mkupp: 0, + // prt_type: "PAM", + // }; + // } + // estData.parts_tax_rates.PAM.prt_tax_rt = + // bodyshop.bill_tax_rates.state_tax_rate / 100; + // estData.parts_tax_rates.PAM.prt_tax_in = true; + // } + // } - // if ( - // !estData.parts_tax_rates?.PAR || - // estData.parts_tax_rates?.PAR?.prt_tax_rt === null || - // estData.parts_tax_rates?.PAR?.prt_tax_rt === 0 - // ) { - // const res = await confirmDialog( - // `Rome Online has detected that there is a missing tax rate for recored parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` - // ); - // if (res) { - // if (!estData.parts_tax_rates.PAR) { - // estData.parts_tax_rates.PAR = { - // prt_discp: 0, - // prt_mktyp: true, - // prt_mkupp: 0, - // prt_type: "PAR", - // }; - // } - // estData.parts_tax_rates.PAR.prt_tax_rt = - // bodyshop.bill_tax_rates.state_tax_rate / 100; - // estData.parts_tax_rates.PAR.prt_tax_in = true; - // } - // } + // if ( + // !estData.parts_tax_rates?.PAR || + // estData.parts_tax_rates?.PAR?.prt_tax_rt === null || + // estData.parts_tax_rates?.PAR?.prt_tax_rt === 0 + // ) { + // const res = await confirmDialog( + // `Rome Online has detected that there is a missing tax rate for recored parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.` + // ); + // if (res) { + // if (!estData.parts_tax_rates.PAR) { + // estData.parts_tax_rates.PAR = { + // prt_discp: 0, + // prt_mktyp: true, + // prt_mkupp: 0, + // prt_type: "PAR", + // }; + // } + // estData.parts_tax_rates.PAR.prt_tax_rt = + // bodyshop.bill_tax_rates.state_tax_rate / 100; + // estData.parts_tax_rates.PAR.prt_tax_in = true; + // } + // } - //IO-1387 If a sublet line is NOT R&R, use the labor tax. If it is, use the sublet tax rate. - //Currently limited to SK shops only. - if (bodyshop.region_config === "CA_SK") { - estData.joblines.data.forEach((jl, index) => { - if ( - (jl.part_type === "PASL" || jl.part_type === "PAS") && - jl.lbr_op !== "OP11" - ) { - estData.joblines.data[index].tax_part = jl.lbr_tax; - } + //IO-1387 If a sublet line is NOT R&R, use the labor tax. If it is, use the sublet tax rate. + //Currently limited to SK shops only. + if (bodyshop.region_config === "CA_SK") { + estData.joblines.data.forEach((jl, index) => { + if ( + (jl.part_type === "PASL" || jl.part_type === "PAS") && + jl.lbr_op !== "OP11" + ) { + estData.joblines.data[index].tax_part = jl.lbr_tax; + } - //Set markup lines and tax lines as taxable. - //900510 is a mark up. 900510 is a discount. - if (jl.db_ref === "900510") { - estData.joblines.data[index].tax_part = true; - } - }); - } + //Set markup lines and tax lines as taxable. + //900510 is a mark up. 900510 is a discount. + if (jl.db_ref === "900510") { + estData.joblines.data[index].tax_part = true; + } + }); + } } async function ResolveCCCLineIssues(estData, bodyshop) { - //Find all misc amounts, populate them to the act price. - //TODO Ensure that this doesnt get violated - //This needs to be done before cleansing unq_seq since some misc prices could move over. - estData.joblines.data.forEach((line) => { - if (line.misc_amt && line.misc_amt !== 0) { - line.act_price = line.act_price + line.misc_amt; - line.tax_part = !!line.misc_tax; - } - }); + //Find all misc amounts, populate them to the act price. + //TODO Ensure that this doesnt get violated + //This needs to be done before cleansing unq_seq since some misc prices could move over. + estData.joblines.data.forEach((line) => { + if (line.misc_amt && line.misc_amt !== 0) { + line.act_price = line.act_price + line.misc_amt; + line.tax_part = !!line.misc_tax; + } + }); - //Generate the list of duplicated UNQ_SEQ that will feed into the next section to scrub the lines. - const unqSeqHash = _.groupBy(estData.joblines.data, "unq_seq"); - const duplicatedUnqSeq = Object.keys(unqSeqHash).filter( - (key) => unqSeqHash[key].length > 1 - ); - - duplicatedUnqSeq.forEach((unq_seq) => { - //Keys are strings, convert to int. - const int_unq_seq = parseInt(unq_seq); - - //When line splitting, the first line is always the non-refinish line. We will keep it as is. - //We will cleanse the second line, which is always the next line. - const nonRefLineIndex = estData.joblines.data.findIndex( - (line) => line.unq_seq === int_unq_seq + //Generate the list of duplicated UNQ_SEQ that will feed into the next section to scrub the lines. + const unqSeqHash = _.groupBy(estData.joblines.data, "unq_seq"); + const duplicatedUnqSeq = Object.keys(unqSeqHash).filter( + (key) => unqSeqHash[key].length > 1 ); - estData.joblines.data[nonRefLineIndex + 1] = { - ...estData.joblines.data[nonRefLineIndex + 1], - part_type: null, - act_price: 0, - db_price: 0, - prt_dsmk_p: 0, - prt_dsmk_m: 0, - }; - }); + + duplicatedUnqSeq.forEach((unq_seq) => { + //Keys are strings, convert to int. + const int_unq_seq = parseInt(unq_seq); + + //When line splitting, the first line is always the non-refinish line. We will keep it as is. + //We will cleanse the second line, which is always the next line. + const nonRefLineIndex = estData.joblines.data.findIndex( + (line) => line.unq_seq === int_unq_seq + ); + estData.joblines.data[nonRefLineIndex + 1] = { + ...estData.joblines.data[nonRefLineIndex + 1], + part_type: null, + act_price: 0, + db_price: 0, + prt_dsmk_p: 0, + prt_dsmk_m: 0, + }; + }); } diff --git a/client/src/components/jobs-change-status/jobs-change-status.component.jsx b/client/src/components/jobs-change-status/jobs-change-status.component.jsx index aa5f61fc2..daf384d9d 100644 --- a/client/src/components/jobs-change-status/jobs-change-status.component.jsx +++ b/client/src/components/jobs-change-status/jobs-change-status.component.jsx @@ -1,119 +1,119 @@ -import { DownCircleFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, Dropdown, Menu, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_JOB_STATUS } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {DownCircleFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, Dropdown, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_JOB_STATUS} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); -export function JobsChangeStatus({ job, bodyshop, jobRO, insertAuditTrail }) { - const { t } = useTranslation(); +export function JobsChangeStatus({job, bodyshop, jobRO, insertAuditTrail}) { + const {t} = useTranslation(); - const [availableStatuses, setAvailableStatuses] = useState([]); - const [otherStages, setOtherStages] = useState([]); - const [mutationUpdateJobstatus] = useMutation(UPDATE_JOB_STATUS); - const updateJobStatus = (status) => { - mutationUpdateJobstatus({ - variables: { jobId: job.id, status: status }, - }) - .then((r) => { - notification["success"]({ message: t("jobs.successes.save") }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobstatuschange(status), - }); - // refetch(); - }) - .catch((error) => { - notification["error"]({ message: t("jobs.errors.saving") }); - }); - }; + const [availableStatuses, setAvailableStatuses] = useState([]); + const [otherStages, setOtherStages] = useState([]); + const [mutationUpdateJobstatus] = useMutation(UPDATE_JOB_STATUS); + const updateJobStatus = (status) => { + mutationUpdateJobstatus({ + variables: {jobId: job.id, status: status}, + }) + .then((r) => { + notification["success"]({message: t("jobs.successes.save")}); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobstatuschange(status), + }); + // refetch(); + }) + .catch((error) => { + notification["error"]({message: t("jobs.errors.saving")}); + }); + }; - useEffect(() => { - //Figure out what scenario were in, populate accodingly - if (job && bodyshop) { - if ( - bodyshop.md_ro_statuses.pre_production_statuses.includes(job.status) - ) { - setAvailableStatuses(bodyshop.md_ro_statuses.pre_production_statuses); - if (bodyshop.md_ro_statuses.production_statuses[0]) - setOtherStages([bodyshop.md_ro_statuses.production_statuses[0]]); - } else if ( - bodyshop.md_ro_statuses.production_statuses.includes(job.status) - ) { - setAvailableStatuses(bodyshop.md_ro_statuses.production_statuses); - setOtherStages([ - bodyshop.md_ro_statuses.default_imported, - bodyshop.md_ro_statuses.default_delivered, - ]); - } else if ( - bodyshop.md_ro_statuses.post_production_statuses.includes(job.status) - ) { - setAvailableStatuses( - bodyshop.md_ro_statuses.post_production_statuses.filter( - (s) => - s !== bodyshop.md_ro_statuses.default_invoiced && - s !== bodyshop.md_ro_statuses.default_exported - ) - ); - if (bodyshop.md_ro_statuses.production_statuses[0]) - setOtherStages([bodyshop.md_ro_statuses.production_statuses[0]]); - } else { - console.log( - "Status didn't match any restrictions. Allowing all status changes." - ); - setAvailableStatuses(bodyshop.md_ro_statuses.statuses); - } + useEffect(() => { + //Figure out what scenario were in, populate accodingly + if (job && bodyshop) { + if ( + bodyshop.md_ro_statuses.pre_production_statuses.includes(job.status) + ) { + setAvailableStatuses(bodyshop.md_ro_statuses.pre_production_statuses); + if (bodyshop.md_ro_statuses.production_statuses[0]) + setOtherStages([bodyshop.md_ro_statuses.production_statuses[0]]); + } else if ( + bodyshop.md_ro_statuses.production_statuses.includes(job.status) + ) { + setAvailableStatuses(bodyshop.md_ro_statuses.production_statuses); + setOtherStages([ + bodyshop.md_ro_statuses.default_imported, + bodyshop.md_ro_statuses.default_delivered, + ]); + } else if ( + bodyshop.md_ro_statuses.post_production_statuses.includes(job.status) + ) { + setAvailableStatuses( + bodyshop.md_ro_statuses.post_production_statuses.filter( + (s) => + s !== bodyshop.md_ro_statuses.default_invoiced && + s !== bodyshop.md_ro_statuses.default_exported + ) + ); + if (bodyshop.md_ro_statuses.production_statuses[0]) + setOtherStages([bodyshop.md_ro_statuses.production_statuses[0]]); + } else { + console.log( + "Status didn't match any restrictions. Allowing all status changes." + ); + setAvailableStatuses(bodyshop.md_ro_statuses.statuses); + } + } + }, [job, setAvailableStatuses, bodyshop]); + + const statusMenu = { + items: [ + ...availableStatuses.map((item) => ({ + key: item, + label: item, + })), + ...(job.converted + ? [ + {type: "divider"}, + ...otherStages.map((item) => ({ + key: item, + label: item, + })), + ] + : []), + ], + onClick: (e) => updateJobStatus(e.key) } - }, [job, setAvailableStatuses, bodyshop]); - const statusmenu = ( - { - updateJobStatus(e.key); - }} - > - {availableStatuses.map((item) => ( - {item} - ))} - {job.converted && ( - <> - - {otherStages.map((item, idx) => ( - {item} - ))} - - )} - - ); + return ( + + - - ); + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsChangeStatus); diff --git a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx index c315cf009..346c88d55 100644 --- a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx +++ b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx @@ -1,87 +1,90 @@ -import { Button, Dropdown, Menu } from "antd"; +import {Button, Dropdown} from "antd"; import _ from "lodash"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) { - const { t } = useTranslation(); +export function JobsCloseAutoAllocate({bodyshop, joblines, form, disabled}) { + const {t} = useTranslation(); - const handleAllocate = (defaults) => { - form.setFieldsValue({ - joblines: joblines.map((jl) => { - const ret = _.cloneDeep(jl); - if (jl.part_type) { - ret.profitcenter_part = defaults.profits[jl.part_type.toUpperCase()]; - } else { - } - if (jl.mod_lbr_ty) { - ret.profitcenter_labor = - defaults.profits[jl.mod_lbr_ty.toUpperCase()]; - } else { - ret.profitcenter_labor = null; - } - //Verify that this is also manually updated in server/job-costing - if (!jl.part_type && !jl.mod_lbr_ty) { - const lineDesc = jl.line_desc ? jl.line_desc.toLowerCase() : ""; - if (lineDesc.includes("shop materials")) { - ret.profitcenter_part = defaults.profits["MASH"]; - } else if (lineDesc.includes("paint/materials")) { - ret.profitcenter_part = defaults.profits["MAPA"]; - } else if (lineDesc.includes("ats amount")) { - ret.profitcenter_part = defaults.profits["ATS"]; - } else if (jl.act_price > 0) { - ret.profitcenter_part = defaults.profits["PAO"]; - } else { - ret.profitcenter_part = null; - } - } - return ret; - }), - }); - }; + const handleAllocate = (defaults) => { + form.setFieldsValue({ + joblines: joblines.map((jl) => { + const ret = _.cloneDeep(jl); + if (jl.part_type) { + ret.profitcenter_part = defaults.profits[jl.part_type.toUpperCase()]; + } else { + } + if (jl.mod_lbr_ty) { + ret.profitcenter_labor = + defaults.profits[jl.mod_lbr_ty.toUpperCase()]; + } else { + ret.profitcenter_labor = null; + } + //Verify that this is also manually updated in server/job-costing + if (!jl.part_type && !jl.mod_lbr_ty) { + const lineDesc = jl.line_desc ? jl.line_desc.toLowerCase() : ""; + if (lineDesc.includes("shop materials")) { + ret.profitcenter_part = defaults.profits["MASH"]; + } else if (lineDesc.includes("paint/materials")) { + ret.profitcenter_part = defaults.profits["MAPA"]; + } else if (lineDesc.includes("ats amount")) { + ret.profitcenter_part = defaults.profits["ATS"]; + } else if (jl.act_price > 0) { + ret.profitcenter_part = defaults.profits["PAO"]; + } else { + ret.profitcenter_part = null; + } + } + return ret; + }), + }); + }; - const handleAutoAllocateClick = () => { - logImEXEvent("jobs_close_allocate_auto"); + const handleAutoAllocateClick = () => { + logImEXEvent("jobs_close_allocate_auto"); - const { defaults } = bodyshop.md_responsibility_centers; - handleAllocate(defaults); - }; + const {defaults} = bodyshop.md_responsibility_centers; + handleAllocate(defaults); + }; - const handleMenuClick = ({ item, key, keyPath, domEvent }) => { - logImEXEvent("jobs_close_allocate_auto_dms"); - form.setFieldsValue({ dms_allocation: key }); - handleAllocate( - bodyshop.md_responsibility_centers.dms_defaults.find( - (x) => x.name === key - ) + const handleMenuClick = ({item, key, keyPath, domEvent}) => { + logImEXEvent("jobs_close_allocate_auto_dms"); + form.setFieldsValue({dms_allocation: key}); + handleAllocate( + bodyshop.md_responsibility_centers.dms_defaults.find( + (x) => x.name === key + ) + ); + }; + + const menu = bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? { + items: bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => ({ + key: mapping.name, + label: mapping.name, + disabled: disabled, + })), + onClick: handleMenuClick, + } : { + items: [] + } + + return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? ( + + + + ) : ( + ); - }; - - const overlay = (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - {bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => ( - - {mapping.name} - - ))} - - ); - - return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? ( - - - - ) : ( - - ); } + export default connect(mapStateToProps, null)(JobsCloseAutoAllocate); diff --git a/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx b/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx index 8bbda03e1..8245af6d1 100644 --- a/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx +++ b/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx @@ -1,230 +1,227 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { auth, logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); function updateJobCache(items) { - client.cache.modify({ - id: "ROOT_QUERY", - fields: { - jobs(existingJobs = []) { - return existingJobs.filter( - (jobRef) => jobRef.__ref.includes(items) === false - ); - }, - }, - }); + client.cache.modify({ + id: "ROOT_QUERY", + fields: { + jobs(existingJobs = []) { + return existingJobs.filter( + (jobRef) => jobRef.__ref.includes(items) === false + ); + }, + }, + }); } export function JobsCloseExportButton({ - bodyshop, - currentUser, - jobId, - disabled, - setSelectedJobs, - refetch, -}) { - const history = useHistory(); - const { t } = useTranslation(); - const [updateJob] = useMutation(UPDATE_JOB); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const [loading, setLoading] = useState(false); + bodyshop, + currentUser, + jobId, + disabled, + setSelectedJobs, + refetch, + }) { + const history = useNavigate(); + const {t} = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOB); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + const [loading, setLoading] = useState(false); - const handleQbxml = async () => { - //Check if it's a CDK setup. - if (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) { - history.push(`/manage/dms?jobId=${jobId}`); - return; - } - logImEXEvent("jobs_close_export"); - - setLoading(true); - //Check if it's a QBO Setup. - let PartnerResponse; - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { - PartnerResponse = await axios.post(`/qbo/receivables`, { - jobIds: [jobId], - elgen: true, - }); - } else { - //Default is QBD - - let QbXmlResponse; - try { - QbXmlResponse = await axios.post( - "/accounting/qbxml/receivables", - { jobIds: [jobId] }, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } - ); - console.log("handle -> XML", QbXmlResponse); - } catch (error) { - console.log("Error getting QBXML from Server.", error); - notification["error"]({ - message: t("jobs.errors.exporting", { - error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), - }), - }); - setLoading(false); - return; - } - - try { - PartnerResponse = await axios.post( - "http://localhost:1337/qb/", - // "http://609feaeae986.ngrok.io/qb/", - QbXmlResponse.data, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } - ); - } catch (error) { - console.log("Error connecting to quickbooks or partner.", error); - notification["error"]({ - message: t("jobs.errors.exporting-partner"), - }); - setLoading(false); - return; - } - } - - console.log("PartnerResponse", PartnerResponse); - - //Check to see if any of them failed. If they didn't don't execute the update. - const failedTransactions = PartnerResponse.data.filter((r) => !r.success); - const successfulTransactions = PartnerResponse.data.filter( - (r) => r.success - ); - if (failedTransactions.length > 0) { - //Uh oh. At least one was no good. - failedTransactions.forEach((ft) => { - //insert failed export log - notification.open({ - // key: "failedexports", - type: "error", - message: t("jobs.errors.exporting", { - error: ft.errorMessage || "", - }), - }); - }); - - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - jobid: jobId, - successful: false, - message: JSON.stringify( - failedTransactions.map((ft) => ft.errorMessage) - ), - useremail: currentUser.email, - }, - ], - }, - }); - } - } else { - //Insert success export log. - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - jobid: jobId, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); - - const jobUpdateResponse = await updateJob({ - variables: { - jobId: jobId, - job: { - status: bodyshop.md_ro_statuses.default_exported || "Exported*", - date_exported: new Date(), - }, - }, - }); - - if (!!!jobUpdateResponse.errors) { - notification.open({ - type: "success", - key: "jobsuccessexport", - message: t("jobs.successes.exported"), - }); - updateJobCache( - jobUpdateResponse.data.update_jobs.returning.map((job) => job.id) - ); - } else { - notification["error"]({ - message: t("jobs.errors.exporting", { - error: JSON.stringify(jobUpdateResponse.error), - }), - }); + const handleQbxml = async () => { + //Check if it's a CDK setup. + if (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) { + history(`/manage/dms?jobId=${jobId}`); + return; } - } - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { - notification.open({ - type: "success", - key: "jobsuccessexport", - message: t("jobs.successes.exported"), - }); - updateJobCache([ - ...new Set( - successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && bodyshop.accountingconfig.qbo - ? "jobid" - : "id" - ] - ) - ), - ]); - } - if (setSelectedJobs) { - setSelectedJobs((selectedJobs) => { - return selectedJobs.filter((i) => i !== jobId); - }); - } - } - setLoading(false); - }; + logImEXEvent("jobs_close_export"); - return ( - - ); + setLoading(true); + //Check if it's a QBO Setup. + let PartnerResponse; + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { + PartnerResponse = await axios.post(`/qbo/receivables`, { + jobIds: [jobId], + elgen: true, + }); + } else { + //Default is QBD + + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/receivables", + {jobIds: [jobId]}, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("jobs.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + setLoading(false); + return; + } + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + // "http://609feaeae986.ngrok.io/qb/", + QbXmlResponse.data, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("jobs.errors.exporting-partner"), + }); + setLoading(false); + return; + } + } + + console.log("PartnerResponse", PartnerResponse); + + //Check to see if any of them failed. If they didn't don't execute the update. + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.forEach((ft) => { + //insert failed export log + notification.open({ + // key: "failedexports", + type: "error", + message: t("jobs.errors.exporting", { + error: ft.errorMessage || "", + }), + }); + }); + + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + jobid: jobId, + successful: false, + message: JSON.stringify( + failedTransactions.map((ft) => ft.errorMessage) + ), + useremail: currentUser.email, + }, + ], + }, + }); + } + } else { + //Insert success export log. + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + jobid: jobId, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); + + const jobUpdateResponse = await updateJob({ + variables: { + jobId: jobId, + job: { + status: bodyshop.md_ro_statuses.default_exported || "Exported*", + date_exported: new Date(), + }, + }, + }); + + if (!!!jobUpdateResponse.errors) { + notification.open({ + type: "success", + key: "jobsuccessexport", + message: t("jobs.successes.exported"), + }); + updateJobCache( + jobUpdateResponse.data.update_jobs.returning.map((job) => job.id) + ); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(jobUpdateResponse.error), + }), + }); + } + } + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { + notification.open({ + type: "success", + key: "jobsuccessexport", + message: t("jobs.successes.exported"), + }); + updateJobCache([ + ...new Set( + successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && bodyshop.accountingconfig.qbo + ? "jobid" + : "id" + ] + ) + ), + ]); + } + if (setSelectedJobs) { + setSelectedJobs((selectedJobs) => { + return selectedJobs.filter((i) => i !== jobId); + }); + } + } + setLoading(false); + }; + + return ( + + ); } export default connect(mapStateToProps, null)(JobsCloseExportButton); diff --git a/client/src/components/jobs-close-lines/jobs-close-lines.component.jsx b/client/src/components/jobs-close-lines/jobs-close-lines.component.jsx index bbb3f978e..98acce7e2 100644 --- a/client/src/components/jobs-close-lines/jobs-close-lines.component.jsx +++ b/client/src/components/jobs-close-lines/jobs-close-lines.component.jsx @@ -1,215 +1,216 @@ -import { Form, Select, Space, Tooltip } from "antd"; +import {Form, Select, Space, Tooltip} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import LaborTypeFormItem from "../form-items-formatted/labor-type-form-item.component"; import PartTypeFormItem from "../form-items-formatted/part-type-form-item.component"; import ReadOnlyFormItem from "../form-items-formatted/read-only-form-item.component"; -import { WarningOutlined } from "@ant-design/icons"; +import {WarningOutlined} from "@ant-design/icons"; import "./jobs-close-lines.styles.scss"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JobsCloseLines({ bodyshop, job, jobRO }) { - const { t } = useTranslation(); - return ( -
- - {(fields, { add, remove, move }) => { - return ( -
- - - - - - - - - - - - - - - {fields.map((field, index) => ( - - - - - - - - - - - - ))} - -
{t("joblines.fields.line_desc")}{t("joblines.fields.part_type")}{t("joblines.fields.act_price")}{t("joblines.fields.prt_dsmk_m")}{t("joblines.fields.op_code_desc")}{t("joblines.fields.mod_lbr_ty")}{t("joblines.fields.mod_lb_hrs")}{t("joblines.fields.profitcenter_part")}{t("joblines.fields.profitcenter_labor")}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ); - }} - - - ); +export function JobsCloseLines({bodyshop, job, jobRO}) { + const {t} = useTranslation(); + return ( +
+ + {(fields, {add, remove, move}) => { + return ( + + + + + + + + + + + + + + + + {fields.map((field, index) => ( + + + + + + + + + + + + ))} + +
{t("joblines.fields.line_desc")}{t("joblines.fields.part_type")}{t("joblines.fields.act_price")}{t("joblines.fields.prt_dsmk_m")}{t("joblines.fields.op_code_desc")}{t("joblines.fields.mod_lbr_ty")}{t("joblines.fields.mod_lb_hrs")}{t("joblines.fields.profitcenter_part")}{t("joblines.fields.profitcenter_labor")}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + }} +
+
+ ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsCloseLines); -const HasBeenConvertedTolabor = ({ value }) => { - const { t } = useTranslation(); - - if (!value) return null; - return ( - - - - ); +const HasBeenConvertedTolabor = ({value}) => { + const {t} = useTranslation(); + + if (!value) return null; + return ( + + + + ); }; diff --git a/client/src/components/jobs-close-lines/jobs-close-lines.styles.scss b/client/src/components/jobs-close-lines/jobs-close-lines.styles.scss index 578d57155..e68b23d22 100644 --- a/client/src/components/jobs-close-lines/jobs-close-lines.styles.scss +++ b/client/src/components/jobs-close-lines/jobs-close-lines.styles.scss @@ -12,6 +12,7 @@ margin-bottom: 0px !important; } } + tr:hover { background-color: #f5f5f5; } diff --git a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx index 543ad36ca..3c54e0fad 100644 --- a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx +++ b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx @@ -1,281 +1,275 @@ -import { useMutation } from "@apollo/client"; -import { - Button, - Form, - Input, - notification, - Popover, - Select, - Space, - Switch, -} from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, Form, Input, notification, Popover, Select, Space, Switch,} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { CONVERT_JOB_TO_RO } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {CONVERT_JOB_TO_RO} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function JobsConvertButton({ - bodyshop, - job, - refetch, - jobRO, - insertAuditTrail, - parentFormIsFieldsTouched, -}) { - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [mutationConvertJob] = useMutation(CONVERT_JOB_TO_RO); - const { t } = useTranslation(); - const [form] = Form.useForm(); + bodyshop, + job, + refetch, + jobRO, + insertAuditTrail, + parentFormIsFieldsTouched, + }) { + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); + const [mutationConvertJob] = useMutation(CONVERT_JOB_TO_RO); + const {t} = useTranslation(); + const [form] = Form.useForm(); - const handleConvert = async ({ employee_csr, category, ...values }) => { - if (parentFormIsFieldsTouched()) { - alert(t("jobs.labels.savebeforeconversion")); - return; - } - setLoading(true); - const res = await mutationConvertJob({ - variables: { - jobId: job.id, - job: { - converted: true, - ...(bodyshop.enforce_conversion_csr ? { employee_csr } : {}), - ...(bodyshop.enforce_conversion_category ? { category } : {}), - ...values, - }, - }, - }); - - if (values.ca_gst_registrant) { - await axios.post("/job/totalsssu", { - id: job.id, - }); - } - - if (!res.errors) { - refetch(); - notification["success"]({ - message: t("jobs.successes.converted"), - }); - - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobconverted( - res.data.update_jobs.returning[0].ro_number - ), - }); - - setVisible(false); - } - setLoading(false); - }; - - const popMenu = ( -
-
- - - - {bodyshop.enforce_class && ( - - - - )} - {bodyshop.enforce_referral && ( - <> - { + if (parentFormIsFieldsTouched()) { + alert(t("jobs.labels.savebeforeconversion")); + return; + } + setLoading(true); + const res = await mutationConvertJob({ + variables: { + jobId: job.id, + job: { + converted: true, + ...(bodyshop.enforce_conversion_csr ? {employee_csr} : {}), + ...(bodyshop.enforce_conversion_category ? {category} : {}), + ...values, }, - ]} - > - - - - - - - )} - {bodyshop.enforce_conversion_csr && ( - - - - )} - {bodyshop.enforce_conversion_category && ( - - - - )} - {bodyshop.region_config.toLowerCase().startsWith("ca") && ( - - - - )} - - - - - - - - - - -
-
- ); + }, + }); - if (job.converted) return <>; + if (values.ca_gst_registrant) { + await axios.post("/job/totalsssu", { + id: job.id, + }); + } - return ( - - - - ); + if (!res.errors) { + refetch(); + notification["success"]({ + message: t("jobs.successes.converted"), + }); + + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobconverted( + res.data.update_jobs.returning[0].ro_number + ), + }); + + setOpen(false); + } + setLoading(false); + }; + + const popMenu = ( +
+
+ + + + {bodyshop.enforce_class && ( + + + + )} + {bodyshop.enforce_referral && ( + <> + + + + + + + + )} + {bodyshop.enforce_conversion_csr && ( + + + + )} + {bodyshop.enforce_conversion_category && ( + + + + )} + {bodyshop.region_config.toLowerCase().startsWith("ca") && ( + + + + )} + + + + + + + + + + +
+
+ ); + + if (job.converted) return <>; + + return ( + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsConvertButton); diff --git a/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx b/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx index 31fa53a23..cdac7ee84 100644 --- a/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx +++ b/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx @@ -1,15 +1,13 @@ -import { Collapse, Form, Input, Select, Switch } from "antd"; +import {Collapse, Form, Input, Select, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import FormItemPhone, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import FormItemPhone, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import JobsDetailRatesChangeButton from "../jobs-detail-rates-change-button/jobs-detail-rates-change-button.component"; import JobsDetailRatesParts from "../jobs-detail-rates/jobs-detail-rates.parts.component"; @@ -20,355 +18,357 @@ import JobsDetailRatesTaxes from "../jobs-detail-rates/jobs-detail-rates.taxes.c import JobsMarkPstExempt from "../jobs-mark-pst-exempt/jobs-mark-pst-exempt.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JobsCreateJobsInfo({ bodyshop, form, selected }) { - const { t } = useTranslation(); - const { getFieldValue } = form; - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PhoneItemFormatterValidation(getFieldValue, "ins_ph1"), - ]} - > - - - - - +export function JobsCreateJobsInfo({bodyshop, form, selected}) { + const {t} = useTranslation(); + const {getFieldValue} = form; + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PhoneItemFormatterValidation(getFieldValue, "ins_ph1"), + ]} + > + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {bodyshop.region_config.toLowerCase().startsWith("ca") && ( - - - - )} - - - - - - - - - - - - - - { - // - // - // - // - // - // - // - // - // - // - // - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // - // - // - // - // - } - - - - - - - - - - - - - - -
- ); + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {bodyshop.region_config.toLowerCase().startsWith("ca") && ( + + + + )} + + + + + + + + + + + + + + { + // + // + // + // + // + // + // + // + // + // + // + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // + // + // + // + // + } + + + + + + + + +
+ + + + + +
+ ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsCreateJobsInfo); diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx index 0b75e6826..af0fd57b8 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx @@ -1,52 +1,52 @@ -import { Checkbox, Col, Row } from "antd"; -import React, { useContext } from "react"; -import { useTranslation } from "react-i18next"; +import {Checkbox, Col, Row} from "antd"; +import React, {useContext} from "react"; +import {useTranslation} from "react-i18next"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import JobsCreateOwnerInfoNewComponent from "./jobs-create-owner-info.new.component"; import JobsCreateOwnerInfoSearchComponent from "./jobs-create-owner-info.search.component"; const colSpan = { - sm: { span: 24 }, - lg: { span: 12 }, + sm: {span: 24}, + lg: {span: 12}, }; -export default function JobsCreateOwnerInfoComponent({ loading, owners }) { - const { t } = useTranslation(); - const [state, setState] = useContext(JobCreateContext); +export default function JobsCreateOwnerInfoComponent({loading, owners}) { + const {t} = useTranslation(); + const [state, setState] = useContext(JobCreateContext); - return ( -
- - - { - setState({ - ...state, - owner: { - ...state.owner, - new: !state.owner.new, - selectedid: null, - }, - }); - }} - > - {t("jobs.labels.create.newowner")} - - + return ( +
+ + + { + setState({ + ...state, + owner: { + ...state.owner, + new: !state.owner.new, + selectedid: null, + }, + }); + }} + > + {t("jobs.labels.create.newowner")} + + - - - + + + - - - - -
- ); + + + +
+
+ ); } diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx index 2434fb569..2ff02825d 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx @@ -1,24 +1,24 @@ -import { useQuery } from "@apollo/client"; -import React, { useContext } from "react"; -import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; +import {useQuery} from "@apollo/client"; +import React, {useContext} from "react"; +import {QUERY_SEARCH_OWNER_BY_IDX} from "../../graphql/owners.queries"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import AlertComponent from "../alert/alert.component"; import JobsCreateOwnerInfoComponent from "./jobs-create-owner-info.component"; export default function JobsCreateOwnerContainer() { - const [state] = useContext(JobCreateContext); - const { loading, error, data } = useQuery(QUERY_SEARCH_OWNER_BY_IDX, { - variables: { search: `%${state.owner.search}%` }, - skip: !state.owner.search, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const [state] = useContext(JobCreateContext); + const {loading, error, data} = useQuery(QUERY_SEARCH_OWNER_BY_IDX, { + variables: {search: `%${state.owner.search}%`}, + skip: !state.owner.search, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (error) return ; - return ( - - ); + if (error) return ; + return ( + + ); } diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx index 2dea9a657..7eb8d794c 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx @@ -1,163 +1,178 @@ -import { Form, Input, Switch } from "antd"; -import React, { useContext } from "react"; -import { useTranslation } from "react-i18next"; +import {Form, Input, Switch} from "antd"; +import React, {useContext} from "react"; +import {useTranslation} from "react-i18next"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import FormItemPhone, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import FormItemPhone, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; export default function JobsCreateOwnerInfoNewComponent() { - const [state] = useContext(JobCreateContext); + const [state] = useContext(JobCreateContext); - const { t } = useTranslation(); - return ( -
- - - - - - - - + const {t} = useTranslation(); + return ( +
+ + ({ + required: + state.owner.new && + (!getFieldValue(["owner", "data", "ownr_co_nm"]) || + getFieldValue(["owner", "data", "ownr_co_nm"]) === ""), + //message: t("general.validation.required"), + }), + ]} + > + + + ({ + required: + state.owner.new && + (!getFieldValue(["owner", "data", "ownr_co_nm"]) || + getFieldValue(["owner", "data", "ownr_co_nm"]) === ""), + //message: t("general.validation.required"), + }), + ]} + > + + + - - - - - - - - + + + + + ({ + required: + state.owner.new && + (!getFieldValue(["owner", "data", "ownr_ln"]) || + !getFieldValue(["owner", "data", "ownr_fn"]) || + getFieldValue(["owner", "data", "ownr_ln"]) === "" || + getFieldValue(["owner", "data", "ownr_fn"]) === ""), + //message: t("general.validation.required"), + }), + ]} + > + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - PhoneItemFormatterValidation( - getFieldValue, - "owner.data.ownr_ph1" - ), - ]} - > - - - - PhoneItemFormatterValidation( - getFieldValue, - "owner.data.ownr_ph2" - ), - ]} - > - - - - - - - - - - - -
- ); + + + + + + PhoneItemFormatterValidation( + getFieldValue, + "owner.data.ownr_ph1" + ), + ]} + > + + + + PhoneItemFormatterValidation( + getFieldValue, + "owner.data.ownr_ph2" + ), + ]} + > + + + + + + + + + + + +
+ ); } diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx index 9a3e56558..6a58fb409 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx @@ -1,165 +1,165 @@ -import { Card, Input, Table } from "antd"; -import React, { useContext, useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Card, Input, Table} from "antd"; +import React, {useContext, useState} from "react"; +import {useTranslation} from "react-i18next"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import PhoneFormatter from "../../utils/PhoneFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {alphaSort} from "../../utils/sorters"; export default function JobsCreateOwnerInfoSearchComponent({ - loading, - owners, -}) { - const [state, setState] = useContext(JobCreateContext); - const [tableState, setTableState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + loading, + owners, + }) { + const [state, setState] = useContext(JobCreateContext); + const [tableState, setTableState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("owners.fields.ownr_ln"), - dataIndex: "ownr_ln", - key: "ownr_ln", - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_ln" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_fn"), - dataIndex: "ownr_fn", - key: "ownr_fn", - sorter: (a, b) => alphaSort(a.ownr_fn, b.ownr_fn), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_fn" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_co_nm"), - dataIndex: "ownr_co_nm", - key: "ownr_co_nm", - sorter: (a, b) => alphaSort(a.ownr_co_nm, b.ownr_co_nm), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_co_nm" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_addr1"), - dataIndex: "ownr_addr1", - key: "ownr_addr1", - sorter: (a, b) => alphaSort(a.ownr_addr1, b.ownr_addr1), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_addr1" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_city"), - dataIndex: "ownr_city", - key: "ownr_city", - sorter: (a, b) => alphaSort(a.ownr_city, b.ownr_city), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_city" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_ea"), - dataIndex: "ownr_ea", - key: "ownr_ea", - sorter: (a, b) => alphaSort(a.ownr_ea, b.ownr_ea), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_ea" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - render: (text, record) => ( - {record.ownr_ph1} - ), - sorter: (a, b) => alphaSort(a.ownr_ph1, b.ownr_ph1), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_ph1" && - tableState.sortedInfo.order, - }, - { - title: t("owners.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - render: (text, record) => ( - {record.ownr_ph2} - ), - sorter: (a, b) => alphaSort(a.ownr_ph2, b.ownr_ph2), - sortOrder: - tableState.sortedInfo.columnKey === "ownr_ph2" && - tableState.sortedInfo.order, - }, - ]; + const columns = [ + { + title: t("owners.fields.ownr_ln"), + dataIndex: "ownr_ln", + key: "ownr_ln", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_ln" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_fn"), + dataIndex: "ownr_fn", + key: "ownr_fn", + sorter: (a, b) => alphaSort(a.ownr_fn, b.ownr_fn), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_fn" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_co_nm"), + dataIndex: "ownr_co_nm", + key: "ownr_co_nm", + sorter: (a, b) => alphaSort(a.ownr_co_nm, b.ownr_co_nm), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_co_nm" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_addr1"), + dataIndex: "ownr_addr1", + key: "ownr_addr1", + sorter: (a, b) => alphaSort(a.ownr_addr1, b.ownr_addr1), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_addr1" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_city"), + dataIndex: "ownr_city", + key: "ownr_city", + sorter: (a, b) => alphaSort(a.ownr_city, b.ownr_city), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_city" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + sorter: (a, b) => alphaSort(a.ownr_ea, b.ownr_ea), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_ea" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + render: (text, record) => ( + {record.ownr_ph1} + ), + sorter: (a, b) => alphaSort(a.ownr_ph1, b.ownr_ph1), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_ph1" && + tableState.sortedInfo.order, + }, + { + title: t("owners.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + render: (text, record) => ( + {record.ownr_ph2} + ), + sorter: (a, b) => alphaSort(a.ownr_ph2, b.ownr_ph2), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_ph2" && + tableState.sortedInfo.order, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setTableState({ ...tableState, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setTableState({...tableState, filteredInfo: filters, sortedInfo: sorter}); + }; - return ( - { - setState({ - ...state, - owner: { ...state.owner, search: value }, - }); - }} - enterButton - /> - } - > - { - setState({ - ...state, - owner: { ...state.owner, new: false, selectedid: props.id }, - }); - }, - type: "radio", - selectedRowKeys: [state.owner.selectedid], - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - if (record) { - if (record.id) { - setState({ - ...state, - owner: { - ...state.owner, - new: false, - selectedid: record.id, + return ( + { + setState({ + ...state, + owner: {...state.owner, search: value}, + }); + }} + enterButton + /> + } + > +
{ + setState({ + ...state, + owner: {...state.owner, new: false, selectedid: props.id}, + }); }, - }); + type: "radio", + selectedRowKeys: [state.owner.selectedid], + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + if (record) { + if (record.id) { + setState({ + ...state, + owner: { + ...state.owner, + new: false, + selectedid: record.id, + }, + }); - return; - } - } - setState({ - ...state, - owner: { ...state.owner, selectedid: null }, - }); - }, - }; - }} - /> - - ); + return; + } + } + setState({ + ...state, + owner: {...state.owner, selectedid: null}, + }); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx index b3cbe0fdd..4cdad32bf 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx @@ -1,70 +1,71 @@ -import { Checkbox, Col, Row } from "antd"; -import React, { useContext } from "react"; +import {Checkbox, Col, Row} from "antd"; +import React, {useContext} from "react"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import JobsCreateVehicleInfoNewComponent from "./jobs-create-vehicle-info.new.component"; import JobsCreateVehicleInfoSearchComponent from "./jobs-create-vehicle-info.search.component"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; + const colSpan = { - sm: { span: 24 }, - lg: { span: 12 }, + sm: {span: 24}, + lg: {span: 12}, }; export default function JobsCreateVehicleInfoComponent({ - loading, - vehicles, - form, -}) { - const [state, setState] = useContext(JobCreateContext); - const { t } = useTranslation(); - return ( -
- -
- { - setState({ - ...state, - vehicle: { - ...state.vehicle, - none: false, - new: !state.vehicle.new, - selectedid: null, - }, - }); - }} - > - {t("jobs.labels.create.newvehicle")} - - { - setState({ - ...state, - vehicle: { - ...state.vehicle, - new: false, - none: !state.vehicle.none, - selectedid: null, - }, - }); - }} - > - {t("jobs.labels.create.novehicle")} - - - - - - - - - - - ); + loading, + vehicles, + form, + }) { + const [state, setState] = useContext(JobCreateContext); + const {t} = useTranslation(); + return ( +
+ +
+ { + setState({ + ...state, + vehicle: { + ...state.vehicle, + none: false, + new: !state.vehicle.new, + selectedid: null, + }, + }); + }} + > + {t("jobs.labels.create.newvehicle")} + + { + setState({ + ...state, + vehicle: { + ...state.vehicle, + new: false, + none: !state.vehicle.none, + selectedid: null, + }, + }); + }} + > + {t("jobs.labels.create.novehicle")} + + + + + + + + + + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx index 072930164..a9bfa39c0 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx @@ -1,26 +1,26 @@ -import { useQuery } from "@apollo/client"; -import React, { useContext } from "react"; -import { SEARCH_VEHICLES } from "../../graphql/vehicles.queries"; +import {useQuery} from "@apollo/client"; +import React, {useContext} from "react"; +import {SEARCH_VEHICLES} from "../../graphql/vehicles.queries"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import AlertComponent from "../alert/alert.component"; import JobsCreateVehicleInfoComponent from "./jobs-create-vehicle-info.component"; -export default function JobsCreateVehicleInfoContainer({ form }) { - const [state] = useContext(JobCreateContext); - const { loading, error, data } = useQuery(SEARCH_VEHICLES, { - variables: { search: `%${state.vehicle.search}%` }, - skip: !state.vehicle.search, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +export default function JobsCreateVehicleInfoContainer({form}) { + const [state] = useContext(JobCreateContext); + const {loading, error, data} = useQuery(SEARCH_VEHICLES, { + variables: {search: `%${state.vehicle.search}%`}, + skip: !state.vehicle.search, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (error) return ; + if (error) return ; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.new.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.new.component.jsx index 0813f9f21..dad4385cd 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.new.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.new.component.jsx @@ -1,202 +1,202 @@ -import { Form, Input } from "antd"; -import React, { useContext } from "react"; -import { useTranslation } from "react-i18next"; +import {Form, Input} from "antd"; +import React, {useContext} from "react"; +import {useTranslation} from "react-i18next"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import JobsCreateVehicleInfoPredefined from "./jobs-create-vehicle-info.predefined.component"; -export default function JobsCreateVehicleInfoNewComponent({ form }) { - const [state] = useContext(JobCreateContext); +export default function JobsCreateVehicleInfoNewComponent({form}) { + const [state] = useContext(JobCreateContext); - const { t } = useTranslation(); - return ( -
- - - - - - - - - - - - - + const {t} = useTranslation(); + return ( +
+ + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // - // - } - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // + // + } + + + + + + + + + + + + + + + + + + + + - - - - - -
- ); + + + + + +
+ ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx index c2c2404ac..a8e577419 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx @@ -1,81 +1,81 @@ -import { PlusOutlined, SearchOutlined } from "@ant-design/icons"; -import { Button, Input, Popover, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {PlusOutlined, SearchOutlined} from "@ant-design/icons"; +import {Button, Input, Popover, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import PredefinedVehicles from "./predefined-vehicles.js"; -export default function JobsCreateVehicleInfoPredefined({ disabled, form }) { - const [open, setOpen] = useState(false); - const [search, setSearch] = useState(""); - const { t } = useTranslation(); - const handleOpenChange = (newOpen) => { - setOpen(newOpen); - setSearch(""); - }; - const filteredPredefinedVehicles = - search === "" - ? PredefinedVehicles - : PredefinedVehicles.filter( - (v) => - v.make.toLowerCase().includes(search.toLowerCase()) || - v.model.toLowerCase().includes(search.toLowerCase()) - ); +export default function JobsCreateVehicleInfoPredefined({disabled, form}) { + const [open, setOpen] = useState(false); + const [search, setSearch] = useState(""); + const {t} = useTranslation(); + const handleOpenChange = (newOpen) => { + setOpen(newOpen); + setSearch(""); + }; + const filteredPredefinedVehicles = + search === "" + ? PredefinedVehicles + : PredefinedVehicles.filter( + (v) => + v.make.toLowerCase().includes(search.toLowerCase()) || + v.model.toLowerCase().includes(search.toLowerCase()) + ); - const popContent = () => ( -
-
setSearch(value)} />} - dataSource={filteredPredefinedVehicles} - columns={[ - { - dataIndex: "make", - key: "make", - title: t("vehicles.fields.v_make_desc"), - }, - { - dataIndex: "model", - key: "model", - title: t("vehicles.fields.v_model_desc"), - }, - { - dataIndex: "select", - key: "select", - title: t("general.labels.actions"), - render: (value, record) => ( -
setSearch(value)}/>} + dataSource={filteredPredefinedVehicles} + columns={[ + { + dataIndex: "make", + key: "make", + title: t("vehicles.fields.v_make_desc"), }, - }); - setOpen(false); - setSearch(""); - }} - > - - - ), - }, - ]} - /> - - ); - return ( - - - - ); + { + dataIndex: "model", + key: "model", + title: t("vehicles.fields.v_model_desc"), + }, + { + dataIndex: "select", + key: "select", + title: t("general.labels.actions"), + render: (value, record) => ( + + ), + }, + ]} + /> + + ); + return ( + + + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx index b4c4152c8..44495f613 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx @@ -1,134 +1,134 @@ -import React, { useContext, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Table, Input, Card, Space } from "antd"; -import { Link } from "react-router-dom"; -import { alphaSort } from "../../utils/sorters"; +import React, {useContext, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Card, Input, Space, Table} from "antd"; +import {Link} from "react-router-dom"; +import {alphaSort} from "../../utils/sorters"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; export default function JobsCreateVehicleInfoSearchComponent({ - loading, - vehicles, -}) { - const [state, setState] = useContext(JobCreateContext); - const [tableState, setTableState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + loading, + vehicles, + }) { + const [state, setState] = useContext(JobCreateContext); + const [tableState, setTableState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("vehicles.fields.v_vin"), - dataIndex: "v_vin", - key: "v_vin", - sorter: (a, b) => alphaSort(a.v_vin, b.v_vin), - sortOrder: - tableState.sortedInfo.columnKey === "v_vin" && - tableState.sortedInfo.order, - render: (text, record) => ( - - {record.v_vin} - - ), - }, - { - title: t("vehicles.fields.description"), - dataIndex: "description", - key: "description", - render: (text, record) => { - return ( - {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc} ${record.v_color}`} - ); - }, - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate", - key: "plate", - render: (text, record) => { - return {`${record.plate_st} | ${record.plate_no}`}; - }, - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setTableState({ ...tableState, filteredInfo: filters, sortedInfo: sorter }); - }; - - return ( - - { - setState({ - ...state, - vehicle: { ...state.vehicle, search: value }, - }); - }} - enterButton - /> - - } - > -
{ - setState({ - ...state, - vehicle: { - ...state.vehicle, - none: false, - new: false, - selectedid: props.id, - vehicleObj: props, - }, - }); - }, - type: "radio", - selectedRowKeys: [state.vehicle.selectedid], - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - if (record) { - if (record.id) { - setState({ - ...state, - vehicle: { - ...state.vehicle, - none: false, - new: false, - selectedid: record.id, - vehicleObj: record, - }, - }); - - return; - } - } - setState({ - ...state, - vehicle: { - ...state.vehicle, - selectedid: null, - vehicleObj: null, - }, - }); + const columns = [ + { + title: t("vehicles.fields.v_vin"), + dataIndex: "v_vin", + key: "v_vin", + sorter: (a, b) => alphaSort(a.v_vin, b.v_vin), + sortOrder: + tableState.sortedInfo.columnKey === "v_vin" && + tableState.sortedInfo.order, + render: (text, record) => ( + + {record.v_vin} + + ), + }, + { + title: t("vehicles.fields.description"), + dataIndex: "description", + key: "description", + render: (text, record) => { + return ( + {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc} ${record.v_color}`} + ); }, - }; - }} - /> - - ); + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate", + key: "plate", + render: (text, record) => { + return {`${record.plate_st} | ${record.plate_no}`}; + }, + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setTableState({...tableState, filteredInfo: filters, sortedInfo: sorter}); + }; + + return ( + + { + setState({ + ...state, + vehicle: {...state.vehicle, search: value}, + }); + }} + enterButton + /> + + } + > +
{ + setState({ + ...state, + vehicle: { + ...state.vehicle, + none: false, + new: false, + selectedid: props.id, + vehicleObj: props, + }, + }); + }, + type: "radio", + selectedRowKeys: [state.vehicle.selectedid], + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + if (record) { + if (record.id) { + setState({ + ...state, + vehicle: { + ...state.vehicle, + none: false, + new: false, + selectedid: record.id, + vehicleObj: record, + }, + }); + + return; + } + } + setState({ + ...state, + vehicle: { + ...state.vehicle, + selectedid: null, + vehicleObj: null, + }, + }); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/predefined-vehicles.js b/client/src/components/jobs-create-vehicle-info/predefined-vehicles.js index 7ca0042db..fab4b33a8 100644 --- a/client/src/components/jobs-create-vehicle-info/predefined-vehicles.js +++ b/client/src/components/jobs-create-vehicle-info/predefined-vehicles.js @@ -1,3991 +1,3991 @@ const obj = [ - { - make: "ACURA", - model: "1.6 EL", - }, - { - make: "ACURA", - model: "1.7 EL", - }, - { - make: "ACURA", - model: "2.3 CL", - }, - { - make: "ACURA", - model: "2.5TL", - }, - { - make: "ACURA", - model: "3.2TL", - }, - { - make: "ACURA", - model: "3.5RL", - }, - { - make: "ACURA", - model: "CL", - }, - { - make: "ACURA", - model: "CSX", - }, - { - make: "ACURA", - model: "EL", - }, - { - make: "ACURA", - model: "GSR", - }, - { - make: "ACURA", - model: "ILX", - }, - { - make: "ACURA", - model: "INTEGRA", - }, - { - make: "ACURA", - model: "LEGEND", - }, - { - make: "ACURA", - model: "MDX", - }, - { - make: "ACURA", - model: "NSX", - }, - { - make: "ACURA", - model: "RDX", - }, - { - make: "ACURA", - model: "RSX", - }, - { - make: "ACURA", - model: "TL", - }, - { - make: "ACURA", - model: "TL-S", - }, - { - make: "ACURA", - model: "TLX", - }, - { - make: "ACURA", - model: "TSK 4", - }, - { - make: "ACURA", - model: "TSX", - }, - { - make: "ACURA", - model: "VIGOR", - }, - { - make: "AMC", - model: "GENERAL", - }, - { - make: "AMC", - model: "RAMBLER", - }, - { - make: "ATLAS", - model: "CUB", - }, - { - make: "AUDI", - model: "100", - }, - { - make: "AUDI", - model: "A2", - }, - { - make: "AUDI", - model: "A2 QUATTRO", - }, - { - make: "AUDI", - model: "A3", - }, - { - make: "AUDI", - model: "A4", - }, - { - make: "AUDI", - model: "A4 QUATTRO", - }, - { - make: "AUDI", - model: "A5", - }, - { - make: "AUDI", - model: "A6", - }, - { - make: "AUDI", - model: "Q3", - }, - { - make: "AUDI", - model: "Q5", - }, - { - make: "AUDI", - model: "Q7", - }, - { - make: "AUDI", - model: "QUATTRO", - }, - { - make: "AUDI", - model: "RS4", - }, - { - make: "AUDI", - model: "S3", - }, - { - make: "AUDI", - model: "S4", - }, - { - make: "AUDI", - model: "S5", - }, - { - make: "AUDI", - model: "S6", - }, - { - make: "AUDI", - model: "TT", - }, - { - make: "AUSTIN", - model: "HEALY", - }, - { - make: "BMW", - model: "128I", - }, - { - make: "BMW", - model: "135I", - }, - { - make: "BMW", - model: "135IS", - }, - { - make: "BMW", - model: "228I", - }, - { - make: "BMW", - model: "3 SERIES", - }, - { - make: "BMW", - model: "318", - }, - { - make: "BMW", - model: "318 TI", - }, - { - make: "BMW", - model: "318I", - }, - { - make: "BMW", - model: "318IS", - }, - { - make: "BMW", - model: "320CI", - }, - { - make: "BMW", - model: "320I", - }, - { - make: "BMW", - model: "323I", - }, - { - make: "BMW", - model: "325", - }, - { - make: "BMW", - model: "325CI", - }, - { - make: "BMW", - model: "325E", - }, - { - make: "BMW", - model: "325I", - }, - { - make: "BMW", - model: "325IS", - }, - { - make: "BMW", - model: "325XI", - }, - { - make: "BMW", - model: "328CI", - }, - { - make: "BMW", - model: "328D", - }, - { - make: "BMW", - model: "328I", - }, - { - make: "BMW", - model: "328XI", - }, - { - make: "BMW", - model: "330CI", - }, - { - make: "BMW", - model: "330I", - }, - { - make: "BMW", - model: "330XI", - }, - { - make: "BMW", - model: "335I", - }, - { - make: "BMW", - model: "335XI", - }, - { - make: "BMW", - model: "352I", - }, - { - make: "BMW", - model: "428I", - }, - { - make: "BMW", - model: "430I", - }, - { - make: "BMW", - model: "435I", - }, - { - make: "BMW", - model: "440I", - }, - { - make: "BMW", - model: "520I", - }, - { - make: "BMW", - model: "525I", - }, - { - make: "BMW", - model: "528I", - }, - { - make: "BMW", - model: "530", - }, - { - make: "BMW", - model: "530I", - }, - { - make: "BMW", - model: "530IA", - }, - { - make: "BMW", - model: "530XI", - }, - { - make: "BMW", - model: "535I", - }, - { - make: "BMW", - model: "540I", - }, - { - make: "BMW", - model: "640I", - }, - { - make: "BMW", - model: "645CI", - }, - { - make: "BMW", - model: "735", - }, - { - make: "BMW", - model: "740I", - }, - { - make: "BMW", - model: "745LI", - }, - { - make: "BMW", - model: "750I", - }, - { - make: "BMW", - model: "750LI", - }, - { - make: "BMW", - model: "K-1200", - }, - { - make: "BMW", - model: "M3", - }, - { - make: "BMW", - model: "M5", - }, - { - make: "BMW", - model: "X1", - }, - { - make: "BMW", - model: "X3", - }, - { - make: "BMW", - model: "X5", - }, - { - make: "BMW", - model: "X6", - }, - { - make: "BMW", - model: "Z3", - }, - { - make: "BMW", - model: "Z4", - }, - { - make: "BUICK", - model: "ALLURE", - }, - { - make: "BUICK", - model: "CENTURY", - }, - { - make: "BUICK", - model: "ENCLAVE", - }, - { - make: "BUICK", - model: "ENCORE", - }, - { - make: "BUICK", - model: "ENVISION", - }, - { - make: "BUICK", - model: "INVICTA", - }, - { - make: "BUICK", - model: "LACROSSE", - }, - { - make: "BUICK", - model: "LESABRE", - }, - { - make: "BUICK", - model: "LUCERNE", - }, - { - make: "BUICK", - model: "PARK AVENUE", - }, - { - make: "BUICK", - model: "REGAL", - }, - { - make: "BUICK", - model: "RENDEZVOUS", - }, - { - make: "BUICK", - model: "RIVIERA", - }, - { - make: "BUICK", - model: "ROADMASTER", - }, - { - make: "BUICK", - model: "SKYLARK", - }, - { - make: "BUICK", - model: "SOMERSET", - }, - { - make: "BUICK", - model: "SPECIAL", - }, - { - make: "BUICK", - model: "TERRAZA", - }, - { - make: "BUICK", - model: "VERANO", - }, - { - make: "CADILLAC", - model: "ATS", - }, - { - make: "CADILLAC", - model: "CATERA", - }, - { - make: "CADILLAC", - model: "CTS", - }, - { - make: "CADILLAC", - model: "DE VILLE", - }, - { - make: "CADILLAC", - model: "DTS", - }, - { - make: "CADILLAC", - model: "ELDORADO", - }, - { - make: "CADILLAC", - model: "ESCLADE", - }, - { - make: "CADILLAC", - model: "FLEETWOOD", - }, - { - make: "CADILLAC", - model: "SEVILLE", - }, - { - make: "CADILLAC", - model: "SRX", - }, - { - make: "CADILLAC", - model: "STS", - }, - { - make: "CADILLAC", - model: "XLR", - }, - { - make: "CHEVROLET", - model: "1500", - }, - { - make: "CHEVROLET", - model: "2500", - }, - { - make: "CHEVROLET", - model: "2500HD", - }, - { - make: "CHEVROLET", - model: "2WHDR", - }, - { - make: "CHEVROLET", - model: "3500 EXPRESS VAN", - }, - { - make: "CHEVROLET", - model: "3500 HD", - }, - { - make: "CHEVROLET", - model: "ALER", - }, - { - make: "CHEVROLET", - model: "ASTRO", - }, - { - make: "CHEVROLET", - model: "AVALANCHE", - }, - { - make: "CHEVROLET", - model: "AVEO", - }, - { - make: "CHEVROLET", - model: "BEL AIR", - }, - { - make: "CHEVROLET", - model: "BERETTA", - }, - { - make: "CHEVROLET", - model: "BLAZER", - }, - { - make: "CHEVROLET", - model: "BOLT", - }, - { - make: "CHEVROLET", - model: "BOLT EV", - }, - { - make: "CHEVROLET", - model: "C10", - }, - { - make: "CHEVROLET", - model: "C20", - }, - { - make: "CHEVROLET", - model: "C2500", - }, - { - make: "CHEVROLET", - model: "C3500", - }, - { - make: "CHEVROLET", - model: "CAMARO", - }, - { - make: "CHEVROLET", - model: "CAPRICE", - }, - { - make: "CHEVROLET", - model: "CAVALIER", - }, - { - make: "CHEVROLET", - model: "CHEVELLE", - }, - { - make: "CHEVROLET", - model: "CITY EXPRESS", - }, - { - make: "CHEVROLET", - model: "COBALT", - }, - { - make: "CHEVROLET", - model: "COLORADO", - }, - { - make: "CHEVROLET", - model: "CORSICA", - }, - { - make: "CHEVROLET", - model: "CORVETTE", - }, - { - make: "CHEVROLET", - model: "CRUZE", - }, - { - make: "CHEVROLET", - model: "EL CAMINO", - }, - { - make: "CHEVROLET", - model: "EPICA", - }, - { - make: "CHEVROLET", - model: "EQUINOX", - }, - { - make: "CHEVROLET", - model: "EXPRESS", - }, - { - make: "CHEVROLET", - model: "EXPRESS 1500", - }, - { - make: "CHEVROLET", - model: "EXPRESS 2500", - }, - { - make: "CHEVROLET", - model: "EXPRESS 3500", - }, - { - make: "CHEVROLET", - model: "EXPRESS VAN", - }, - { - make: "CHEVROLET", - model: "G1500", - }, - { - make: "CHEVROLET", - model: "G2500", - }, - { - make: "CHEVROLET", - model: "G30", - }, - { - make: "CHEVROLET", - model: "G3500", - }, - { - make: "CHEVROLET", - model: "G4500", - }, - { - make: "CHEVROLET", - model: "GMT-400", - }, - { - make: "CHEVROLET", - model: "HD 2500", - }, - { - make: "CHEVROLET", - model: "HHR", - }, - { - make: "CHEVROLET", - model: "IMPALA", - }, - { - make: "CHEVROLET", - model: "K1500", - }, - { - make: "CHEVROLET", - model: "K2500", - }, - { - make: "CHEVROLET", - model: "K3500", - }, - { - make: "CHEVROLET", - model: "K5500", - }, - { - make: "CHEVROLET", - model: "LUMINA", - }, - { - make: "CHEVROLET", - model: "MALIBU", - }, - { - make: "CHEVROLET", - model: "MALIBU HYBRID", - }, - { - make: "CHEVROLET", - model: "MONTE CARLO", - }, - { - make: "CHEVROLET", - model: "NOMAD", - }, - { - make: "CHEVROLET", - model: "NOVA", - }, - { - make: "CHEVROLET", - model: "OPTRA", - }, - { - make: "CHEVROLET", - model: "ORLANDO", - }, - { - make: "CHEVROLET", - model: "P30", - }, - { - make: "CHEVROLET", - model: "S10", - }, - { - make: "CHEVROLET", - model: "S10 BLAZER", - }, - { - make: "CHEVROLET", - model: "SAVANNA", - }, - { - make: "CHEVROLET", - model: "SILVERADO", - }, - { - make: "CHEVROLET", - model: "SILVERADO 2500 HD", - }, - { - make: "CHEVROLET", - model: "SILVERADO 3500", - }, - { - make: "CHEVROLET", - model: "SILVERADO 3500 HD", - }, - { - make: "CHEVROLET", - model: "SONIC", - }, - { - make: "CHEVROLET", - model: "SPARK", - }, - { - make: "CHEVROLET", - model: "SPORT VAN G20", - }, - { - make: "CHEVROLET", - model: "SPRINT", - }, - { - make: "CHEVROLET", - model: "SUBURBAN", - }, - { - make: "CHEVROLET", - model: "TAHOE", - }, - { - make: "CHEVROLET", - model: "TRACKER", - }, - { - make: "CHEVROLET", - model: "TRAILBLAZER", - }, - { - make: "CHEVROLET", - model: "TRAVERSE", - }, - { - make: "CHEVROLET", - model: "TRAX", - }, - { - make: "CHEVROLET", - model: "TREX", - }, - { - make: "CHEVROLET", - model: "UPLANDER", - }, - { - make: "CHEVROLET", - model: "VENTURE", - }, - { - make: "CHEVROLET", - model: "VOLT", - }, - { - make: "CHEVROLET", - model: "Z24", - }, - { - make: "CHEVROLET", - model: "Z28 IROC", - }, - { - make: "CHRYSLER", - model: "200", - }, - { - make: "CHRYSLER", - model: "300", - }, - { - make: "CHRYSLER", - model: "300C", - }, - { - make: "CHRYSLER", - model: "300M", - }, - { - make: "CHRYSLER", - model: "5TH AVE", - }, - { - make: "CHRYSLER", - model: "ASPEN", - }, - { - make: "CHRYSLER", - model: "CIRRUS", - }, - { - make: "CHRYSLER", - model: "CONCORDE", - }, - { - make: "CHRYSLER", - model: "CROSSFIRE", - }, - { - make: "CHRYSLER", - model: "DAYTONA", - }, - { - make: "CHRYSLER", - model: "E CLASS", - }, - { - make: "CHRYSLER", - model: "INTREPID", - }, - { - make: "CHRYSLER", - model: "LEBARON", - }, - { - make: "CHRYSLER", - model: "LHS", - }, - { - make: "CHRYSLER", - model: "NEON", - }, - { - make: "CHRYSLER", - model: "NEW YORKER", - }, - { - make: "CHRYSLER", - model: "PACIFICA", - }, - { - make: "CHRYSLER", - model: "PT CRUISER", - }, - { - make: "CHRYSLER", - model: "SEBRING", - }, - { - make: "CHRYSLER", - model: "TOWN & COUNTRY", - }, - { - make: "DATSUN", - model: "PICK-UP", - }, - { - make: "DODGE", - model: "1500", - }, - { - make: "DODGE", - model: "250", - }, - { - make: "DODGE", - model: "2500", - }, - { - make: "DODGE", - model: "4500", - }, - { - make: "DODGE", - model: "5500", - }, - { - make: "DODGE", - model: "ARIES", - }, - { - make: "DODGE", - model: "AVENGER", - }, - { - make: "DODGE", - model: "B1500", - }, - { - make: "DODGE", - model: "B200", - }, - { - make: "DODGE", - model: "B250", - }, - { - make: "DODGE", - model: "B350", - }, - { - make: "DODGE", - model: "CALIBER", - }, - { - make: "DODGE", - model: "CAMPERVAN", - }, - { - make: "DODGE", - model: "CARAVAN", - }, - { - make: "DODGE", - model: "CHALLENGER", - }, - { - make: "DODGE", - model: "CHARGER", - }, - { - make: "DODGE", - model: "COLT", - }, - { - make: "DODGE", - model: "CORNET", - }, - { - make: "DODGE", - model: "CV VAN", - }, - { - make: "DODGE", - model: "D100", - }, - { - make: "DODGE", - model: "D200", - }, - { - make: "DODGE", - model: "D250", - }, - { - make: "DODGE", - model: "D300", - }, - { - make: "DODGE", - model: "D350", - }, - { - make: "DODGE", - model: "DAKOTA", - }, - { - make: "DODGE", - model: "DART", - }, - { - make: "DODGE", - model: "DEMON", - }, - { - make: "DODGE", - model: "DURANGO", - }, - { - make: "DODGE", - model: "DYNASTY", - }, - { - make: "DODGE", - model: "GRAND CARAVAN", - }, - { - make: "DODGE", - model: "GRAND CARAVEN SE", - }, - { - make: "DODGE", - model: "JOURNEY", - }, - { - make: "DODGE", - model: "MAGNUM", - }, - { - make: "DODGE", - model: "MOTORHOME", - }, - { - make: "DODGE", - model: "NEON", - }, - { - make: "DODGE", - model: "NITRO", - }, - { - make: "DODGE", - model: "PRO MASTER", - }, - { - make: "DODGE", - model: "PRO MASTER 3500", - }, - { - make: "DODGE", - model: "RAM", - }, - { - make: "DODGE", - model: "RAM 1500", - }, - { - make: "DODGE", - model: "RAM 250", - }, - { - make: "DODGE", - model: "RAM 2500", - }, - { - make: "DODGE", - model: "RAM 3500", - }, - { - make: "DODGE", - model: "RAM 5500", - }, - { - make: "DODGE", - model: "RAM PRO MASTER", - }, - { - make: "DODGE", - model: "RAM SRT10", - }, - { - make: "DODGE", - model: "RAM VAN", - }, - { - make: "DODGE", - model: "RAMPAGE", - }, - { - make: "DODGE", - model: "SHADOW", - }, - { - make: "DODGE", - model: "SPIRIT", - }, - { - make: "DODGE", - model: "SPRINTER 3500", - }, - { - make: "DODGE", - model: "SRT", - }, - { - make: "DODGE", - model: "STEALTH", - }, - { - make: "DODGE", - model: "STRATUS", - }, - { - make: "DODGE", - model: "SWINGER", - }, - { - make: "DODGE", - model: "SX 2.0", - }, - { - make: "DODGE", - model: "W200", - }, - { - make: "DODGE", - model: "W350", - }, - { - make: "EAGLE", - model: "SUMMIT", - }, - { - make: "EAGLE", - model: "TALON", - }, - { - make: "EAGLE", - model: "VISION", - }, - { - make: "FIAT", - model: "500C", - }, - { - make: "FIAT", - model: "500L", - }, - { - make: "FORD", - model: "500", - }, - { - make: "FORD", - model: "AEROSTAR", - }, - { - make: "FORD", - model: "ASPIRE", - }, - { - make: "FORD", - model: "BRONCO", - }, - { - make: "FORD", - model: "CMAX", - }, - { - make: "FORD", - model: "CONTOUR", - }, - { - make: "FORD", - model: "CROWN VIC", - }, - { - make: "FORD", - model: "CUBE VAN", - }, - { - make: "FORD", - model: "DUMP TRUCK", - }, - { - make: "FORD", - model: "E150", - }, - { - make: "FORD", - model: "E250", - }, - { - make: "FORD", - model: "E350", - }, - { - make: "FORD", - model: "E450", - }, - { - make: "FORD", - model: "ECO SPORT", - }, - { - make: "FORD", - model: "ECONOLINE", - }, - { - make: "FORD", - model: "EDGE", - }, - { - make: "FORD", - model: "ESCAPE", - }, - { - make: "FORD", - model: "ESCORT", - }, - { - make: "FORD", - model: "EXCURSION", - }, - { - make: "FORD", - model: "EXPEDITION", - }, - { - make: "FORD", - model: "EXPLORER", - }, - { - make: "FORD", - model: "EXPLORER SPORT", - }, - { - make: "FORD", - model: "EXPLORER SPORT TRAC", - }, - { - make: "FORD", - model: "F-150", - }, - { - make: "FORD", - model: "F-250", - }, - { - make: "FORD", - model: "F-350", - }, - { - make: "FORD", - model: "F-450", - }, - { - make: "FORD", - model: "F-550", - }, - { - make: "FORD", - model: "FAIRLANE", - }, - { - make: "FORD", - model: "FESTIVA", - }, - { - make: "FORD", - model: "FIESTA", - }, - { - make: "FORD", - model: "FLAT DECK", - }, - { - make: "FORD", - model: "FLEX", - }, - { - make: "FORD", - model: "FOCUS", - }, - { - make: "FORD", - model: "FREESTAR", - }, - { - make: "FORD", - model: "FREESTYLE", - }, - { - make: "FORD", - model: "FUSION", - }, - { - make: "FORD", - model: "GALAXIE 500", - }, - { - make: "FORD", - model: "LARIAT", - }, - { - make: "FORD", - model: "LCF", - }, - { - make: "FORD", - model: "LGT", - }, - { - make: "FORD", - model: "MOTORHOME", - }, - { - make: "FORD", - model: "MUSTANG", - }, - { - make: "FORD", - model: "PLEASURE WAY", - }, - { - make: "FORD", - model: "PROBE", - }, - { - make: "FORD", - model: "RANGER", - }, - { - make: "FORD", - model: "RAPTOR", - }, - { - make: "FORD", - model: "SPORT TRAC", - }, - { - make: "FORD", - model: "SUPER DUTY", - }, - { - make: "FORD", - model: "TAURUS", - }, - { - make: "FORD", - model: "T-BIRD", - }, - { - make: "FORD", - model: "T-BUCKET", - }, - { - make: "FORD", - model: "TEMPO", - }, - { - make: "FORD", - model: "THUNDERBIRD", - }, - { - make: "FORD", - model: "TRANSIT", - }, - { - make: "FORD", - model: "TRANSIT 250", - }, - { - make: "FORD", - model: "TRANSIT 350HD", - }, - { - make: "FORD", - model: "TRANSIT CONNECT", - }, - { - make: "FORD", - model: "TRANSIT COONECT", - }, - { - make: "FORD", - model: "WINDSTAR", - }, - { - make: "FREIGHTLINER", - model: "FL70", - }, - { - make: "FREIGHTLINER", - model: "M2", - }, - { - make: "GEO", - model: "METRO", - }, - { - make: "GEO", - model: "STORM", - }, - { - make: "GEO", - model: "TRACKER", - }, - { - make: "GMC", - model: "1500", - }, - { - make: "GMC", - model: "2500 HD", - }, - { - make: "GMC", - model: "3500", - }, - { - make: "GMC", - model: "4000", - }, - { - make: "GMC", - model: "4500HD", - }, - { - make: "GMC", - model: "ACADIA", - }, - { - make: "GMC", - model: "C1500", - }, - { - make: "GMC", - model: "C2500", - }, - { - make: "GMC", - model: "C4500", - }, - { - make: "GMC", - model: "CANYON", - }, - { - make: "GMC", - model: "CARGO", - }, - { - make: "GMC", - model: "DENALI HD", - }, - { - make: "GMC", - model: "ENVOY", - }, - { - make: "GMC", - model: "G2500 VANDURA", - }, - { - make: "GMC", - model: "G35 SAVANNA", - }, - { - make: "GMC", - model: "GEO", - }, - { - make: "GMC", - model: "JIMMY", - }, - { - make: "GMC", - model: "K 2500", - }, - { - make: "GMC", - model: "K1500", - }, - { - make: "GMC", - model: "K3500", - }, - { - make: "GMC", - model: "RALLY", - }, - { - make: "GMC", - model: "S15", - }, - { - make: "GMC", - model: "S1500", - }, - { - make: "GMC", - model: "SAFARI", - }, - { - make: "GMC", - model: "SAVANA", - }, - { - make: "GMC", - model: "SAVANA 3500", - }, - { - make: "GMC", - model: "SIERRA", - }, - { - make: "GMC", - model: "SIERRA 1500", - }, - { - make: "GMC", - model: "SIERRA 2500", - }, - { - make: "GMC", - model: "SIERRA 2500 HD", - }, - { - make: "GMC", - model: "SIERRA 3500", - }, - { - make: "GMC", - model: "SIERRA 3500, DENALI", - }, - { - make: "GMC", - model: "SIERRA K1500", - }, - { - make: "GMC", - model: "SLX", - }, - { - make: "GMC", - model: "SONOMA", - }, - { - make: "GMC", - model: "T7500", - }, - { - make: "GMC", - model: "TERRAIN", - }, - { - make: "GMC", - model: "TOP KICK", - }, - { - make: "GMC", - model: "TOP KICK 6500", - }, - { - make: "GMC", - model: "TOP KICK C4500", - }, - { - make: "GMC", - model: "TRACKER", - }, - { - make: "GMC", - model: "UTILIMASTER CUBE VAN", - }, - { - make: "GMC", - model: "V15", - }, - { - make: "GMC", - model: "VANDURA", - }, - { - make: "GMC", - model: "VIXEN", - }, - { - make: "GMC", - model: "W4500", - }, - { - make: "GMC", - model: "W550", - }, - { - make: "GMC", - model: "W5500", - }, - { - make: "GMC", - model: "YUKON", - }, - { - make: "GOLF", - model: "SPORT WAGON", - }, - { - make: "HINO", - model: "268", - }, - { - make: "HINO", - model: "338", - }, - { - make: "HONDA", - model: "ACCORD", - }, - { - make: "HONDA", - model: "CIVIC", - }, - { - make: "HONDA", - model: "CIVIC HYBRID", - }, - { - make: "HONDA", - model: "CRV", - }, - { - make: "HONDA", - model: "CRX", - }, - { - make: "HONDA", - model: "CR-Z", - }, - { - make: "HONDA", - model: "DEL SOL", - }, - { - make: "HONDA", - model: "ELEMENT", - }, - { - make: "HONDA", - model: "FIT", - }, - { - make: "HONDA", - model: "HR V", - }, - { - make: "HONDA", - model: "INSIGHT", - }, - { - make: "HONDA", - model: "ODYSSEY", - }, - { - make: "HONDA", - model: "PASSPORT", - }, - { - make: "HONDA", - model: "PILOT", - }, - { - make: "HONDA", - model: "PRELUDE", - }, - { - make: "HONDA", - model: "RIDGELINE", - }, - { - make: "HONDA", - model: "S2000", - }, - { - make: "HUMMER", - model: "H2", - }, - { - make: "HUMMER", - model: "H3", - }, - { - make: "HYUNDAI", - model: "ACCENT", - }, - { - make: "HYUNDAI", - model: "AZERA", - }, - { - make: "HYUNDAI", - model: "ELANTRA", - }, - { - make: "HYUNDAI", - model: "ENTOURAGE", - }, - { - make: "HYUNDAI", - model: "GENESIS", - }, - { - make: "HYUNDAI", - model: "IONIQ", - }, - { - make: "HYUNDAI", - model: "KONA", - }, - { - make: "HYUNDAI", - model: "SANTA FE", - }, - { - make: "HYUNDAI", - model: "SANTA FE SPORT", - }, - { - make: "HYUNDAI", - model: "SCOUPE", - }, - { - make: "HYUNDAI", - model: "SONATA", - }, - { - make: "HYUNDAI", - model: "TIBURON", - }, - { - make: "HYUNDAI", - model: "TOURING", - }, - { - make: "HYUNDAI", - model: "TUCSON", - }, - { - make: "HYUNDAI", - model: "VELOSTER", - }, - { - make: "HYUNDAI", - model: "VENUE", - }, - { - make: "HYUNDAI", - model: "VERA CRUZ", - }, - { - make: "HYUNDAI", - model: "XG350", - }, - { - make: "HYUNDAI", - model: "XG7", - }, - { - make: "INFINITI", - model: "DURASTAR", - }, - { - make: "INFINITI", - model: "EX35", - }, - { - make: "INFINITI", - model: "FX35", - }, - { - make: "INFINITI", - model: "FX45", - }, - { - make: "INFINITI", - model: "FX50", - }, - { - make: "INFINITI", - model: "G20", - }, - { - make: "INFINITI", - model: "G35", - }, - { - make: "INFINITI", - model: "G35X", - }, - { - make: "INFINITI", - model: "G37", - }, - { - make: "INFINITI", - model: "G37X", - }, - { - make: "INFINITI", - model: "i30", - }, - { - make: "INFINITI", - model: "I35", - }, - { - make: "INFINITI", - model: "J30", - }, - { - make: "INFINITI", - model: "JX35", - }, - { - make: "INFINITI", - model: "L30", - }, - { - make: "INFINITI", - model: "Q35", - }, - { - make: "INFINITI", - model: "Q45", - }, - { - make: "INFINITI", - model: "Q50", - }, - { - make: "INFINITI", - model: "Q60", - }, - { - make: "INFINITI", - model: "QX4", - }, - { - make: "INFINITI", - model: "QX50", - }, - { - make: "INFINITI", - model: "QX56", - }, - { - make: "INFINITI", - model: "QX60", - }, - { - make: "ISUZU", - model: "BIGHORN", - }, - { - make: "ISUZU", - model: "CAB OVER", - }, - { - make: "ISUZU", - model: "HOMBRE", - }, - { - make: "ISUZU", - model: "NPR", - }, - { - make: "ISUZU", - model: "NPR - HD", - }, - { - make: "ISUZU", - model: "NRR", - }, - { - make: "ISUZU", - model: "NRR - CAB OVER", - }, - { - make: "ISUZU", - model: "RODEO", - }, - { - make: "ISUZU", - model: "TROOPER", - }, - { - make: "JAGUAR", - model: "F-PACE", - }, - { - make: "JAGUAR", - model: "GATOR 850D", - }, - { - make: "JAGUAR", - model: "IPACE", - }, - { - make: "JAGUAR", - model: "S TYPE", - }, - { - make: "JAGUAR", - model: "VANDEN PLAS", - }, - { - make: "JAGUAR", - model: "XJ1", - }, - { - make: "JAGUAR", - model: "XJ6", - }, - { - make: "JAGUAR", - model: "XJ8", - }, - { - make: "JAGUAR", - model: "XJS", - }, - { - make: "JAGUAR", - model: "XK8", - }, - { - make: "JAGUAR", - model: "X-TYPE", - }, - { - make: "JEEP", - model: "CHEROKEE", - }, - { - make: "JEEP", - model: "CJ", - }, - { - make: "JEEP", - model: "CJ7", - }, - { - make: "JEEP", - model: "COMMANCHE", - }, - { - make: "JEEP", - model: "COMMANDER", - }, - { - make: "JEEP", - model: "COMPASS", - }, - { - make: "JEEP", - model: "CP", - }, - { - make: "JEEP", - model: "GRAND CHEROKEE", - }, - { - make: "JEEP", - model: "GRAND WAGONEER", - }, - { - make: "JEEP", - model: "JK", - }, - { - make: "JEEP", - model: "LIBERTY", - }, - { - make: "JEEP", - model: "PATRIOT", - }, - { - make: "JEEP", - model: "PT", - }, - { - make: "JEEP", - model: "RENEGADE", - }, - { - make: "JEEP", - model: "RUBICON", - }, - { - make: "JEEP", - model: "TJ", - }, - { - make: "JEEP", - model: "TJ SPORT", - }, - { - make: "JEEP", - model: "WRANGLER", - }, - { - make: "JEEP", - model: "YJ", - }, - { - make: "KIA", - model: "CADENZA", - }, - { - make: "KIA", - model: "CARNIVAL", - }, - { - make: "KIA", - model: "FORTE", - }, - { - make: "KIA", - model: "FORTE 5", - }, - { - make: "KIA", - model: "MAGENTIS", - }, - { - make: "KIA", - model: "NIRO", - }, - { - make: "KIA", - model: "OPTIMA", - }, - { - make: "KIA", - model: "RIO", - }, - { - make: "KIA", - model: "RIO 5", - }, - { - make: "KIA", - model: "RONDO", - }, - { - make: "KIA", - model: "RX-V", - }, - { - make: "KIA", - model: "SEDONA", - }, - { - make: "KIA", - model: "SELTO", - }, - { - make: "KIA", - model: "SEPHIA", - }, - { - make: "KIA", - model: "SORENTO", - }, - { - make: "KIA", - model: "SOUL", - }, - { - make: "KIA", - model: "SPECTRA", - }, - { - make: "KIA", - model: "SPECTRA 5", - }, - { - make: "KIA", - model: "SPORT", - }, - { - make: "KIA", - model: "SPORTAGE", - }, - { - make: "KIA", - model: "VAN", - }, - { - make: "LAND ROVER", - model: "DISCOVERY SPORT", - }, - { - make: "LAND ROVER", - model: "LR2", - }, - { - make: "LAND ROVER", - model: "RANGE ROVER EVOQUE", - }, - { - make: "LAND ROVER", - model: "RANGE ROVER SPORT", - }, - { - make: "LANDROVER", - model: "40 SE", - }, - { - make: "LANDROVER", - model: "46HSE", - }, - { - make: "LANDROVER", - model: "DEFENDER", - }, - { - make: "LANDROVER", - model: "DISCOVERY", - }, - { - make: "LANDROVER", - model: "DISCOVERY II", - }, - { - make: "LANDROVER", - model: "FREELANDER", - }, - { - make: "LANDROVER", - model: "LR2", - }, - { - make: "LANDROVER", - model: "RANGE ROVER", - }, - { - make: "LEXUS", - model: "ES300", - }, - { - make: "LEXUS", - model: "ES350", - }, - { - make: "LEXUS", - model: "GS250", - }, - { - make: "LEXUS", - model: "GS300", - }, - { - make: "LEXUS", - model: "GS450", - }, - { - make: "LEXUS", - model: "GX470", - }, - { - make: "LEXUS", - model: "HS250", - }, - { - make: "LEXUS", - model: "IS250", - }, - { - make: "LEXUS", - model: "IS300", - }, - { - make: "LEXUS", - model: "IX 330", - }, - { - make: "LEXUS", - model: "LS400", - }, - { - make: "LEXUS", - model: "LS430", - }, - { - make: "LEXUS", - model: "LX450", - }, - { - make: "LEXUS", - model: "LX470", - }, - { - make: "LEXUS", - model: "NX200", - }, - { - make: "LEXUS", - model: "RC F", - }, - { - make: "LEXUS", - model: "RX 300", - }, - { - make: "LEXUS", - model: "RX 330", - }, - { - make: "LEXUS", - model: "RX 350", - }, - { - make: "LEXUS", - model: "RX 400H", - }, - { - make: "LEXUS", - model: "RX300", - }, - { - make: "LEXUS", - model: "RX330", - }, - { - make: "LEXUS", - model: "RX350", - }, - { - make: "LEXUS", - model: "RX400", - }, - { - make: "LEXUS", - model: "RX450H", - }, - { - make: "LEXUS", - model: "SC430", - }, - { - make: "LEXUS", - model: "SOARER", - }, - { - make: "LEXUS", - model: "UX250", - }, - { - make: "LINCOLN", - model: "AVIATOR", - }, - { - make: "LINCOLN", - model: "CONTINENTAL", - }, - { - make: "LINCOLN", - model: "LS", - }, - { - make: "LINCOLN", - model: "MARK", - }, - { - make: "LINCOLN", - model: "MARK 5", - }, - { - make: "LINCOLN", - model: "MARK LT", - }, - { - make: "LINCOLN", - model: "MKC", - }, - { - make: "LINCOLN", - model: "MKS", - }, - { - make: "LINCOLN", - model: "MKX", - }, - { - make: "LINCOLN", - model: "MKZ", - }, - { - make: "LINCOLN", - model: "NAVIGATOR", - }, - { - make: "LINCOLN", - model: "PICKUP", - }, - { - make: "LINCOLN", - model: "TOWN CAR", - }, - { - make: "LINCOLN", - model: "ZEPHER", - }, - { - make: "Make", - model: "Model", - }, - { - make: "MARK", - model: "LT", - }, - { - make: "MASERATI", - model: "GHIBLI", - }, - { - make: "MAZDA", - model: "2", - }, - { - make: "MAZDA", - model: "3", - }, - { - make: "MAZDA", - model: "3 H/B", - }, - { - make: "MAZDA", - model: "3 SPORT", - }, - { - make: "MAZDA", - model: "323", - }, - { - make: "MAZDA", - model: "3GS", - }, - { - make: "MAZDA", - model: "3GT", - }, - { - make: "MAZDA", - model: "5", - }, - { - make: "MAZDA", - model: "6", - }, - { - make: "MAZDA", - model: "626", - }, - { - make: "MAZDA", - model: "626ES", - }, - { - make: "MAZDA", - model: "929", - }, - { - make: "MAZDA", - model: "B2000", - }, - { - make: "MAZDA", - model: "B2200", - }, - { - make: "MAZDA", - model: "B2220", - }, - { - make: "MAZDA", - model: "B2300", - }, - { - make: "MAZDA", - model: "B2500", - }, - { - make: "MAZDA", - model: "B2600", - }, - { - make: "MAZDA", - model: "B2600I", - }, - { - make: "MAZDA", - model: "B3000", - }, - { - make: "MAZDA", - model: "B4000", - }, - { - make: "MAZDA", - model: "B-SERIES", - }, - { - make: "MAZDA", - model: "CX 7", - }, - { - make: "MAZDA", - model: "CX3", - }, - { - make: "MAZDA", - model: "CX-3", - }, - { - make: "MAZDA", - model: "CX5", - }, - { - make: "MAZDA", - model: "CX-5", - }, - { - make: "MAZDA", - model: "CX5 GT", - }, - { - make: "MAZDA", - model: "CX9", - }, - { - make: "MAZDA", - model: "CX-9", - }, - { - make: "MAZDA", - model: "D", - }, - { - make: "MAZDA", - model: "MAZDA 3", - }, - { - make: "MAZDA", - model: "MAZDA 5", - }, - { - make: "MAZDA", - model: "MAZDA 6", - }, - { - make: "MAZDA", - model: "MIATA", - }, - { - make: "MAZDA", - model: "MIATA GX", - }, - { - make: "MAZDA", - model: "MILLENIA", - }, - { - make: "MAZDA", - model: "MPV", - }, - { - make: "MAZDA", - model: "MR 2", - }, - { - make: "MAZDA", - model: "MX-3", - }, - { - make: "MAZDA", - model: "MX-3 PRECIDIA", - }, - { - make: "MAZDA", - model: "MX-5", - }, - { - make: "MAZDA", - model: "MX-6", - }, - { - make: "MAZDA", - model: "PRECIDIA", - }, - { - make: "MAZDA", - model: "PROTEGE", - }, - { - make: "MAZDA", - model: "PROTEGE 5", - }, - { - make: "MAZDA", - model: "RX7", - }, - { - make: "MAZDA", - model: "RX8", - }, - { - make: "MAZDA", - model: "TRIBUTE", - }, - { - make: "MERCEDES-BENZ", - model: "190E", - }, - { - make: "MERCEDES-BENZ", - model: "240D", - }, - { - make: "MERCEDES-BENZ", - model: "245 BCLASS", - }, - { - make: "MERCEDES-BENZ", - model: "300", - }, - { - make: "MERCEDES-BENZ", - model: "300SD", - }, - { - make: "MERCEDES-BENZ", - model: "300SL", - }, - { - make: "MERCEDES-BENZ", - model: "B200", - }, - { - make: "MERCEDES-BENZ", - model: "B250", - }, - { - make: "MERCEDES-BENZ", - model: "C220", - }, - { - make: "MERCEDES-BENZ", - model: "C230", - }, - { - make: "MERCEDES-BENZ", - model: "C230 KOMPRESSOR", - }, - { - make: "MERCEDES-BENZ", - model: "C240", - }, - { - make: "MERCEDES-BENZ", - model: "C300", - }, - { - make: "MERCEDES-BENZ", - model: "C300W", - }, - { - make: "MERCEDES-BENZ", - model: "C320", - }, - { - make: "MERCEDES-BENZ", - model: "C350", - }, - { - make: "MERCEDES-BENZ", - model: "C400", - }, - { - make: "MERCEDES-BENZ", - model: "C43", - }, - { - make: "MERCEDES-BENZ", - model: "C63", - }, - { - make: "MERCEDES-BENZ", - model: "C63 AMG", - }, - { - make: "MERCEDES-BENZ", - model: "CLA25", - }, - { - make: "MERCEDES-BENZ", - model: "CLK", - }, - { - make: "MERCEDES-BENZ", - model: "CLK230", - }, - { - make: "MERCEDES-BENZ", - model: "CLK320", - }, - { - make: "MERCEDES-BENZ", - model: "CLK350", - }, - { - make: "MERCEDES-BENZ", - model: "CLK500", - }, - { - make: "MERCEDES-BENZ", - model: "CLR350", - }, - { - make: "MERCEDES-BENZ", - model: "COMPRESSOR", - }, - { - make: "MERCEDES-BENZ", - model: "E300", - }, - { - make: "MERCEDES-BENZ", - model: "E320", - }, - { - make: "MERCEDES-BENZ", - model: "E400", - }, - { - make: "MERCEDES-BENZ", - model: "E420", - }, - { - make: "MERCEDES-BENZ", - model: "E500W", - }, - { - make: "MERCEDES-BENZ", - model: "E550", - }, - { - make: "MERCEDES-BENZ", - model: "GLA25", - }, - { - make: "MERCEDES-BENZ", - model: "GLC30", - }, - { - make: "MERCEDES-BENZ", - model: "GLE350", - }, - { - make: "MERCEDES-BENZ", - model: "GLK", - }, - { - make: "MERCEDES-BENZ", - model: "GLK25", - }, - { - make: "MERCEDES-BENZ", - model: "GLK250", - }, - { - make: "MERCEDES-BENZ", - model: "GLK35", - }, - { - make: "MERCEDES-BENZ", - model: "GLK35", - }, - { - make: "MERCEDES-BENZ", - model: "M1320", - }, - { - make: "MERCEDES-BENZ", - model: "METRIS", - }, - { - make: "MERCEDES-BENZ", - model: "MI320", - }, - { - make: "MERCEDES-BENZ", - model: "MI350", - }, - { - make: "MERCEDES-BENZ", - model: "MI500", - }, - { - make: "MERCEDES-BENZ", - model: "ML350", - }, - { - make: "MERCEDES-BENZ", - model: "ML400", - }, - { - make: "MERCEDES-BENZ", - model: "ML430", - }, - { - make: "MERCEDES-BENZ", - model: "ML55", - }, - { - make: "MERCEDES-BENZ", - model: "ML63", - }, - { - make: "MERCEDES-BENZ", - model: "R320", - }, - { - make: "MERCEDES-BENZ", - model: "S155", - }, - { - make: "MERCEDES-BENZ", - model: "S450V", - }, - { - make: "MERCEDES-BENZ", - model: "SL500", - }, - { - make: "MERCEDES-BENZ", - model: "SLK230", - }, - { - make: "MERCEDES-BENZ", - model: "SLK350", - }, - { - make: "MERCEDES-BENZ", - model: "SPRINTER", - }, - { - make: "MERCEDES-BENZ", - model: "SPRINTER VAN", - }, - { - make: "MERCURY", - model: "COMET", - }, - { - make: "MERCURY", - model: "COUGAR", - }, - { - make: "MERCURY", - model: "GRAND MARQUIS", - }, - { - make: "MERCURY", - model: "MARQUIS", - }, - { - make: "MERCURY", - model: "MURADER", - }, - { - make: "MERCURY", - model: "MYSTIQUE", - }, - { - make: "MERCURY", - model: "SABLE", - }, - { - make: "MERCURY", - model: "TOPAZ", - }, - { - make: "MERCURY", - model: "VILLAGER", - }, - { - make: "MINI", - model: "COOPER", - }, - { - make: "MINI", - model: "COOPER CLUBMAN", - }, - { - make: "MINI", - model: "COOPER COUNTRYMAN", - }, - { - make: "MINI", - model: "COOPER S", - }, - { - make: "MITSUBISHI", - model: "DELICA", - }, - { - make: "MITSUBISHI", - model: "ECLIPSE", - }, - { - make: "MITSUBISHI", - model: "ECLIPSE CROSS", - }, - { - make: "MITSUBISHI", - model: "ENDVR", - }, - { - make: "MITSUBISHI", - model: "GALANT", - }, - { - make: "MITSUBISHI", - model: "LANCER", - }, - { - make: "MITSUBISHI", - model: "LANCER EVOLUTION", - }, - { - make: "MITSUBISHI", - model: "MIRAGE", - }, - { - make: "MITSUBISHI", - model: "MONTERO", - }, - { - make: "MITSUBISHI", - model: "OUTLANDER", - }, - { - make: "MITSUBISHI", - model: "PJERO", - }, - { - make: "MITSUBISHI", - model: "RVR", - }, - { - make: "MITSUBISHI", - model: "SPYDER", - }, - { - make: "NISSAN", - model: "200", - }, - { - make: "NISSAN", - model: "200SX", - }, - { - make: "NISSAN", - model: "240SX", - }, - { - make: "NISSAN", - model: "240Z", - }, - { - make: "NISSAN", - model: "2500 VAN", - }, - { - make: "NISSAN", - model: "280", - }, - { - make: "NISSAN", - model: "300ZX", - }, - { - make: "NISSAN", - model: "350Z", - }, - { - make: "NISSAN", - model: "370Z", - }, - { - make: "NISSAN", - model: "ALTIMA", - }, - { - make: "NISSAN", - model: "ARMADA", - }, - { - make: "NISSAN", - model: "AXXESS", - }, - { - make: "NISSAN", - model: "CUBE", - }, - { - make: "NISSAN", - model: "D21", - }, - { - make: "NISSAN", - model: "FIGARO", - }, - { - make: "NISSAN", - model: "FRONTIER", - }, - { - make: "NISSAN", - model: "HALFTON DLX", - }, - { - make: "NISSAN", - model: "JUKE", - }, - { - make: "NISSAN", - model: "KICKS", - }, - { - make: "NISSAN", - model: "LEAF", - }, - { - make: "NISSAN", - model: "MAXIMA", - }, - { - make: "NISSAN", - model: "MICRA", - }, - { - make: "NISSAN", - model: "MURANO", - }, - { - make: "NISSAN", - model: "NV200", - }, - { - make: "NISSAN", - model: "NV250", - }, - { - make: "NISSAN", - model: "NV2500", - }, - { - make: "NISSAN", - model: "PATHFINDER", - }, - { - make: "NISSAN", - model: "PULSAR", - }, - { - make: "NISSAN", - model: "QASHQAI", - }, - { - make: "NISSAN", - model: "QSHQI", - }, - { - make: "NISSAN", - model: "QUEST", - }, - { - make: "NISSAN", - model: "ROGUE", - }, - { - make: "NISSAN", - model: "SENTRA", - }, - { - make: "NISSAN", - model: "SILVIA", - }, - { - make: "NISSAN", - model: "SKYLINE", - }, - { - make: "NISSAN", - model: "SKYLINE GTR", - }, - { - make: "NISSAN", - model: "TERRANO", - }, - { - make: "NISSAN", - model: "TITAN", - }, - { - make: "NISSAN", - model: "TRANO - PATHFINDER", - }, - { - make: "NISSAN", - model: "VERS", - }, - { - make: "NISSAN", - model: "VERSA", - }, - { - make: "NISSAN", - model: "X-TERRA", - }, - { - make: "NISSAN", - model: "X-TRAIL", - }, - { - make: "OLDSMOBILE", - model: "ACHIEVA", - }, - { - make: "OLDSMOBILE", - model: "ALERO", - }, - { - make: "OLDSMOBILE", - model: "AURORA", - }, - { - make: "OLDSMOBILE", - model: "BRAVADO", - }, - { - make: "OLDSMOBILE", - model: "CUTLASS", - }, - { - make: "OLDSMOBILE", - model: "DELTA 88", - }, - { - make: "OLDSMOBILE", - model: "DELTA 88 ROYALE BROUGHAM", - }, - { - make: "OLDSMOBILE", - model: "INTRIGUE", - }, - { - make: "OLDSMOBILE", - model: "NINETY EIGHT", - }, - { - make: "OLDSMOBILE", - model: "OMEGA", - }, - { - make: "OLDSMOBILE", - model: "REGENCY", - }, - { - make: "OLDSMOBILE", - model: "SILHOUETTE", - }, - { - make: "OLDSMOBILE", - model: "TORONADO", - }, - { - make: "PLYMOUTH", - model: "ACCLAIM", - }, - { - make: "PLYMOUTH", - model: "BARACUDA", - }, - { - make: "PLYMOUTH", - model: "BREEZE", - }, - { - make: "PLYMOUTH", - model: "CARAVAN", - }, - { - make: "PLYMOUTH", - model: "GR.VOYAGER", - }, - { - make: "PLYMOUTH", - model: "NEON", - }, - { - make: "PLYMOUTH", - model: "RELIANT", - }, - { - make: "PLYMOUTH", - model: "SUNDANCE", - }, - { - make: "PLYMOUTH", - model: "VALANT", - }, - { - make: "PLYMOUTH", - model: "VOYAGER", - }, - { - make: "POLARIS", - model: "570 CREW", - }, - { - make: "POLARIS", - model: "GENERAL 2+2", - }, - { - make: "PONTIAC", - model: "ACADIAN", - }, - { - make: "PONTIAC", - model: "AZTEC", - }, - { - make: "PONTIAC", - model: "BEAUMONT", - }, - { - make: "PONTIAC", - model: "BONNEVILLE", - }, - { - make: "PONTIAC", - model: "FIERO", - }, - { - make: "PONTIAC", - model: "FIREBIRD", - }, - { - make: "PONTIAC", - model: "FIREFLY", - }, - { - make: "PONTIAC", - model: "G3", - }, - { - make: "PONTIAC", - model: "G5", - }, - { - make: "PONTIAC", - model: "G6", - }, - { - make: "PONTIAC", - model: "G8", - }, - { - make: "PONTIAC", - model: "GRAND AM", - }, - { - make: "PONTIAC", - model: "GRAND PRIX", - }, - { - make: "PONTIAC", - model: "GTO", - }, - { - make: "PONTIAC", - model: "MONTANA", - }, - { - make: "PONTIAC", - model: "PARRISSIEN", - }, - { - make: "PONTIAC", - model: "PURSUIT", - }, - { - make: "PONTIAC", - model: "SOLSTICE", - }, - { - make: "PONTIAC", - model: "SUNBIRD", - }, - { - make: "PONTIAC", - model: "SUNFIRE", - }, - { - make: "PONTIAC", - model: "SUNRUNNER", - }, - { - make: "PONTIAC", - model: "TEMPEST", - }, - { - make: "PONTIAC", - model: "TORRENT", - }, - { - make: "PONTIAC", - model: "TRANS-AM", - }, - { - make: "PONTIAC", - model: "TRANSPORT", - }, - { - make: "PONTIAC", - model: "VIBE", - }, - { - make: "PONTIAC", - model: "WAVE", - }, - { - make: "PORSCHE", - model: "911", - }, - { - make: "PORSCHE", - model: "928", - }, - { - make: "PORSCHE", - model: "944", - }, - { - make: "PORSCHE", - model: "944 TURBO", - }, - { - make: "PORSCHE", - model: "BOXSTER", - }, - { - make: "PORSCHE", - model: "CAYENNE", - }, - { - make: "RANGE ROVER", - model: "46SHE", - }, - { - make: "RANGE ROVER", - model: "PROMA", - }, - { - make: "RANGE ROVER", - model: "RANGE", - }, - { - make: "SAAB", - model: "9", - }, - { - make: "SAAB", - model: "900S", - }, - { - make: "SAAB", - model: "9-2X", - }, - { - make: "SAAB", - model: "9-3", - }, - { - make: "SAAB", - model: "93 AREO", - }, - { - make: "SAAB", - model: "9-5", - }, - { - make: "SATURN", - model: "ASTRA", - }, - { - make: "SATURN", - model: "AURA", - }, - { - make: "SATURN", - model: "ION", - }, - { - make: "SATURN", - model: "L100", - }, - { - make: "SATURN", - model: "L200", - }, - { - make: "SATURN", - model: "LS1", - }, - { - make: "SATURN", - model: "LS2", - }, - { - make: "SATURN", - model: "OUTLOOK", - }, - { - make: "SATURN", - model: "RELAY", - }, - { - make: "SATURN", - model: "S SERIES", - }, - { - make: "SATURN", - model: "S11", - }, - { - make: "SATURN", - model: "SC1", - }, - { - make: "SATURN", - model: "SKY", - }, - { - make: "SATURN", - model: "SL1", - }, - { - make: "SATURN", - model: "SL2", - }, - { - make: "SATURN", - model: "SW1", - }, - { - make: "SATURN", - model: "SW2", - }, - { - make: "SATURN", - model: "VUE", - }, - { - make: "SATURN", - model: "WGN", - }, - { - make: "SCION", - model: "FR-S", - }, - { - make: "SCION", - model: "IM", - }, - { - make: "SCION", - model: "SXB", - }, - { - make: "SCION", - model: "TC", - }, - { - make: "SCION", - model: "XB", - }, - { - make: "SCION", - model: "XD", - }, - { - make: "SMART", - model: "FORTWO", - }, - { - make: "SUBARU", - model: "ASENT", - }, - { - make: "SUBARU", - model: "B9 TRIBECA", - }, - { - make: "SUBARU", - model: "BAJA", - }, - { - make: "SUBARU", - model: "BRAT", - }, - { - make: "SUBARU", - model: "BRZ", - }, - { - make: "SUBARU", - model: "CROSSTREK", - }, - { - make: "SUBARU", - model: "DOMINGO", - }, - { - make: "SUBARU", - model: "DOMNGO", - }, - { - make: "SUBARU", - model: "FORESTER", - }, - { - make: "SUBARU", - model: "GL", - }, - { - make: "SUBARU", - model: "IMPREZA", - }, - { - make: "SUBARU", - model: "IMPREZA STI", - }, - { - make: "SUBARU", - model: "JUSTY", - }, - { - make: "SUBARU", - model: "LEGACY", - }, - { - make: "SUBARU", - model: "LOYALE", - }, - { - make: "SUBARU", - model: "OUTBACK", - }, - { - make: "SUBARU", - model: "SVX", - }, - { - make: "SUBARU", - model: "TRIBECA", - }, - { - make: "SUBARU", - model: "WRX", - }, - { - make: "SUBARU", - model: "WRX STI", - }, - { - make: "SUBARU", - model: "XV", - }, - { - make: "SUZUKI", - model: "AERIO", - }, - { - make: "SUZUKI", - model: "CARRY", - }, - { - make: "SUZUKI", - model: "ESTEEM", - }, - { - make: "SUZUKI", - model: "GRAND VITARA", - }, - { - make: "SUZUKI", - model: "MINI-TRUCK", - }, - { - make: "SUZUKI", - model: "SAMURAI", - }, - { - make: "SUZUKI", - model: "SIDEKICK", - }, - { - make: "SUZUKI", - model: "SWIFT", - }, - { - make: "SUZUKI", - model: "SX4", - }, - { - make: "SUZUKI", - model: "VITARA", - }, - { - make: "SUZUKI", - model: "XL7", - }, - { - make: "TESLA", - model: "MODEL 3", - }, - { - make: "TOYOTA", - model: " PRIUS C", - }, - { - make: "TOYOTA", - model: "4 RUNNER", - }, - { - make: "TOYOTA", - model: "4X4", - }, - { - make: "TOYOTA", - model: "ALPHARD", - }, - { - make: "TOYOTA", - model: "ARISTO", - }, - { - make: "TOYOTA", - model: "AVALON", - }, - { - make: "TOYOTA", - model: "CALDI", - }, - { - make: "TOYOTA", - model: "CALDINA", - }, - { - make: "TOYOTA", - model: "CAMRY", - }, - { - make: "TOYOTA", - model: "CANOPY", - }, - { - make: "TOYOTA", - model: "CELICA", - }, - { - make: "TOYOTA", - model: "CELSLOR", - }, - { - make: "TOYOTA", - model: "CHASE", - }, - { - make: "TOYOTA", - model: "CH-R", - }, - { - make: "TOYOTA", - model: "COROLLA", - }, - { - make: "TOYOTA", - model: "COROLLA CE", - }, - { - make: "TOYOTA", - model: "COROLLA.HYBRID", - }, - { - make: "TOYOTA", - model: "CRESSIDA", - }, - { - make: "TOYOTA", - model: "DELICA", - }, - { - make: "TOYOTA", - model: "ECHO", - }, - { - make: "TOYOTA", - model: "FJ", - }, - { - make: "TOYOTA", - model: "HIGHLANDER", - }, - { - make: "TOYOTA", - model: "LAND CRUISER", - }, - { - make: "TOYOTA", - model: "MATRIX", - }, - { - make: "TOYOTA", - model: "MR2", - }, - { - make: "TOYOTA", - model: "PASEO", - }, - { - make: "TOYOTA", - model: "PICK UP", - }, - { - make: "TOYOTA", - model: "PRADA", - }, - { - make: "TOYOTA", - model: "PREVIA", - }, - { - make: "TOYOTA", - model: "PRIUS", - }, - { - make: "TOYOTA", - model: "PRIUS HYBIRD", - }, - { - make: "TOYOTA", - model: "PRIUS V", - }, - { - make: "TOYOTA", - model: "RAV4", - }, - { - make: "TOYOTA", - model: "SCION", - }, - { - make: "TOYOTA", - model: "SEQUOIA", - }, - { - make: "TOYOTA", - model: "SIENNA", - }, - { - make: "TOYOTA", - model: "SOLARA", - }, - { - make: "TOYOTA", - model: "SORER", - }, - { - make: "TOYOTA", - model: "SP & SP", - }, - { - make: "TOYOTA", - model: "SUPRA", - }, - { - make: "TOYOTA", - model: "SURF", - }, - { - make: "TOYOTA", - model: "TACOMA", - }, - { - make: "TOYOTA", - model: "TERCEL", - }, - { - make: "TOYOTA", - model: "TUNDRA", - }, - { - make: "TOYOTA", - model: "VENZA", - }, - { - make: "TOYOTA", - model: "YARIS", - }, - { - make: "TRIUMPH", - model: "TR3", - }, - { - make: "VOLKSWAGEN", - model: "ATLAS", - }, - { - make: "VOLKSWAGEN", - model: "BEETLE", - }, - { - make: "VOLKSWAGEN", - model: "CABRIOLET", - }, - { - make: "VOLKSWAGEN", - model: "CC", - }, - { - make: "VOLKSWAGEN", - model: "CORRADO", - }, - { - make: "VOLKSWAGEN", - model: "DUNEBUGGY", - }, - { - make: "VOLKSWAGEN", - model: "EOS", - }, - { - make: "VOLKSWAGEN", - model: "EUROVAN", - }, - { - make: "VOLKSWAGEN", - model: "GOLF", - }, - { - make: "VOLKSWAGEN", - model: "GOLF CABRIOLET", - }, - { - make: "VOLKSWAGEN", - model: "GOLF CITY", - }, - { - make: "VOLKSWAGEN", - model: "GOLF GTI", - }, - { - make: "VOLKSWAGEN", - model: "GOLF SPORT WAGEN", - }, - { - make: "VOLKSWAGEN", - model: "GTI", - }, - { - make: "VOLKSWAGEN", - model: "JETTA", - }, - { - make: "VOLKSWAGEN", - model: "JETTA TDI", - }, - { - make: "VOLKSWAGEN", - model: "KIT CAR", - }, - { - make: "VOLKSWAGEN", - model: "PASSAT", - }, - { - make: "VOLKSWAGEN", - model: "R32", - }, - { - make: "VOLKSWAGEN", - model: "RABBIT", - }, - { - make: "VOLKSWAGEN", - model: "ROUTAN", - }, - { - make: "VOLKSWAGEN", - model: "TIGUAN", - }, - { - make: "VOLKSWAGEN", - model: "TOUAREG", - }, - { - make: "VOLKSWAGEN", - model: "TRANSPORTER VAN", - }, - { - make: "VOLKSWAGEN", - model: "VANAGON", - }, - { - make: "VOLKSWAGEN", - model: "WESTFALIA", - }, - { - make: "VOLKSWAGEN", - model: "WINNEBAGO", - }, - { - make: "VOLVO", - model: "240", - }, - { - make: "VOLVO", - model: "244", - }, - { - make: "VOLVO", - model: "740", - }, - { - make: "VOLVO", - model: "760", - }, - { - make: "VOLVO", - model: "850", - }, - { - make: "VOLVO", - model: "940", - }, - { - make: "VOLVO", - model: "960", - }, - { - make: "VOLVO", - model: "C30", - }, - { - make: "VOLVO", - model: "C70", - }, - { - make: "VOLVO", - model: "DL", - }, - { - make: "VOLVO", - model: "GLE", - }, - { - make: "VOLVO", - model: "GLT", - }, - { - make: "VOLVO", - model: "GT", - }, - { - make: "VOLVO", - model: "S40", - }, - { - make: "VOLVO", - model: "S60", - }, - { - make: "VOLVO", - model: "S70", - }, - { - make: "VOLVO", - model: "S80", - }, - { - make: "VOLVO", - model: "S90", - }, - { - make: "VOLVO", - model: "V40", - }, - { - make: "VOLVO", - model: "V50", - }, - { - make: "VOLVO", - model: "V70", - }, - { - make: "VOLVO", - model: "V70 - X/C", - }, - { - make: "VOLVO", - model: "XC60", - }, - { - make: "VOLVO", - model: "XC70", - }, - { - make: "VOLVO", - model: "XC90", - }, + { + make: "ACURA", + model: "1.6 EL", + }, + { + make: "ACURA", + model: "1.7 EL", + }, + { + make: "ACURA", + model: "2.3 CL", + }, + { + make: "ACURA", + model: "2.5TL", + }, + { + make: "ACURA", + model: "3.2TL", + }, + { + make: "ACURA", + model: "3.5RL", + }, + { + make: "ACURA", + model: "CL", + }, + { + make: "ACURA", + model: "CSX", + }, + { + make: "ACURA", + model: "EL", + }, + { + make: "ACURA", + model: "GSR", + }, + { + make: "ACURA", + model: "ILX", + }, + { + make: "ACURA", + model: "INTEGRA", + }, + { + make: "ACURA", + model: "LEGEND", + }, + { + make: "ACURA", + model: "MDX", + }, + { + make: "ACURA", + model: "NSX", + }, + { + make: "ACURA", + model: "RDX", + }, + { + make: "ACURA", + model: "RSX", + }, + { + make: "ACURA", + model: "TL", + }, + { + make: "ACURA", + model: "TL-S", + }, + { + make: "ACURA", + model: "TLX", + }, + { + make: "ACURA", + model: "TSK 4", + }, + { + make: "ACURA", + model: "TSX", + }, + { + make: "ACURA", + model: "VIGOR", + }, + { + make: "AMC", + model: "GENERAL", + }, + { + make: "AMC", + model: "RAMBLER", + }, + { + make: "ATLAS", + model: "CUB", + }, + { + make: "AUDI", + model: "100", + }, + { + make: "AUDI", + model: "A2", + }, + { + make: "AUDI", + model: "A2 QUATTRO", + }, + { + make: "AUDI", + model: "A3", + }, + { + make: "AUDI", + model: "A4", + }, + { + make: "AUDI", + model: "A4 QUATTRO", + }, + { + make: "AUDI", + model: "A5", + }, + { + make: "AUDI", + model: "A6", + }, + { + make: "AUDI", + model: "Q3", + }, + { + make: "AUDI", + model: "Q5", + }, + { + make: "AUDI", + model: "Q7", + }, + { + make: "AUDI", + model: "QUATTRO", + }, + { + make: "AUDI", + model: "RS4", + }, + { + make: "AUDI", + model: "S3", + }, + { + make: "AUDI", + model: "S4", + }, + { + make: "AUDI", + model: "S5", + }, + { + make: "AUDI", + model: "S6", + }, + { + make: "AUDI", + model: "TT", + }, + { + make: "AUSTIN", + model: "HEALY", + }, + { + make: "BMW", + model: "128I", + }, + { + make: "BMW", + model: "135I", + }, + { + make: "BMW", + model: "135IS", + }, + { + make: "BMW", + model: "228I", + }, + { + make: "BMW", + model: "3 SERIES", + }, + { + make: "BMW", + model: "318", + }, + { + make: "BMW", + model: "318 TI", + }, + { + make: "BMW", + model: "318I", + }, + { + make: "BMW", + model: "318IS", + }, + { + make: "BMW", + model: "320CI", + }, + { + make: "BMW", + model: "320I", + }, + { + make: "BMW", + model: "323I", + }, + { + make: "BMW", + model: "325", + }, + { + make: "BMW", + model: "325CI", + }, + { + make: "BMW", + model: "325E", + }, + { + make: "BMW", + model: "325I", + }, + { + make: "BMW", + model: "325IS", + }, + { + make: "BMW", + model: "325XI", + }, + { + make: "BMW", + model: "328CI", + }, + { + make: "BMW", + model: "328D", + }, + { + make: "BMW", + model: "328I", + }, + { + make: "BMW", + model: "328XI", + }, + { + make: "BMW", + model: "330CI", + }, + { + make: "BMW", + model: "330I", + }, + { + make: "BMW", + model: "330XI", + }, + { + make: "BMW", + model: "335I", + }, + { + make: "BMW", + model: "335XI", + }, + { + make: "BMW", + model: "352I", + }, + { + make: "BMW", + model: "428I", + }, + { + make: "BMW", + model: "430I", + }, + { + make: "BMW", + model: "435I", + }, + { + make: "BMW", + model: "440I", + }, + { + make: "BMW", + model: "520I", + }, + { + make: "BMW", + model: "525I", + }, + { + make: "BMW", + model: "528I", + }, + { + make: "BMW", + model: "530", + }, + { + make: "BMW", + model: "530I", + }, + { + make: "BMW", + model: "530IA", + }, + { + make: "BMW", + model: "530XI", + }, + { + make: "BMW", + model: "535I", + }, + { + make: "BMW", + model: "540I", + }, + { + make: "BMW", + model: "640I", + }, + { + make: "BMW", + model: "645CI", + }, + { + make: "BMW", + model: "735", + }, + { + make: "BMW", + model: "740I", + }, + { + make: "BMW", + model: "745LI", + }, + { + make: "BMW", + model: "750I", + }, + { + make: "BMW", + model: "750LI", + }, + { + make: "BMW", + model: "K-1200", + }, + { + make: "BMW", + model: "M3", + }, + { + make: "BMW", + model: "M5", + }, + { + make: "BMW", + model: "X1", + }, + { + make: "BMW", + model: "X3", + }, + { + make: "BMW", + model: "X5", + }, + { + make: "BMW", + model: "X6", + }, + { + make: "BMW", + model: "Z3", + }, + { + make: "BMW", + model: "Z4", + }, + { + make: "BUICK", + model: "ALLURE", + }, + { + make: "BUICK", + model: "CENTURY", + }, + { + make: "BUICK", + model: "ENCLAVE", + }, + { + make: "BUICK", + model: "ENCORE", + }, + { + make: "BUICK", + model: "ENVISION", + }, + { + make: "BUICK", + model: "INVICTA", + }, + { + make: "BUICK", + model: "LACROSSE", + }, + { + make: "BUICK", + model: "LESABRE", + }, + { + make: "BUICK", + model: "LUCERNE", + }, + { + make: "BUICK", + model: "PARK AVENUE", + }, + { + make: "BUICK", + model: "REGAL", + }, + { + make: "BUICK", + model: "RENDEZVOUS", + }, + { + make: "BUICK", + model: "RIVIERA", + }, + { + make: "BUICK", + model: "ROADMASTER", + }, + { + make: "BUICK", + model: "SKYLARK", + }, + { + make: "BUICK", + model: "SOMERSET", + }, + { + make: "BUICK", + model: "SPECIAL", + }, + { + make: "BUICK", + model: "TERRAZA", + }, + { + make: "BUICK", + model: "VERANO", + }, + { + make: "CADILLAC", + model: "ATS", + }, + { + make: "CADILLAC", + model: "CATERA", + }, + { + make: "CADILLAC", + model: "CTS", + }, + { + make: "CADILLAC", + model: "DE VILLE", + }, + { + make: "CADILLAC", + model: "DTS", + }, + { + make: "CADILLAC", + model: "ELDORADO", + }, + { + make: "CADILLAC", + model: "ESCLADE", + }, + { + make: "CADILLAC", + model: "FLEETWOOD", + }, + { + make: "CADILLAC", + model: "SEVILLE", + }, + { + make: "CADILLAC", + model: "SRX", + }, + { + make: "CADILLAC", + model: "STS", + }, + { + make: "CADILLAC", + model: "XLR", + }, + { + make: "CHEVROLET", + model: "1500", + }, + { + make: "CHEVROLET", + model: "2500", + }, + { + make: "CHEVROLET", + model: "2500HD", + }, + { + make: "CHEVROLET", + model: "2WHDR", + }, + { + make: "CHEVROLET", + model: "3500 EXPRESS VAN", + }, + { + make: "CHEVROLET", + model: "3500 HD", + }, + { + make: "CHEVROLET", + model: "ALER", + }, + { + make: "CHEVROLET", + model: "ASTRO", + }, + { + make: "CHEVROLET", + model: "AVALANCHE", + }, + { + make: "CHEVROLET", + model: "AVEO", + }, + { + make: "CHEVROLET", + model: "BEL AIR", + }, + { + make: "CHEVROLET", + model: "BERETTA", + }, + { + make: "CHEVROLET", + model: "BLAZER", + }, + { + make: "CHEVROLET", + model: "BOLT", + }, + { + make: "CHEVROLET", + model: "BOLT EV", + }, + { + make: "CHEVROLET", + model: "C10", + }, + { + make: "CHEVROLET", + model: "C20", + }, + { + make: "CHEVROLET", + model: "C2500", + }, + { + make: "CHEVROLET", + model: "C3500", + }, + { + make: "CHEVROLET", + model: "CAMARO", + }, + { + make: "CHEVROLET", + model: "CAPRICE", + }, + { + make: "CHEVROLET", + model: "CAVALIER", + }, + { + make: "CHEVROLET", + model: "CHEVELLE", + }, + { + make: "CHEVROLET", + model: "CITY EXPRESS", + }, + { + make: "CHEVROLET", + model: "COBALT", + }, + { + make: "CHEVROLET", + model: "COLORADO", + }, + { + make: "CHEVROLET", + model: "CORSICA", + }, + { + make: "CHEVROLET", + model: "CORVETTE", + }, + { + make: "CHEVROLET", + model: "CRUZE", + }, + { + make: "CHEVROLET", + model: "EL CAMINO", + }, + { + make: "CHEVROLET", + model: "EPICA", + }, + { + make: "CHEVROLET", + model: "EQUINOX", + }, + { + make: "CHEVROLET", + model: "EXPRESS", + }, + { + make: "CHEVROLET", + model: "EXPRESS 1500", + }, + { + make: "CHEVROLET", + model: "EXPRESS 2500", + }, + { + make: "CHEVROLET", + model: "EXPRESS 3500", + }, + { + make: "CHEVROLET", + model: "EXPRESS VAN", + }, + { + make: "CHEVROLET", + model: "G1500", + }, + { + make: "CHEVROLET", + model: "G2500", + }, + { + make: "CHEVROLET", + model: "G30", + }, + { + make: "CHEVROLET", + model: "G3500", + }, + { + make: "CHEVROLET", + model: "G4500", + }, + { + make: "CHEVROLET", + model: "GMT-400", + }, + { + make: "CHEVROLET", + model: "HD 2500", + }, + { + make: "CHEVROLET", + model: "HHR", + }, + { + make: "CHEVROLET", + model: "IMPALA", + }, + { + make: "CHEVROLET", + model: "K1500", + }, + { + make: "CHEVROLET", + model: "K2500", + }, + { + make: "CHEVROLET", + model: "K3500", + }, + { + make: "CHEVROLET", + model: "K5500", + }, + { + make: "CHEVROLET", + model: "LUMINA", + }, + { + make: "CHEVROLET", + model: "MALIBU", + }, + { + make: "CHEVROLET", + model: "MALIBU HYBRID", + }, + { + make: "CHEVROLET", + model: "MONTE CARLO", + }, + { + make: "CHEVROLET", + model: "NOMAD", + }, + { + make: "CHEVROLET", + model: "NOVA", + }, + { + make: "CHEVROLET", + model: "OPTRA", + }, + { + make: "CHEVROLET", + model: "ORLANDO", + }, + { + make: "CHEVROLET", + model: "P30", + }, + { + make: "CHEVROLET", + model: "S10", + }, + { + make: "CHEVROLET", + model: "S10 BLAZER", + }, + { + make: "CHEVROLET", + model: "SAVANNA", + }, + { + make: "CHEVROLET", + model: "SILVERADO", + }, + { + make: "CHEVROLET", + model: "SILVERADO 2500 HD", + }, + { + make: "CHEVROLET", + model: "SILVERADO 3500", + }, + { + make: "CHEVROLET", + model: "SILVERADO 3500 HD", + }, + { + make: "CHEVROLET", + model: "SONIC", + }, + { + make: "CHEVROLET", + model: "SPARK", + }, + { + make: "CHEVROLET", + model: "SPORT VAN G20", + }, + { + make: "CHEVROLET", + model: "SPRINT", + }, + { + make: "CHEVROLET", + model: "SUBURBAN", + }, + { + make: "CHEVROLET", + model: "TAHOE", + }, + { + make: "CHEVROLET", + model: "TRACKER", + }, + { + make: "CHEVROLET", + model: "TRAILBLAZER", + }, + { + make: "CHEVROLET", + model: "TRAVERSE", + }, + { + make: "CHEVROLET", + model: "TRAX", + }, + { + make: "CHEVROLET", + model: "TREX", + }, + { + make: "CHEVROLET", + model: "UPLANDER", + }, + { + make: "CHEVROLET", + model: "VENTURE", + }, + { + make: "CHEVROLET", + model: "VOLT", + }, + { + make: "CHEVROLET", + model: "Z24", + }, + { + make: "CHEVROLET", + model: "Z28 IROC", + }, + { + make: "CHRYSLER", + model: "200", + }, + { + make: "CHRYSLER", + model: "300", + }, + { + make: "CHRYSLER", + model: "300C", + }, + { + make: "CHRYSLER", + model: "300M", + }, + { + make: "CHRYSLER", + model: "5TH AVE", + }, + { + make: "CHRYSLER", + model: "ASPEN", + }, + { + make: "CHRYSLER", + model: "CIRRUS", + }, + { + make: "CHRYSLER", + model: "CONCORDE", + }, + { + make: "CHRYSLER", + model: "CROSSFIRE", + }, + { + make: "CHRYSLER", + model: "DAYTONA", + }, + { + make: "CHRYSLER", + model: "E CLASS", + }, + { + make: "CHRYSLER", + model: "INTREPID", + }, + { + make: "CHRYSLER", + model: "LEBARON", + }, + { + make: "CHRYSLER", + model: "LHS", + }, + { + make: "CHRYSLER", + model: "NEON", + }, + { + make: "CHRYSLER", + model: "NEW YORKER", + }, + { + make: "CHRYSLER", + model: "PACIFICA", + }, + { + make: "CHRYSLER", + model: "PT CRUISER", + }, + { + make: "CHRYSLER", + model: "SEBRING", + }, + { + make: "CHRYSLER", + model: "TOWN & COUNTRY", + }, + { + make: "DATSUN", + model: "PICK-UP", + }, + { + make: "DODGE", + model: "1500", + }, + { + make: "DODGE", + model: "250", + }, + { + make: "DODGE", + model: "2500", + }, + { + make: "DODGE", + model: "4500", + }, + { + make: "DODGE", + model: "5500", + }, + { + make: "DODGE", + model: "ARIES", + }, + { + make: "DODGE", + model: "AVENGER", + }, + { + make: "DODGE", + model: "B1500", + }, + { + make: "DODGE", + model: "B200", + }, + { + make: "DODGE", + model: "B250", + }, + { + make: "DODGE", + model: "B350", + }, + { + make: "DODGE", + model: "CALIBER", + }, + { + make: "DODGE", + model: "CAMPERVAN", + }, + { + make: "DODGE", + model: "CARAVAN", + }, + { + make: "DODGE", + model: "CHALLENGER", + }, + { + make: "DODGE", + model: "CHARGER", + }, + { + make: "DODGE", + model: "COLT", + }, + { + make: "DODGE", + model: "CORNET", + }, + { + make: "DODGE", + model: "CV VAN", + }, + { + make: "DODGE", + model: "D100", + }, + { + make: "DODGE", + model: "D200", + }, + { + make: "DODGE", + model: "D250", + }, + { + make: "DODGE", + model: "D300", + }, + { + make: "DODGE", + model: "D350", + }, + { + make: "DODGE", + model: "DAKOTA", + }, + { + make: "DODGE", + model: "DART", + }, + { + make: "DODGE", + model: "DEMON", + }, + { + make: "DODGE", + model: "DURANGO", + }, + { + make: "DODGE", + model: "DYNASTY", + }, + { + make: "DODGE", + model: "GRAND CARAVAN", + }, + { + make: "DODGE", + model: "GRAND CARAVEN SE", + }, + { + make: "DODGE", + model: "JOURNEY", + }, + { + make: "DODGE", + model: "MAGNUM", + }, + { + make: "DODGE", + model: "MOTORHOME", + }, + { + make: "DODGE", + model: "NEON", + }, + { + make: "DODGE", + model: "NITRO", + }, + { + make: "DODGE", + model: "PRO MASTER", + }, + { + make: "DODGE", + model: "PRO MASTER 3500", + }, + { + make: "DODGE", + model: "RAM", + }, + { + make: "DODGE", + model: "RAM 1500", + }, + { + make: "DODGE", + model: "RAM 250", + }, + { + make: "DODGE", + model: "RAM 2500", + }, + { + make: "DODGE", + model: "RAM 3500", + }, + { + make: "DODGE", + model: "RAM 5500", + }, + { + make: "DODGE", + model: "RAM PRO MASTER", + }, + { + make: "DODGE", + model: "RAM SRT10", + }, + { + make: "DODGE", + model: "RAM VAN", + }, + { + make: "DODGE", + model: "RAMPAGE", + }, + { + make: "DODGE", + model: "SHADOW", + }, + { + make: "DODGE", + model: "SPIRIT", + }, + { + make: "DODGE", + model: "SPRINTER 3500", + }, + { + make: "DODGE", + model: "SRT", + }, + { + make: "DODGE", + model: "STEALTH", + }, + { + make: "DODGE", + model: "STRATUS", + }, + { + make: "DODGE", + model: "SWINGER", + }, + { + make: "DODGE", + model: "SX 2.0", + }, + { + make: "DODGE", + model: "W200", + }, + { + make: "DODGE", + model: "W350", + }, + { + make: "EAGLE", + model: "SUMMIT", + }, + { + make: "EAGLE", + model: "TALON", + }, + { + make: "EAGLE", + model: "VISION", + }, + { + make: "FIAT", + model: "500C", + }, + { + make: "FIAT", + model: "500L", + }, + { + make: "FORD", + model: "500", + }, + { + make: "FORD", + model: "AEROSTAR", + }, + { + make: "FORD", + model: "ASPIRE", + }, + { + make: "FORD", + model: "BRONCO", + }, + { + make: "FORD", + model: "CMAX", + }, + { + make: "FORD", + model: "CONTOUR", + }, + { + make: "FORD", + model: "CROWN VIC", + }, + { + make: "FORD", + model: "CUBE VAN", + }, + { + make: "FORD", + model: "DUMP TRUCK", + }, + { + make: "FORD", + model: "E150", + }, + { + make: "FORD", + model: "E250", + }, + { + make: "FORD", + model: "E350", + }, + { + make: "FORD", + model: "E450", + }, + { + make: "FORD", + model: "ECO SPORT", + }, + { + make: "FORD", + model: "ECONOLINE", + }, + { + make: "FORD", + model: "EDGE", + }, + { + make: "FORD", + model: "ESCAPE", + }, + { + make: "FORD", + model: "ESCORT", + }, + { + make: "FORD", + model: "EXCURSION", + }, + { + make: "FORD", + model: "EXPEDITION", + }, + { + make: "FORD", + model: "EXPLORER", + }, + { + make: "FORD", + model: "EXPLORER SPORT", + }, + { + make: "FORD", + model: "EXPLORER SPORT TRAC", + }, + { + make: "FORD", + model: "F-150", + }, + { + make: "FORD", + model: "F-250", + }, + { + make: "FORD", + model: "F-350", + }, + { + make: "FORD", + model: "F-450", + }, + { + make: "FORD", + model: "F-550", + }, + { + make: "FORD", + model: "FAIRLANE", + }, + { + make: "FORD", + model: "FESTIVA", + }, + { + make: "FORD", + model: "FIESTA", + }, + { + make: "FORD", + model: "FLAT DECK", + }, + { + make: "FORD", + model: "FLEX", + }, + { + make: "FORD", + model: "FOCUS", + }, + { + make: "FORD", + model: "FREESTAR", + }, + { + make: "FORD", + model: "FREESTYLE", + }, + { + make: "FORD", + model: "FUSION", + }, + { + make: "FORD", + model: "GALAXIE 500", + }, + { + make: "FORD", + model: "LARIAT", + }, + { + make: "FORD", + model: "LCF", + }, + { + make: "FORD", + model: "LGT", + }, + { + make: "FORD", + model: "MOTORHOME", + }, + { + make: "FORD", + model: "MUSTANG", + }, + { + make: "FORD", + model: "PLEASURE WAY", + }, + { + make: "FORD", + model: "PROBE", + }, + { + make: "FORD", + model: "RANGER", + }, + { + make: "FORD", + model: "RAPTOR", + }, + { + make: "FORD", + model: "SPORT TRAC", + }, + { + make: "FORD", + model: "SUPER DUTY", + }, + { + make: "FORD", + model: "TAURUS", + }, + { + make: "FORD", + model: "T-BIRD", + }, + { + make: "FORD", + model: "T-BUCKET", + }, + { + make: "FORD", + model: "TEMPO", + }, + { + make: "FORD", + model: "THUNDERBIRD", + }, + { + make: "FORD", + model: "TRANSIT", + }, + { + make: "FORD", + model: "TRANSIT 250", + }, + { + make: "FORD", + model: "TRANSIT 350HD", + }, + { + make: "FORD", + model: "TRANSIT CONNECT", + }, + { + make: "FORD", + model: "TRANSIT COONECT", + }, + { + make: "FORD", + model: "WINDSTAR", + }, + { + make: "FREIGHTLINER", + model: "FL70", + }, + { + make: "FREIGHTLINER", + model: "M2", + }, + { + make: "GEO", + model: "METRO", + }, + { + make: "GEO", + model: "STORM", + }, + { + make: "GEO", + model: "TRACKER", + }, + { + make: "GMC", + model: "1500", + }, + { + make: "GMC", + model: "2500 HD", + }, + { + make: "GMC", + model: "3500", + }, + { + make: "GMC", + model: "4000", + }, + { + make: "GMC", + model: "4500HD", + }, + { + make: "GMC", + model: "ACADIA", + }, + { + make: "GMC", + model: "C1500", + }, + { + make: "GMC", + model: "C2500", + }, + { + make: "GMC", + model: "C4500", + }, + { + make: "GMC", + model: "CANYON", + }, + { + make: "GMC", + model: "CARGO", + }, + { + make: "GMC", + model: "DENALI HD", + }, + { + make: "GMC", + model: "ENVOY", + }, + { + make: "GMC", + model: "G2500 VANDURA", + }, + { + make: "GMC", + model: "G35 SAVANNA", + }, + { + make: "GMC", + model: "GEO", + }, + { + make: "GMC", + model: "JIMMY", + }, + { + make: "GMC", + model: "K 2500", + }, + { + make: "GMC", + model: "K1500", + }, + { + make: "GMC", + model: "K3500", + }, + { + make: "GMC", + model: "RALLY", + }, + { + make: "GMC", + model: "S15", + }, + { + make: "GMC", + model: "S1500", + }, + { + make: "GMC", + model: "SAFARI", + }, + { + make: "GMC", + model: "SAVANA", + }, + { + make: "GMC", + model: "SAVANA 3500", + }, + { + make: "GMC", + model: "SIERRA", + }, + { + make: "GMC", + model: "SIERRA 1500", + }, + { + make: "GMC", + model: "SIERRA 2500", + }, + { + make: "GMC", + model: "SIERRA 2500 HD", + }, + { + make: "GMC", + model: "SIERRA 3500", + }, + { + make: "GMC", + model: "SIERRA 3500, DENALI", + }, + { + make: "GMC", + model: "SIERRA K1500", + }, + { + make: "GMC", + model: "SLX", + }, + { + make: "GMC", + model: "SONOMA", + }, + { + make: "GMC", + model: "T7500", + }, + { + make: "GMC", + model: "TERRAIN", + }, + { + make: "GMC", + model: "TOP KICK", + }, + { + make: "GMC", + model: "TOP KICK 6500", + }, + { + make: "GMC", + model: "TOP KICK C4500", + }, + { + make: "GMC", + model: "TRACKER", + }, + { + make: "GMC", + model: "UTILIMASTER CUBE VAN", + }, + { + make: "GMC", + model: "V15", + }, + { + make: "GMC", + model: "VANDURA", + }, + { + make: "GMC", + model: "VIXEN", + }, + { + make: "GMC", + model: "W4500", + }, + { + make: "GMC", + model: "W550", + }, + { + make: "GMC", + model: "W5500", + }, + { + make: "GMC", + model: "YUKON", + }, + { + make: "GOLF", + model: "SPORT WAGON", + }, + { + make: "HINO", + model: "268", + }, + { + make: "HINO", + model: "338", + }, + { + make: "HONDA", + model: "ACCORD", + }, + { + make: "HONDA", + model: "CIVIC", + }, + { + make: "HONDA", + model: "CIVIC HYBRID", + }, + { + make: "HONDA", + model: "CRV", + }, + { + make: "HONDA", + model: "CRX", + }, + { + make: "HONDA", + model: "CR-Z", + }, + { + make: "HONDA", + model: "DEL SOL", + }, + { + make: "HONDA", + model: "ELEMENT", + }, + { + make: "HONDA", + model: "FIT", + }, + { + make: "HONDA", + model: "HR V", + }, + { + make: "HONDA", + model: "INSIGHT", + }, + { + make: "HONDA", + model: "ODYSSEY", + }, + { + make: "HONDA", + model: "PASSPORT", + }, + { + make: "HONDA", + model: "PILOT", + }, + { + make: "HONDA", + model: "PRELUDE", + }, + { + make: "HONDA", + model: "RIDGELINE", + }, + { + make: "HONDA", + model: "S2000", + }, + { + make: "HUMMER", + model: "H2", + }, + { + make: "HUMMER", + model: "H3", + }, + { + make: "HYUNDAI", + model: "ACCENT", + }, + { + make: "HYUNDAI", + model: "AZERA", + }, + { + make: "HYUNDAI", + model: "ELANTRA", + }, + { + make: "HYUNDAI", + model: "ENTOURAGE", + }, + { + make: "HYUNDAI", + model: "GENESIS", + }, + { + make: "HYUNDAI", + model: "IONIQ", + }, + { + make: "HYUNDAI", + model: "KONA", + }, + { + make: "HYUNDAI", + model: "SANTA FE", + }, + { + make: "HYUNDAI", + model: "SANTA FE SPORT", + }, + { + make: "HYUNDAI", + model: "SCOUPE", + }, + { + make: "HYUNDAI", + model: "SONATA", + }, + { + make: "HYUNDAI", + model: "TIBURON", + }, + { + make: "HYUNDAI", + model: "TOURING", + }, + { + make: "HYUNDAI", + model: "TUCSON", + }, + { + make: "HYUNDAI", + model: "VELOSTER", + }, + { + make: "HYUNDAI", + model: "VENUE", + }, + { + make: "HYUNDAI", + model: "VERA CRUZ", + }, + { + make: "HYUNDAI", + model: "XG350", + }, + { + make: "HYUNDAI", + model: "XG7", + }, + { + make: "INFINITI", + model: "DURASTAR", + }, + { + make: "INFINITI", + model: "EX35", + }, + { + make: "INFINITI", + model: "FX35", + }, + { + make: "INFINITI", + model: "FX45", + }, + { + make: "INFINITI", + model: "FX50", + }, + { + make: "INFINITI", + model: "G20", + }, + { + make: "INFINITI", + model: "G35", + }, + { + make: "INFINITI", + model: "G35X", + }, + { + make: "INFINITI", + model: "G37", + }, + { + make: "INFINITI", + model: "G37X", + }, + { + make: "INFINITI", + model: "i30", + }, + { + make: "INFINITI", + model: "I35", + }, + { + make: "INFINITI", + model: "J30", + }, + { + make: "INFINITI", + model: "JX35", + }, + { + make: "INFINITI", + model: "L30", + }, + { + make: "INFINITI", + model: "Q35", + }, + { + make: "INFINITI", + model: "Q45", + }, + { + make: "INFINITI", + model: "Q50", + }, + { + make: "INFINITI", + model: "Q60", + }, + { + make: "INFINITI", + model: "QX4", + }, + { + make: "INFINITI", + model: "QX50", + }, + { + make: "INFINITI", + model: "QX56", + }, + { + make: "INFINITI", + model: "QX60", + }, + { + make: "ISUZU", + model: "BIGHORN", + }, + { + make: "ISUZU", + model: "CAB OVER", + }, + { + make: "ISUZU", + model: "HOMBRE", + }, + { + make: "ISUZU", + model: "NPR", + }, + { + make: "ISUZU", + model: "NPR - HD", + }, + { + make: "ISUZU", + model: "NRR", + }, + { + make: "ISUZU", + model: "NRR - CAB OVER", + }, + { + make: "ISUZU", + model: "RODEO", + }, + { + make: "ISUZU", + model: "TROOPER", + }, + { + make: "JAGUAR", + model: "F-PACE", + }, + { + make: "JAGUAR", + model: "GATOR 850D", + }, + { + make: "JAGUAR", + model: "IPACE", + }, + { + make: "JAGUAR", + model: "S TYPE", + }, + { + make: "JAGUAR", + model: "VANDEN PLAS", + }, + { + make: "JAGUAR", + model: "XJ1", + }, + { + make: "JAGUAR", + model: "XJ6", + }, + { + make: "JAGUAR", + model: "XJ8", + }, + { + make: "JAGUAR", + model: "XJS", + }, + { + make: "JAGUAR", + model: "XK8", + }, + { + make: "JAGUAR", + model: "X-TYPE", + }, + { + make: "JEEP", + model: "CHEROKEE", + }, + { + make: "JEEP", + model: "CJ", + }, + { + make: "JEEP", + model: "CJ7", + }, + { + make: "JEEP", + model: "COMMANCHE", + }, + { + make: "JEEP", + model: "COMMANDER", + }, + { + make: "JEEP", + model: "COMPASS", + }, + { + make: "JEEP", + model: "CP", + }, + { + make: "JEEP", + model: "GRAND CHEROKEE", + }, + { + make: "JEEP", + model: "GRAND WAGONEER", + }, + { + make: "JEEP", + model: "JK", + }, + { + make: "JEEP", + model: "LIBERTY", + }, + { + make: "JEEP", + model: "PATRIOT", + }, + { + make: "JEEP", + model: "PT", + }, + { + make: "JEEP", + model: "RENEGADE", + }, + { + make: "JEEP", + model: "RUBICON", + }, + { + make: "JEEP", + model: "TJ", + }, + { + make: "JEEP", + model: "TJ SPORT", + }, + { + make: "JEEP", + model: "WRANGLER", + }, + { + make: "JEEP", + model: "YJ", + }, + { + make: "KIA", + model: "CADENZA", + }, + { + make: "KIA", + model: "CARNIVAL", + }, + { + make: "KIA", + model: "FORTE", + }, + { + make: "KIA", + model: "FORTE 5", + }, + { + make: "KIA", + model: "MAGENTIS", + }, + { + make: "KIA", + model: "NIRO", + }, + { + make: "KIA", + model: "OPTIMA", + }, + { + make: "KIA", + model: "RIO", + }, + { + make: "KIA", + model: "RIO 5", + }, + { + make: "KIA", + model: "RONDO", + }, + { + make: "KIA", + model: "RX-V", + }, + { + make: "KIA", + model: "SEDONA", + }, + { + make: "KIA", + model: "SELTO", + }, + { + make: "KIA", + model: "SEPHIA", + }, + { + make: "KIA", + model: "SORENTO", + }, + { + make: "KIA", + model: "SOUL", + }, + { + make: "KIA", + model: "SPECTRA", + }, + { + make: "KIA", + model: "SPECTRA 5", + }, + { + make: "KIA", + model: "SPORT", + }, + { + make: "KIA", + model: "SPORTAGE", + }, + { + make: "KIA", + model: "VAN", + }, + { + make: "LAND ROVER", + model: "DISCOVERY SPORT", + }, + { + make: "LAND ROVER", + model: "LR2", + }, + { + make: "LAND ROVER", + model: "RANGE ROVER EVOQUE", + }, + { + make: "LAND ROVER", + model: "RANGE ROVER SPORT", + }, + { + make: "LANDROVER", + model: "40 SE", + }, + { + make: "LANDROVER", + model: "46HSE", + }, + { + make: "LANDROVER", + model: "DEFENDER", + }, + { + make: "LANDROVER", + model: "DISCOVERY", + }, + { + make: "LANDROVER", + model: "DISCOVERY II", + }, + { + make: "LANDROVER", + model: "FREELANDER", + }, + { + make: "LANDROVER", + model: "LR2", + }, + { + make: "LANDROVER", + model: "RANGE ROVER", + }, + { + make: "LEXUS", + model: "ES300", + }, + { + make: "LEXUS", + model: "ES350", + }, + { + make: "LEXUS", + model: "GS250", + }, + { + make: "LEXUS", + model: "GS300", + }, + { + make: "LEXUS", + model: "GS450", + }, + { + make: "LEXUS", + model: "GX470", + }, + { + make: "LEXUS", + model: "HS250", + }, + { + make: "LEXUS", + model: "IS250", + }, + { + make: "LEXUS", + model: "IS300", + }, + { + make: "LEXUS", + model: "IX 330", + }, + { + make: "LEXUS", + model: "LS400", + }, + { + make: "LEXUS", + model: "LS430", + }, + { + make: "LEXUS", + model: "LX450", + }, + { + make: "LEXUS", + model: "LX470", + }, + { + make: "LEXUS", + model: "NX200", + }, + { + make: "LEXUS", + model: "RC F", + }, + { + make: "LEXUS", + model: "RX 300", + }, + { + make: "LEXUS", + model: "RX 330", + }, + { + make: "LEXUS", + model: "RX 350", + }, + { + make: "LEXUS", + model: "RX 400H", + }, + { + make: "LEXUS", + model: "RX300", + }, + { + make: "LEXUS", + model: "RX330", + }, + { + make: "LEXUS", + model: "RX350", + }, + { + make: "LEXUS", + model: "RX400", + }, + { + make: "LEXUS", + model: "RX450H", + }, + { + make: "LEXUS", + model: "SC430", + }, + { + make: "LEXUS", + model: "SOARER", + }, + { + make: "LEXUS", + model: "UX250", + }, + { + make: "LINCOLN", + model: "AVIATOR", + }, + { + make: "LINCOLN", + model: "CONTINENTAL", + }, + { + make: "LINCOLN", + model: "LS", + }, + { + make: "LINCOLN", + model: "MARK", + }, + { + make: "LINCOLN", + model: "MARK 5", + }, + { + make: "LINCOLN", + model: "MARK LT", + }, + { + make: "LINCOLN", + model: "MKC", + }, + { + make: "LINCOLN", + model: "MKS", + }, + { + make: "LINCOLN", + model: "MKX", + }, + { + make: "LINCOLN", + model: "MKZ", + }, + { + make: "LINCOLN", + model: "NAVIGATOR", + }, + { + make: "LINCOLN", + model: "PICKUP", + }, + { + make: "LINCOLN", + model: "TOWN CAR", + }, + { + make: "LINCOLN", + model: "ZEPHER", + }, + { + make: "Make", + model: "Model", + }, + { + make: "MARK", + model: "LT", + }, + { + make: "MASERATI", + model: "GHIBLI", + }, + { + make: "MAZDA", + model: "2", + }, + { + make: "MAZDA", + model: "3", + }, + { + make: "MAZDA", + model: "3 H/B", + }, + { + make: "MAZDA", + model: "3 SPORT", + }, + { + make: "MAZDA", + model: "323", + }, + { + make: "MAZDA", + model: "3GS", + }, + { + make: "MAZDA", + model: "3GT", + }, + { + make: "MAZDA", + model: "5", + }, + { + make: "MAZDA", + model: "6", + }, + { + make: "MAZDA", + model: "626", + }, + { + make: "MAZDA", + model: "626ES", + }, + { + make: "MAZDA", + model: "929", + }, + { + make: "MAZDA", + model: "B2000", + }, + { + make: "MAZDA", + model: "B2200", + }, + { + make: "MAZDA", + model: "B2220", + }, + { + make: "MAZDA", + model: "B2300", + }, + { + make: "MAZDA", + model: "B2500", + }, + { + make: "MAZDA", + model: "B2600", + }, + { + make: "MAZDA", + model: "B2600I", + }, + { + make: "MAZDA", + model: "B3000", + }, + { + make: "MAZDA", + model: "B4000", + }, + { + make: "MAZDA", + model: "B-SERIES", + }, + { + make: "MAZDA", + model: "CX 7", + }, + { + make: "MAZDA", + model: "CX3", + }, + { + make: "MAZDA", + model: "CX-3", + }, + { + make: "MAZDA", + model: "CX5", + }, + { + make: "MAZDA", + model: "CX-5", + }, + { + make: "MAZDA", + model: "CX5 GT", + }, + { + make: "MAZDA", + model: "CX9", + }, + { + make: "MAZDA", + model: "CX-9", + }, + { + make: "MAZDA", + model: "D", + }, + { + make: "MAZDA", + model: "MAZDA 3", + }, + { + make: "MAZDA", + model: "MAZDA 5", + }, + { + make: "MAZDA", + model: "MAZDA 6", + }, + { + make: "MAZDA", + model: "MIATA", + }, + { + make: "MAZDA", + model: "MIATA GX", + }, + { + make: "MAZDA", + model: "MILLENIA", + }, + { + make: "MAZDA", + model: "MPV", + }, + { + make: "MAZDA", + model: "MR 2", + }, + { + make: "MAZDA", + model: "MX-3", + }, + { + make: "MAZDA", + model: "MX-3 PRECIDIA", + }, + { + make: "MAZDA", + model: "MX-5", + }, + { + make: "MAZDA", + model: "MX-6", + }, + { + make: "MAZDA", + model: "PRECIDIA", + }, + { + make: "MAZDA", + model: "PROTEGE", + }, + { + make: "MAZDA", + model: "PROTEGE 5", + }, + { + make: "MAZDA", + model: "RX7", + }, + { + make: "MAZDA", + model: "RX8", + }, + { + make: "MAZDA", + model: "TRIBUTE", + }, + { + make: "MERCEDES-BENZ", + model: "190E", + }, + { + make: "MERCEDES-BENZ", + model: "240D", + }, + { + make: "MERCEDES-BENZ", + model: "245 BCLASS", + }, + { + make: "MERCEDES-BENZ", + model: "300", + }, + { + make: "MERCEDES-BENZ", + model: "300SD", + }, + { + make: "MERCEDES-BENZ", + model: "300SL", + }, + { + make: "MERCEDES-BENZ", + model: "B200", + }, + { + make: "MERCEDES-BENZ", + model: "B250", + }, + { + make: "MERCEDES-BENZ", + model: "C220", + }, + { + make: "MERCEDES-BENZ", + model: "C230", + }, + { + make: "MERCEDES-BENZ", + model: "C230 KOMPRESSOR", + }, + { + make: "MERCEDES-BENZ", + model: "C240", + }, + { + make: "MERCEDES-BENZ", + model: "C300", + }, + { + make: "MERCEDES-BENZ", + model: "C300W", + }, + { + make: "MERCEDES-BENZ", + model: "C320", + }, + { + make: "MERCEDES-BENZ", + model: "C350", + }, + { + make: "MERCEDES-BENZ", + model: "C400", + }, + { + make: "MERCEDES-BENZ", + model: "C43", + }, + { + make: "MERCEDES-BENZ", + model: "C63", + }, + { + make: "MERCEDES-BENZ", + model: "C63 AMG", + }, + { + make: "MERCEDES-BENZ", + model: "CLA25", + }, + { + make: "MERCEDES-BENZ", + model: "CLK", + }, + { + make: "MERCEDES-BENZ", + model: "CLK230", + }, + { + make: "MERCEDES-BENZ", + model: "CLK320", + }, + { + make: "MERCEDES-BENZ", + model: "CLK350", + }, + { + make: "MERCEDES-BENZ", + model: "CLK500", + }, + { + make: "MERCEDES-BENZ", + model: "CLR350", + }, + { + make: "MERCEDES-BENZ", + model: "COMPRESSOR", + }, + { + make: "MERCEDES-BENZ", + model: "E300", + }, + { + make: "MERCEDES-BENZ", + model: "E320", + }, + { + make: "MERCEDES-BENZ", + model: "E400", + }, + { + make: "MERCEDES-BENZ", + model: "E420", + }, + { + make: "MERCEDES-BENZ", + model: "E500W", + }, + { + make: "MERCEDES-BENZ", + model: "E550", + }, + { + make: "MERCEDES-BENZ", + model: "GLA25", + }, + { + make: "MERCEDES-BENZ", + model: "GLC30", + }, + { + make: "MERCEDES-BENZ", + model: "GLE350", + }, + { + make: "MERCEDES-BENZ", + model: "GLK", + }, + { + make: "MERCEDES-BENZ", + model: "GLK25", + }, + { + make: "MERCEDES-BENZ", + model: "GLK250", + }, + { + make: "MERCEDES-BENZ", + model: "GLK35", + }, + { + make: "MERCEDES-BENZ", + model: "GLK35", + }, + { + make: "MERCEDES-BENZ", + model: "M1320", + }, + { + make: "MERCEDES-BENZ", + model: "METRIS", + }, + { + make: "MERCEDES-BENZ", + model: "MI320", + }, + { + make: "MERCEDES-BENZ", + model: "MI350", + }, + { + make: "MERCEDES-BENZ", + model: "MI500", + }, + { + make: "MERCEDES-BENZ", + model: "ML350", + }, + { + make: "MERCEDES-BENZ", + model: "ML400", + }, + { + make: "MERCEDES-BENZ", + model: "ML430", + }, + { + make: "MERCEDES-BENZ", + model: "ML55", + }, + { + make: "MERCEDES-BENZ", + model: "ML63", + }, + { + make: "MERCEDES-BENZ", + model: "R320", + }, + { + make: "MERCEDES-BENZ", + model: "S155", + }, + { + make: "MERCEDES-BENZ", + model: "S450V", + }, + { + make: "MERCEDES-BENZ", + model: "SL500", + }, + { + make: "MERCEDES-BENZ", + model: "SLK230", + }, + { + make: "MERCEDES-BENZ", + model: "SLK350", + }, + { + make: "MERCEDES-BENZ", + model: "SPRINTER", + }, + { + make: "MERCEDES-BENZ", + model: "SPRINTER VAN", + }, + { + make: "MERCURY", + model: "COMET", + }, + { + make: "MERCURY", + model: "COUGAR", + }, + { + make: "MERCURY", + model: "GRAND MARQUIS", + }, + { + make: "MERCURY", + model: "MARQUIS", + }, + { + make: "MERCURY", + model: "MURADER", + }, + { + make: "MERCURY", + model: "MYSTIQUE", + }, + { + make: "MERCURY", + model: "SABLE", + }, + { + make: "MERCURY", + model: "TOPAZ", + }, + { + make: "MERCURY", + model: "VILLAGER", + }, + { + make: "MINI", + model: "COOPER", + }, + { + make: "MINI", + model: "COOPER CLUBMAN", + }, + { + make: "MINI", + model: "COOPER COUNTRYMAN", + }, + { + make: "MINI", + model: "COOPER S", + }, + { + make: "MITSUBISHI", + model: "DELICA", + }, + { + make: "MITSUBISHI", + model: "ECLIPSE", + }, + { + make: "MITSUBISHI", + model: "ECLIPSE CROSS", + }, + { + make: "MITSUBISHI", + model: "ENDVR", + }, + { + make: "MITSUBISHI", + model: "GALANT", + }, + { + make: "MITSUBISHI", + model: "LANCER", + }, + { + make: "MITSUBISHI", + model: "LANCER EVOLUTION", + }, + { + make: "MITSUBISHI", + model: "MIRAGE", + }, + { + make: "MITSUBISHI", + model: "MONTERO", + }, + { + make: "MITSUBISHI", + model: "OUTLANDER", + }, + { + make: "MITSUBISHI", + model: "PJERO", + }, + { + make: "MITSUBISHI", + model: "RVR", + }, + { + make: "MITSUBISHI", + model: "SPYDER", + }, + { + make: "NISSAN", + model: "200", + }, + { + make: "NISSAN", + model: "200SX", + }, + { + make: "NISSAN", + model: "240SX", + }, + { + make: "NISSAN", + model: "240Z", + }, + { + make: "NISSAN", + model: "2500 VAN", + }, + { + make: "NISSAN", + model: "280", + }, + { + make: "NISSAN", + model: "300ZX", + }, + { + make: "NISSAN", + model: "350Z", + }, + { + make: "NISSAN", + model: "370Z", + }, + { + make: "NISSAN", + model: "ALTIMA", + }, + { + make: "NISSAN", + model: "ARMADA", + }, + { + make: "NISSAN", + model: "AXXESS", + }, + { + make: "NISSAN", + model: "CUBE", + }, + { + make: "NISSAN", + model: "D21", + }, + { + make: "NISSAN", + model: "FIGARO", + }, + { + make: "NISSAN", + model: "FRONTIER", + }, + { + make: "NISSAN", + model: "HALFTON DLX", + }, + { + make: "NISSAN", + model: "JUKE", + }, + { + make: "NISSAN", + model: "KICKS", + }, + { + make: "NISSAN", + model: "LEAF", + }, + { + make: "NISSAN", + model: "MAXIMA", + }, + { + make: "NISSAN", + model: "MICRA", + }, + { + make: "NISSAN", + model: "MURANO", + }, + { + make: "NISSAN", + model: "NV200", + }, + { + make: "NISSAN", + model: "NV250", + }, + { + make: "NISSAN", + model: "NV2500", + }, + { + make: "NISSAN", + model: "PATHFINDER", + }, + { + make: "NISSAN", + model: "PULSAR", + }, + { + make: "NISSAN", + model: "QASHQAI", + }, + { + make: "NISSAN", + model: "QSHQI", + }, + { + make: "NISSAN", + model: "QUEST", + }, + { + make: "NISSAN", + model: "ROGUE", + }, + { + make: "NISSAN", + model: "SENTRA", + }, + { + make: "NISSAN", + model: "SILVIA", + }, + { + make: "NISSAN", + model: "SKYLINE", + }, + { + make: "NISSAN", + model: "SKYLINE GTR", + }, + { + make: "NISSAN", + model: "TERRANO", + }, + { + make: "NISSAN", + model: "TITAN", + }, + { + make: "NISSAN", + model: "TRANO - PATHFINDER", + }, + { + make: "NISSAN", + model: "VERS", + }, + { + make: "NISSAN", + model: "VERSA", + }, + { + make: "NISSAN", + model: "X-TERRA", + }, + { + make: "NISSAN", + model: "X-TRAIL", + }, + { + make: "OLDSMOBILE", + model: "ACHIEVA", + }, + { + make: "OLDSMOBILE", + model: "ALERO", + }, + { + make: "OLDSMOBILE", + model: "AURORA", + }, + { + make: "OLDSMOBILE", + model: "BRAVADO", + }, + { + make: "OLDSMOBILE", + model: "CUTLASS", + }, + { + make: "OLDSMOBILE", + model: "DELTA 88", + }, + { + make: "OLDSMOBILE", + model: "DELTA 88 ROYALE BROUGHAM", + }, + { + make: "OLDSMOBILE", + model: "INTRIGUE", + }, + { + make: "OLDSMOBILE", + model: "NINETY EIGHT", + }, + { + make: "OLDSMOBILE", + model: "OMEGA", + }, + { + make: "OLDSMOBILE", + model: "REGENCY", + }, + { + make: "OLDSMOBILE", + model: "SILHOUETTE", + }, + { + make: "OLDSMOBILE", + model: "TORONADO", + }, + { + make: "PLYMOUTH", + model: "ACCLAIM", + }, + { + make: "PLYMOUTH", + model: "BARACUDA", + }, + { + make: "PLYMOUTH", + model: "BREEZE", + }, + { + make: "PLYMOUTH", + model: "CARAVAN", + }, + { + make: "PLYMOUTH", + model: "GR.VOYAGER", + }, + { + make: "PLYMOUTH", + model: "NEON", + }, + { + make: "PLYMOUTH", + model: "RELIANT", + }, + { + make: "PLYMOUTH", + model: "SUNDANCE", + }, + { + make: "PLYMOUTH", + model: "VALANT", + }, + { + make: "PLYMOUTH", + model: "VOYAGER", + }, + { + make: "POLARIS", + model: "570 CREW", + }, + { + make: "POLARIS", + model: "GENERAL 2+2", + }, + { + make: "PONTIAC", + model: "ACADIAN", + }, + { + make: "PONTIAC", + model: "AZTEC", + }, + { + make: "PONTIAC", + model: "BEAUMONT", + }, + { + make: "PONTIAC", + model: "BONNEVILLE", + }, + { + make: "PONTIAC", + model: "FIERO", + }, + { + make: "PONTIAC", + model: "FIREBIRD", + }, + { + make: "PONTIAC", + model: "FIREFLY", + }, + { + make: "PONTIAC", + model: "G3", + }, + { + make: "PONTIAC", + model: "G5", + }, + { + make: "PONTIAC", + model: "G6", + }, + { + make: "PONTIAC", + model: "G8", + }, + { + make: "PONTIAC", + model: "GRAND AM", + }, + { + make: "PONTIAC", + model: "GRAND PRIX", + }, + { + make: "PONTIAC", + model: "GTO", + }, + { + make: "PONTIAC", + model: "MONTANA", + }, + { + make: "PONTIAC", + model: "PARRISSIEN", + }, + { + make: "PONTIAC", + model: "PURSUIT", + }, + { + make: "PONTIAC", + model: "SOLSTICE", + }, + { + make: "PONTIAC", + model: "SUNBIRD", + }, + { + make: "PONTIAC", + model: "SUNFIRE", + }, + { + make: "PONTIAC", + model: "SUNRUNNER", + }, + { + make: "PONTIAC", + model: "TEMPEST", + }, + { + make: "PONTIAC", + model: "TORRENT", + }, + { + make: "PONTIAC", + model: "TRANS-AM", + }, + { + make: "PONTIAC", + model: "TRANSPORT", + }, + { + make: "PONTIAC", + model: "VIBE", + }, + { + make: "PONTIAC", + model: "WAVE", + }, + { + make: "PORSCHE", + model: "911", + }, + { + make: "PORSCHE", + model: "928", + }, + { + make: "PORSCHE", + model: "944", + }, + { + make: "PORSCHE", + model: "944 TURBO", + }, + { + make: "PORSCHE", + model: "BOXSTER", + }, + { + make: "PORSCHE", + model: "CAYENNE", + }, + { + make: "RANGE ROVER", + model: "46SHE", + }, + { + make: "RANGE ROVER", + model: "PROMA", + }, + { + make: "RANGE ROVER", + model: "RANGE", + }, + { + make: "SAAB", + model: "9", + }, + { + make: "SAAB", + model: "900S", + }, + { + make: "SAAB", + model: "9-2X", + }, + { + make: "SAAB", + model: "9-3", + }, + { + make: "SAAB", + model: "93 AREO", + }, + { + make: "SAAB", + model: "9-5", + }, + { + make: "SATURN", + model: "ASTRA", + }, + { + make: "SATURN", + model: "AURA", + }, + { + make: "SATURN", + model: "ION", + }, + { + make: "SATURN", + model: "L100", + }, + { + make: "SATURN", + model: "L200", + }, + { + make: "SATURN", + model: "LS1", + }, + { + make: "SATURN", + model: "LS2", + }, + { + make: "SATURN", + model: "OUTLOOK", + }, + { + make: "SATURN", + model: "RELAY", + }, + { + make: "SATURN", + model: "S SERIES", + }, + { + make: "SATURN", + model: "S11", + }, + { + make: "SATURN", + model: "SC1", + }, + { + make: "SATURN", + model: "SKY", + }, + { + make: "SATURN", + model: "SL1", + }, + { + make: "SATURN", + model: "SL2", + }, + { + make: "SATURN", + model: "SW1", + }, + { + make: "SATURN", + model: "SW2", + }, + { + make: "SATURN", + model: "VUE", + }, + { + make: "SATURN", + model: "WGN", + }, + { + make: "SCION", + model: "FR-S", + }, + { + make: "SCION", + model: "IM", + }, + { + make: "SCION", + model: "SXB", + }, + { + make: "SCION", + model: "TC", + }, + { + make: "SCION", + model: "XB", + }, + { + make: "SCION", + model: "XD", + }, + { + make: "SMART", + model: "FORTWO", + }, + { + make: "SUBARU", + model: "ASENT", + }, + { + make: "SUBARU", + model: "B9 TRIBECA", + }, + { + make: "SUBARU", + model: "BAJA", + }, + { + make: "SUBARU", + model: "BRAT", + }, + { + make: "SUBARU", + model: "BRZ", + }, + { + make: "SUBARU", + model: "CROSSTREK", + }, + { + make: "SUBARU", + model: "DOMINGO", + }, + { + make: "SUBARU", + model: "DOMNGO", + }, + { + make: "SUBARU", + model: "FORESTER", + }, + { + make: "SUBARU", + model: "GL", + }, + { + make: "SUBARU", + model: "IMPREZA", + }, + { + make: "SUBARU", + model: "IMPREZA STI", + }, + { + make: "SUBARU", + model: "JUSTY", + }, + { + make: "SUBARU", + model: "LEGACY", + }, + { + make: "SUBARU", + model: "LOYALE", + }, + { + make: "SUBARU", + model: "OUTBACK", + }, + { + make: "SUBARU", + model: "SVX", + }, + { + make: "SUBARU", + model: "TRIBECA", + }, + { + make: "SUBARU", + model: "WRX", + }, + { + make: "SUBARU", + model: "WRX STI", + }, + { + make: "SUBARU", + model: "XV", + }, + { + make: "SUZUKI", + model: "AERIO", + }, + { + make: "SUZUKI", + model: "CARRY", + }, + { + make: "SUZUKI", + model: "ESTEEM", + }, + { + make: "SUZUKI", + model: "GRAND VITARA", + }, + { + make: "SUZUKI", + model: "MINI-TRUCK", + }, + { + make: "SUZUKI", + model: "SAMURAI", + }, + { + make: "SUZUKI", + model: "SIDEKICK", + }, + { + make: "SUZUKI", + model: "SWIFT", + }, + { + make: "SUZUKI", + model: "SX4", + }, + { + make: "SUZUKI", + model: "VITARA", + }, + { + make: "SUZUKI", + model: "XL7", + }, + { + make: "TESLA", + model: "MODEL 3", + }, + { + make: "TOYOTA", + model: " PRIUS C", + }, + { + make: "TOYOTA", + model: "4 RUNNER", + }, + { + make: "TOYOTA", + model: "4X4", + }, + { + make: "TOYOTA", + model: "ALPHARD", + }, + { + make: "TOYOTA", + model: "ARISTO", + }, + { + make: "TOYOTA", + model: "AVALON", + }, + { + make: "TOYOTA", + model: "CALDI", + }, + { + make: "TOYOTA", + model: "CALDINA", + }, + { + make: "TOYOTA", + model: "CAMRY", + }, + { + make: "TOYOTA", + model: "CANOPY", + }, + { + make: "TOYOTA", + model: "CELICA", + }, + { + make: "TOYOTA", + model: "CELSLOR", + }, + { + make: "TOYOTA", + model: "CHASE", + }, + { + make: "TOYOTA", + model: "CH-R", + }, + { + make: "TOYOTA", + model: "COROLLA", + }, + { + make: "TOYOTA", + model: "COROLLA CE", + }, + { + make: "TOYOTA", + model: "COROLLA.HYBRID", + }, + { + make: "TOYOTA", + model: "CRESSIDA", + }, + { + make: "TOYOTA", + model: "DELICA", + }, + { + make: "TOYOTA", + model: "ECHO", + }, + { + make: "TOYOTA", + model: "FJ", + }, + { + make: "TOYOTA", + model: "HIGHLANDER", + }, + { + make: "TOYOTA", + model: "LAND CRUISER", + }, + { + make: "TOYOTA", + model: "MATRIX", + }, + { + make: "TOYOTA", + model: "MR2", + }, + { + make: "TOYOTA", + model: "PASEO", + }, + { + make: "TOYOTA", + model: "PICK UP", + }, + { + make: "TOYOTA", + model: "PRADA", + }, + { + make: "TOYOTA", + model: "PREVIA", + }, + { + make: "TOYOTA", + model: "PRIUS", + }, + { + make: "TOYOTA", + model: "PRIUS HYBIRD", + }, + { + make: "TOYOTA", + model: "PRIUS V", + }, + { + make: "TOYOTA", + model: "RAV4", + }, + { + make: "TOYOTA", + model: "SCION", + }, + { + make: "TOYOTA", + model: "SEQUOIA", + }, + { + make: "TOYOTA", + model: "SIENNA", + }, + { + make: "TOYOTA", + model: "SOLARA", + }, + { + make: "TOYOTA", + model: "SORER", + }, + { + make: "TOYOTA", + model: "SP & SP", + }, + { + make: "TOYOTA", + model: "SUPRA", + }, + { + make: "TOYOTA", + model: "SURF", + }, + { + make: "TOYOTA", + model: "TACOMA", + }, + { + make: "TOYOTA", + model: "TERCEL", + }, + { + make: "TOYOTA", + model: "TUNDRA", + }, + { + make: "TOYOTA", + model: "VENZA", + }, + { + make: "TOYOTA", + model: "YARIS", + }, + { + make: "TRIUMPH", + model: "TR3", + }, + { + make: "VOLKSWAGEN", + model: "ATLAS", + }, + { + make: "VOLKSWAGEN", + model: "BEETLE", + }, + { + make: "VOLKSWAGEN", + model: "CABRIOLET", + }, + { + make: "VOLKSWAGEN", + model: "CC", + }, + { + make: "VOLKSWAGEN", + model: "CORRADO", + }, + { + make: "VOLKSWAGEN", + model: "DUNEBUGGY", + }, + { + make: "VOLKSWAGEN", + model: "EOS", + }, + { + make: "VOLKSWAGEN", + model: "EUROVAN", + }, + { + make: "VOLKSWAGEN", + model: "GOLF", + }, + { + make: "VOLKSWAGEN", + model: "GOLF CABRIOLET", + }, + { + make: "VOLKSWAGEN", + model: "GOLF CITY", + }, + { + make: "VOLKSWAGEN", + model: "GOLF GTI", + }, + { + make: "VOLKSWAGEN", + model: "GOLF SPORT WAGEN", + }, + { + make: "VOLKSWAGEN", + model: "GTI", + }, + { + make: "VOLKSWAGEN", + model: "JETTA", + }, + { + make: "VOLKSWAGEN", + model: "JETTA TDI", + }, + { + make: "VOLKSWAGEN", + model: "KIT CAR", + }, + { + make: "VOLKSWAGEN", + model: "PASSAT", + }, + { + make: "VOLKSWAGEN", + model: "R32", + }, + { + make: "VOLKSWAGEN", + model: "RABBIT", + }, + { + make: "VOLKSWAGEN", + model: "ROUTAN", + }, + { + make: "VOLKSWAGEN", + model: "TIGUAN", + }, + { + make: "VOLKSWAGEN", + model: "TOUAREG", + }, + { + make: "VOLKSWAGEN", + model: "TRANSPORTER VAN", + }, + { + make: "VOLKSWAGEN", + model: "VANAGON", + }, + { + make: "VOLKSWAGEN", + model: "WESTFALIA", + }, + { + make: "VOLKSWAGEN", + model: "WINNEBAGO", + }, + { + make: "VOLVO", + model: "240", + }, + { + make: "VOLVO", + model: "244", + }, + { + make: "VOLVO", + model: "740", + }, + { + make: "VOLVO", + model: "760", + }, + { + make: "VOLVO", + model: "850", + }, + { + make: "VOLVO", + model: "940", + }, + { + make: "VOLVO", + model: "960", + }, + { + make: "VOLVO", + model: "C30", + }, + { + make: "VOLVO", + model: "C70", + }, + { + make: "VOLVO", + model: "DL", + }, + { + make: "VOLVO", + model: "GLE", + }, + { + make: "VOLVO", + model: "GLT", + }, + { + make: "VOLVO", + model: "GT", + }, + { + make: "VOLVO", + model: "S40", + }, + { + make: "VOLVO", + model: "S60", + }, + { + make: "VOLVO", + model: "S70", + }, + { + make: "VOLVO", + model: "S80", + }, + { + make: "VOLVO", + model: "S90", + }, + { + make: "VOLVO", + model: "V40", + }, + { + make: "VOLVO", + model: "V50", + }, + { + make: "VOLVO", + model: "V70", + }, + { + make: "VOLVO", + model: "V70 - X/C", + }, + { + make: "VOLVO", + model: "XC60", + }, + { + make: "VOLVO", + model: "XC70", + }, + { + make: "VOLVO", + model: "XC90", + }, ]; export default obj; diff --git a/client/src/components/jobs-detail-change-estimator/jobs-detail-change-estimator.component.jsx b/client/src/components/jobs-detail-change-estimator/jobs-detail-change-estimator.component.jsx index 61035b23e..dd5d527d0 100644 --- a/client/src/components/jobs-detail-change-estimator/jobs-detail-change-estimator.component.jsx +++ b/client/src/components/jobs-detail-change-estimator/jobs-detail-change-estimator.component.jsx @@ -1,43 +1,40 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Dropdown, Menu } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Dropdown} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function JobsDetailChangeEstimator({ disabled, form, bodyshop }) { - const handleClick = ({ item, key, keyPath }) => { - const est = item.props.value; - form.setFieldsValue(est); - }; +export function JobsDetailChangeEstimator({disabled, form, bodyshop}) { + const handleClick = ({item, key, keyPath}) => { + const est = item.props.value; + form.setFieldsValue(est); + }; - const menu = ( -
- - {bodyshop.md_estimators.map((est, idx) => ( - - {`${est.est_ct_fn} ${est.est_ct_ln}`} - - ))} - -
- ); + const menu = { + items: bodyshop.md_estimators.map((est, idx) => ({ + key: idx, + label: `${est.est_ct_fn} ${est.est_ct_ln}`, + value: est, + })), + onClick: handleClick + } - return ( - - e.preventDefault()} - > - - - - ); + return ( + + e.preventDefault()} + > + + + + ); } export default connect(mapStateToProps, null)(JobsDetailChangeEstimator); diff --git a/client/src/components/jobs-detail-change-filehandler/jobs-detail-change-filehandler.component.jsx b/client/src/components/jobs-detail-change-filehandler/jobs-detail-change-filehandler.component.jsx index ee684994b..f582b9e41 100644 --- a/client/src/components/jobs-detail-change-filehandler/jobs-detail-change-filehandler.component.jsx +++ b/client/src/components/jobs-detail-change-filehandler/jobs-detail-change-filehandler.component.jsx @@ -1,46 +1,44 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Dropdown, Menu } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Dropdown} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function JobsDetailChangeFilehandler({ disabled, form, bodyshop }) { - const handleClick = ({ item, key, keyPath }) => { - const est = item.props.value; - form.setFieldsValue(est); - }; +export function JobsDetailChangeFilehandler({disabled, form, bodyshop}) { + const handleClick = ({item, key, keyPath}) => { + const est = item.props.value; + form.setFieldsValue(est); + }; - const menu = ( - - {bodyshop.md_filehandlers.map((est, idx) => ( - - {`${est.ins_ct_fn} ${est.ins_ct_ln}`} - - ))} - - ); + const menu = { + items: bodyshop.md_filehandlers.map((est, idx) => ({ + key: idx, + label: `${est.ins_ct_fn} ${est.ins_ct_ln}`, + value: est, + style: {breakInside: "avoid"}, + })), + style: { + columnCount: Math.floor(bodyshop.md_filehandlers.length / 10) + 1, + }, + onClick: handleClick + } - return ( - - e.preventDefault()} - > - - - - ); + return ( + + e.preventDefault()} + > + + + + ); } export default connect(mapStateToProps, null)(JobsDetailChangeFilehandler); diff --git a/client/src/components/jobs-detail-checklists/jobs-detail-checklists.component.jsx b/client/src/components/jobs-detail-checklists/jobs-detail-checklists.component.jsx index 0cd08467d..f862a094d 100644 --- a/client/src/components/jobs-detail-checklists/jobs-detail-checklists.component.jsx +++ b/client/src/components/jobs-detail-checklists/jobs-detail-checklists.component.jsx @@ -1,20 +1,20 @@ import React from "react"; -import { Row, Col } from "antd"; +import {Col, Row} from "antd"; import JobChecklistDisplay from "../job-checklist/job-checklist-display.component"; -const colSpan = { sm: { span: 24 }, md: { span: 12 } }; -export default function JobsDetailChecklists({ job }) { - return ( -
- -
- - - - - - - - - ); +const colSpan = {sm: {span: 24}, md: {span: 12}}; +export default function JobsDetailChecklists({job}) { + return ( +
+ +
+ + + + + + + + + ); } diff --git a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx index dcd6fd941..35a0a39c5 100644 --- a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx +++ b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx @@ -1,159 +1,160 @@ -import { Form, Statistic, Tooltip } from "antd"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Form, Statistic, Tooltip} from "antd"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; import FormRow from "../layout-form-row/layout-form-row.component"; const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, - bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, }); -export function JobsDetailDatesComponent({ jobRO, job, bodyshop }) { - const { t } = useTranslation(); +export function JobsDetailDatesComponent({jobRO, job, bodyshop}) { + const {t} = useTranslation(); - const jobInPostProduction = useMemo(() => { - return bodyshop.md_ro_statuses.post_production_statuses.includes( - job.status + const jobInPostProduction = useMemo(() => { + return bodyshop.md_ro_statuses.post_production_statuses.includes( + job.status + ); + }, [job.status, bodyshop.md_ro_statuses.post_production_statuses]); + + const calcRepairDays = + job.joblines.reduce((acc, val) => acc + val.mod_lb_hrs, 0) / + (bodyshop.target_touchtime === 0 ? 1 : bodyshop.target_touchtime); + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + +
); - }, [job.status, bodyshop.md_ro_statuses.post_production_statuses]); - - const calcRepairDays = - job.joblines.reduce((acc, val) => acc + val.mod_lb_hrs, 0) / - (bodyshop.target_touchtime === 0 ? 1 : bodyshop.target_touchtime); - - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - -
- ); } + export default connect(mapStateToProps, null)(JobsDetailDatesComponent); diff --git a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx index e2cecb4f5..99358d805 100644 --- a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx +++ b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx @@ -1,302 +1,294 @@ -import { - Col, - Form, - Input, - InputNumber, - Row, - Select, - Space, - Switch, -} from "antd"; +import {Col, Form, Input, InputNumber, Row, Select, Space, Switch,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import FormItemPhone, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import FormItemPhone, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import Car from "../job-damage-visual/job-damage-visual.component"; import JobsDetailChangeEstimator from "../jobs-detail-change-estimator/jobs-detail-change-estimator.component"; import JobsDetailChangeFileHandler from "../jobs-detail-change-filehandler/jobs-detail-change-filehandler.component"; import FormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, - bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -const lossColFields = { sm: { span: 24 }, md: { span: 18 }, lg: { span: 20 } }; -const lossColDamage = { sm: { span: 24 }, md: { span: 6 }, lg: { span: 4 } }; -export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) { - const { getFieldValue } = form; - const { t } = useTranslation(); - return ( -
- - - - - - - - - - - - - - - - - - - +const lossColFields = {sm: {span: 24}, md: {span: 18}, lg: {span: 20}}; +const lossColDamage = {sm: {span: 24}, md: {span: 6}, lg: {span: 4}}; - - - - - - - - - - - {t("jobs.fields.ins_ct_ln")} - - - } - name="ins_ct_ln" - > - - - - - - - PhoneItemFormatterValidation(getFieldValue, "ins_ph1"), - ]} - > - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {job.area_of_damage ? ( - - ) : ( - t("jobs.errors.nodamage") - )} - - +export function JobsDetailGeneral({bodyshop, jobRO, job, form}) { + const {getFieldValue} = form; + const {t} = useTranslation(); + return ( +
+ + + + + + + + + + + + + + + + + + + - - - - - - {t("jobs.fields.est_ct_fn")} - - - } - name="est_ct_fn" - > - - - - - - - - - - - - - - - - + + + + + + + + + + + {t("jobs.fields.ins_ct_ln")} + + + } + name="ins_ct_ln" + > + + + + + + + PhoneItemFormatterValidation(getFieldValue, "ins_ph1"), + ]} + > + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {job.area_of_damage ? ( + + ) : ( + t("jobs.errors.nodamage") + )} + + - - - - - - - - - - - - - - - - - - ); + + + + + + {t("jobs.fields.est_ct_fn")} + + + } + name="est_ct_fn" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailGeneral); diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addevent.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addevent.jsx deleted file mode 100644 index 0c7ad08dc..000000000 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addevent.jsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useMutation } from "@apollo/client"; -import { - Button, - Card, - Form, - Input, - Menu, - notification, - Popover, - Select, - Space, -} from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_MANUAL_APPT } from "../../graphql/appointments.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component"; - -const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, -}); -const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) -}); -export default connect( - mapStateToProps, - mapDispatchToProps -)(JobsDetailHeaderAddEvent); - -export function JobsDetailHeaderAddEvent({ bodyshop, jobid, ...props }) { - const { t } = useTranslation(); - const [insertAppointment] = useMutation(INSERT_MANUAL_APPT); - - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [visibility, setVisibility] = useState(false); - - const handleFinish = async (values) => { - logImEXEvent("schedule_manual_event"); - - setLoading(true); - try { - insertAppointment({ - variables: { - apt: { ...values, isintake: false, jobid, bodyshopid: bodyshop.id }, - }, - refetchQueries: ["QUERY_ALL_ACTIVE_APPOINTMENTS"], - }); - notification.open({ - type: "success", - message: t("appointments.successes.created"), - }); - } catch (error) { - console.log(error); - } finally { - setLoading(false); - setVisibility(false); - } - }; - - const overlay = ( - -
-
- - - - - - - - { - const start = form.getFieldValue("start"); - form.setFieldsValue({ end: start.add(30, "minutes") }); - }} - /> - - ({ - async validator(rule, value) { - if (value) { - const { start } = form.getFieldsValue(); - if (moment(start).isAfter(moment(value))) { - return Promise.reject( - t("employees.labels.endmustbeafterstart") - ); - } else { - return Promise.resolve(); - } - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - - - - - - - - - -
-
- ); - - const handleClick = (e) => { - setVisibility(true); - }; - - return ( - - - {t("appointments.labels.manualevent")} - - - ); -} diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx index 90c8ebd8b..91ee42257 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx @@ -1,47 +1,47 @@ -import { notification } from "antd"; +import {notification} from "antd"; import i18n from "i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { store } from "../../redux/store"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {store} from "../../redux/store"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; export default function AddToProduction( - apolloClient, - jobId, - completionCallback, - remove = false + apolloClient, + jobId, + completionCallback, + remove = false ) { - logImEXEvent("job_add_to_production"); + logImEXEvent("job_add_to_production"); - //get a list of all fields on the job - apolloClient - .mutate({ - mutation: UPDATE_JOB, - variables: { jobId: jobId, job: { inproduction: !remove } }, - }) - .then((res) => { - notification["success"]({ - message: i18n.t("jobs.successes.save"), - }); - - store.dispatch( - insertAuditTrail({ - jobid: jobId, - operation: AuditTrailMapping.jobinproductionchange(!remove), + //get a list of all fields on the job + apolloClient + .mutate({ + mutation: UPDATE_JOB, + variables: {jobId: jobId, job: {inproduction: !remove}}, }) - ); - if (completionCallback) completionCallback(); - }) - .catch((error) => { - notification["errors"]({ - message: i18n.t("jobs.errors.saving", { - error: JSON.stringify(error), - }), - }); - }); + .then((res) => { + notification["success"]({ + message: i18n.t("jobs.successes.save"), + }); + + store.dispatch( + insertAuditTrail({ + jobid: jobId, + operation: AuditTrailMapping.jobinproductionchange(!remove), + }) + ); + if (completionCallback) completionCallback(); + }) + .catch((error) => { + notification["errors"]({ + message: i18n.t("jobs.errors.saving", { + error: JSON.stringify(error), + }), + }); + }); + + //insert the new job. call the callback with the returned ID when done. - //insert the new job. call the callback with the returned ID when done. - return; } diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index e3f78ef69..c15c1e217 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -1,596 +1,1065 @@ -import { DownCircleFilled } from "@ant-design/icons"; -import { useApolloClient, useMutation } from "@apollo/client"; -import { - Button, - Dropdown, - Form, - Menu, - Popconfirm, - Popover, - Select, - notification, -} from "antd"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { CANCEL_APPOINTMENTS_BY_JOB_ID } from "../../graphql/appointments.queries"; -import { DELETE_JOB, UPDATE_JOB, VOID_JOB } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {DownCircleFilled} from "@ant-design/icons"; +import {useApolloClient, useMutation} from "@apollo/client"; +import {Button, Card, Dropdown, Form, Input, Modal, notification, Popconfirm, Popover, Select, Space,} from "antd"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {CANCEL_APPOINTMENTS_BY_JOB_ID, INSERT_MANUAL_APPT} from "../../graphql/appointments.queries"; +import {DELETE_JOB, UPDATE_JOB, VOID_JOB} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; -import JobsDetailHeaderActionsAddevent from "./jobs-detail-header-actions.addevent"; import AddToProduction from "./jobs-detail-header-actions.addtoproduction.util"; -import JobsDetaiLheaderCsi from "./jobs-detail-header-actions.csi.component"; import DuplicateJob from "./jobs-detail-header-actions.duplicate.util"; -import JobsDetailHeaderActionsExportcustdataComponent from "./jobs-detail-header-actions.exportcustdata.component"; +import axios from "axios"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {openChatByPhone, setMessage} from "../../redux/messaging/messaging.actions"; +import {GET_CURRENT_QUESTIONSET_ID, INSERT_CSI} from "../../graphql/csi.queries"; +import {TemplateList} from "../../utils/TemplateConstants"; +import parsePhoneNumber from "libphonenumber-js"; +import {HasFeatureAccess} from "../feature-wrapper/feature-wrapper.component"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component"; +import dayjs from "../../utils/day"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setScheduleContext: (context) => - dispatch(setModalContext({ context: context, modal: "schedule" })), - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), - setPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "payment" })), - setJobCostingContext: (context) => - dispatch(setModalContext({ context: context, modal: "jobCosting" })), - setTimeTicketContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicket" })), - setTimeTicketTaskContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicketTask" })), - setCardPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "cardPayment" })), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + setScheduleContext: (context) => + dispatch(setModalContext({context: context, modal: "schedule"})), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), + setPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "payment"})), + setJobCostingContext: (context) => + dispatch(setModalContext({context: context, modal: "jobCosting"})), + setTimeTicketContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicket"})), + setCardPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "cardPayment"})), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), + setTimeTicketTaskContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicketTask"})), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), + setMessage: (text) => dispatch(setMessage(text)), }); export function JobsDetailHeaderActions({ - job, - bodyshop, - currentUser, - refetch, - setScheduleContext, - setBillEnterContext, - setPaymentContext, - setJobCostingContext, - jobRO, - setTimeTicketContext, - setTimeTicketTaskContext, - setCardPaymentContext, - insertAuditTrail, -}) { - const { t } = useTranslation(); - const client = useApolloClient(); - const history = useHistory(); - const [deleteJob] = useMutation(DELETE_JOB); - const [updateJob] = useMutation(UPDATE_JOB); - const [voidJob] = useMutation(VOID_JOB); - const [cancelAllAppointments] = useMutation(CANCEL_APPOINTMENTS_BY_JOB_ID); - const jobInProduction = useMemo(() => { - return bodyshop.md_ro_statuses.production_statuses.includes(job.status); - }, [job, bodyshop.md_ro_statuses.production_statuses]); + job, + bodyshop, + currentUser, + refetch, + setScheduleContext, + setBillEnterContext, + setPaymentContext, + setJobCostingContext, + jobRO, + setTimeTicketContext, + setCardPaymentContext, + insertAuditTrail, + setEmailOptions, + openChatByPhone, + setMessage, + setTimeTicketTaskContext, + }) { + const {t} = useTranslation(); + const client = useApolloClient(); + const history = useNavigate(); + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [isCancelScheduleModalVisible, setIsCancelScheduleModalVisible] = useState(false); + const [insertAppointment] = useMutation(INSERT_MANUAL_APPT); + const [deleteJob] = useMutation(DELETE_JOB); + const [insertCsi] = useMutation(INSERT_CSI); + const [updateJob] = useMutation(UPDATE_JOB); + const [voidJob] = useMutation(VOID_JOB); + const [cancelAllAppointments] = useMutation(CANCEL_APPOINTMENTS_BY_JOB_ID); - const jobInPreProduction = useMemo(() => { - return bodyshop.md_ro_statuses.pre_production_statuses.includes(job.status); - }, [job.status, bodyshop.md_ro_statuses.pre_production_statuses]); - - const jobInPostProduction = useMemo(() => { - return bodyshop.md_ro_statuses.post_production_statuses.includes( - job.status - ); - }, [job.status, bodyshop.md_ro_statuses.post_production_statuses]); - - const handleAlertToggle = (e) => { - logImEXEvent("production_toggle_alert"); - //e.stopPropagation(); - updateJob({ - variables: { - jobId: job.id, - job: { - production_vars: { - ...job.production_vars, - alert: - !!job.production_vars && !!job.production_vars.alert - ? !job.production_vars.alert - : true, - }, - }, - }, + const {treatments: {ImEXPay}} = useSplitTreatments({ + attributes: {}, + names: ["ImEXPay"], + splitKey: bodyshop && bodyshop.imexshopid, }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.alertToggle( - !!job.production_vars && !!job.production_vars.alert - ? !job.production_vars.alert - : true - ), - }); - }; - const handleSuspend = (e) => { - logImEXEvent("production_toggle_alert"); - //e.stopPropagation(); - updateJob({ - variables: { - jobId: job.id, - job: { - suspended: !job.suspended, - }, - }, - }); - }; - const statusmenu = ( - - { - logImEXEvent("job_header_schedule"); + const jobInProduction = useMemo(() => { + return bodyshop.md_ro_statuses.production_statuses.includes(job.status); + }, [job, bodyshop.md_ro_statuses.production_statuses]); + const [visibility, setVisibility] = useState(false); - setScheduleContext({ - actions: { refetch: refetch }, - context: { - jobId: job.id, - job: job, - alt_transport: job.alt_transport, + const jobInPreProduction = useMemo(() => { + return bodyshop.md_ro_statuses.pre_production_statuses.includes(job.status); + }, [job.status, bodyshop.md_ro_statuses.pre_production_statuses]); + + const jobInPostProduction = useMemo(() => { + return bodyshop.md_ro_statuses.post_production_statuses.includes( + job.status + ); + }, [job.status, bodyshop.md_ro_statuses.post_production_statuses]); + + // Function to show modal + const showCancelScheduleModal = () => { + setIsCancelScheduleModalVisible(true); + }; + + + // Function to handle Cancel + const handleCancelScheduleModalCancel = () => { + setIsCancelScheduleModalVisible(false); + }; + + const handleDuplicate = () => + DuplicateJob( + client, + job.id, + {defaultOpenStatus: bodyshop.md_ro_statuses.default_imported}, + (newJobId) => { + history(`/manage/jobs/${newJobId}`); + notification["success"]({ + message: t("jobs.successes.duplicated"), + }); }, - }); - }} - > - {t("jobs.actions.schedule")} - - - {job.status !== bodyshop.md_ro_statuses.default_scheduled ? ( - t("menus.jobsactions.cancelallappointments") - ) : ( - { - const jobUpdate = await cancelAllAppointments({ + true + ); + + const handleDuplicateConfirm = () => + DuplicateJob( + client, + job.id, + {defaultOpenStatus: bodyshop.md_ro_statuses.default_imported}, + (newJobId) => { + history(`/manage/jobs/${newJobId}`); + notification["success"]({ + message: t("jobs.successes.duplicated"), + }); + } + ); + + const handleFinish = async (values) => { + logImEXEvent("schedule_manual_event"); + + setLoading(true); + try { + insertAppointment({ + variables: { + apt: {...values, isintake: false, jobid: job.id, bodyshopid: bodyshop.id}, + }, + refetchQueries: ["QUERY_ALL_ACTIVE_APPOINTMENTS"], + }); + notification.open({ + type: "success", + message: t("appointments.successes.created"), + }); + } catch (error) { + } finally { + setLoading(false); + setVisibility(false); + } + }; + + const handleDeleteJob = async () => { + //delete the job. + const result = await deleteJob({variables: {id: job.id}}); + + if (!!!result.errors) { + notification["success"]({ + message: t("jobs.successes.delete"), + }); + //go back to jobs list. + history(`/manage/`); + } else { + notification["error"]({ + message: t("jobs.errors.deleted", { + error: JSON.stringify(result.errors), + }), + }); + } + }; + + const handleCreateCsi = async (e) => { + logImEXEvent("job_create_csi"); + + //Is there already a CSI? + if (!job.csiinvites || job.csiinvites.length === 0) { + const questionSetResult = await client.query({ + query: GET_CURRENT_QUESTIONSET_ID, + }); + + if (questionSetResult.data.csiquestions.length > 0) { + const result = await insertCsi({ variables: { - jobid: job.id, - job: { - date_scheduled: null, - scheduled_in: null, - scheduled_completion: null, - lost_sale_reason, - date_lost_sale: new Date(), - status: bodyshop.md_ro_statuses.default_imported, - }, + csiInput: { + jobid: job.id, + bodyshopid: bodyshop.id, + questionset: questionSetResult.data.csiquestions[0].id, + relateddata: { + job: { + id: job.id, + ownr_fn: job.ownr_fn, + ro_number: job.ro_number, + v_model_yr: job.v_model_yr, + v_make_desc: job.v_make_desc, + v_model_desc: job.v_model_desc, + }, + bodyshop: { + city: bodyshop.city, + email: bodyshop.email, + state: bodyshop.state, + country: bodyshop.country, + address1: bodyshop.address1, + address2: bodyshop.address2, + shopname: bodyshop.shopname, + zip_post: bodyshop.zip_post, + logo_img_path: bodyshop.logo_img_path, + }, + }, + }, }, - }); - if (!jobUpdate.errors) { - notification["success"]({ - message: t("appointments.successes.canceled"), - }); - insertAuditTrail({ - jobid: job.id, - operation: - AuditTrailMapping.appointmentcancel(lost_sale_reason), + refetchQueries: ["GET_JOB_BY_PK"], + awaitRefetchQueries: true, + }); + + if (!!!result.errors) { + notification["success"]({message: t("csi.successes.created")}); + } else { + notification["error"]({ + message: t("csi.errors.creating", { + message: JSON.stringify(result.errors), + }), }); return; - } - }} - > - - + + + + + + { + const start = form.getFieldValue("start"); + form.setFieldsValue({end: start.add(30, "minutes")}); + }} + /> + + ({ + async validator(rule, value) { + if (value) { + const {start} = form.getFieldsValue(); + if (dayjs(start).isAfter(dayjs(value))) { + return Promise.reject( + t("employees.labels.endmustbeafterstart") + ); + } else { + return Promise.resolve(); + } + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + + + + + + + + + + + + ); + + const menuItems = [ + { + key: 'schedule', + disabled: !jobInPreProduction || !job.converted || jobRO, + label: t("jobs.actions.schedule"), + onClick: () => { + logImEXEvent("job_header_schedule"); + setScheduleContext({ + actions: {refetch: refetch}, + context: { + jobId: job.id, + job: job, + alt_transport: job.alt_transport, + }, + }); + }, + }, + { + key: 'cancelallappointments', + onClick: () => { + if (job.status !== bodyshop.md_ro_statuses.default_scheduled) { + return; + } + showCancelScheduleModal() + }, + disabled: job.status !== bodyshop.md_ro_statuses.default_scheduled, + label: t("menus.jobsactions.cancelallappointments") + }, + { + key: 'intake', + disabled: !!job.intakechecklist || !jobInPreProduction || !job.converted || jobRO, + label: !!job.intakechecklist || !jobInPreProduction || !job.converted || jobRO ? ( + t("jobs.actions.intake") + ) : ( + + {t("jobs.actions.intake")} + + ) + }, + { + key: 'deliver', + disabled: !jobInProduction || jobRO, + label: !jobInProduction ? ( + t("jobs.actions.deliver") + ) : ( + + {t("jobs.actions.deliver")} + + ) + }, + { + key: 'checklist', + disabled: !job.converted, + label: + {t("jobs.actions.viewchecklist")} + + }, + { + key: "entertimetickets", + disabled: !job.converted || (!bodyshop.tt_allow_post_to_invoiced && job.date_invoiced), + label: t("timetickets.actions.enter"), + onClick: () => { + logImEXEvent("job_header_enter_time_ticekts"); + + setTimeTicketContext({ + actions: {}, + context: { + jobId: job.id, + created_by: currentUser.displayName + ? currentUser.email.concat(" | ", currentUser.displayName) + : currentUser.email, + }, + }); + } + }]; + + if (bodyshop.md_tasks_presets.enable_tasks) { + menuItems.push({ + key: 'claimtimetickettasks', + disabled: !job.converted || (!bodyshop.tt_allow_post_to_invoiced && job.date_invoiced), + onClick: () => { + setTimeTicketTaskContext({ + actions: {}, + context: {jobid: job.id}, + }); + }, + label: t("timetickets.actions.claimtasks") + }); + } + + menuItems.push( + { + key: 'enterpayments', + disabled: !job.converted, + label: t("menus.header.enterpayment"), + onClick: () => { + logImEXEvent("job_header_enter_payment"); + + setPaymentContext({ + actions: {}, + context: {jobid: job.id}, + }); + } + }); + + if (ImEXPay.treatment === "on") { + menuItems.push({ + key: 'entercardpayments', + disabled: !job.converted, + label: t("menus.header.entercardpayment"), + onClick: () => { + logImEXEvent("job_header_enter_card_payment"); + + setCardPaymentContext({ + actions: {}, + context: {jobid: job.id}, + }); + } + }, + ); + } + + menuItems.push({ + key: 'cccontract', + disabled: jobRO || !job.converted, + label: + {t("menus.jobsactions.newcccontract")} + + }); + + menuItems.push( + job.inproduction ? + { + key: 'addtoproduction', + disabled: !job.converted, + label: t("jobs.actions.removefromproduction"), + onClick: () => AddToProduction(client, job.id, refetch, true) + } : + { + key: 'addtoproduction', + disabled: !job.converted, + label: t("jobs.actions.addtoproduction"), + onClick: () => AddToProduction(client, job.id, refetch) + } + ); + + menuItems.push( + { + key: 'togglesuspend', + onClick: handleSuspend, + label: job.suspended + ? t("production.actions.unsuspend") + : t("production.actions.suspend") + }, + { + key: 'toggleAlert', + onClick: handleAlertToggle, + label: job.production_vars && job.production_vars.alert + ? t("production.labels.alertoff") + : t("production.labels.alerton") + }, + { + key: 'dupe', + label: t("menus.jobsactions.duplicate"), + children: [ + { + key: 'duplicate', + label: e.stopPropagation()} + onConfirm={handleDuplicate} + getPopupContainer={(trigger) => trigger.parentNode} + > + {t("menus.jobsactions.duplicate")} + + }, + { + key: 'duplicatenolines', + label: e.stopPropagation()} + onConfirm={handleDuplicateConfirm} + getPopupContainer={(trigger) => trigger.parentNode} + > + {t("menus.jobsactions.duplicatenolines")} + + } + ] + }, + { + key: 'postbills', + disabled: !job.converted, + label: t("jobs.actions.postbills"), + onClick: () => { + logImEXEvent("job_header_enter_bills"); + + setBillEnterContext({ + actions: {refetch: refetch}, + context: { + job: job, + }, + }); + } + }, + { + key: 'addtopartsqueue', + disabled: !job.converted || !jobInProduction || jobRO, + label: t("jobs.actions.addtopartsqueue"), + onClick: async () => { + const result = await updateJob({ + variables: { + jobId: job.id, + job: {queued_for_parts: true}, + }, }); if (!!!result.errors) { - notification["success"]({ - message: t("jobs.successes.voided"), - }); - //go back to jobs list. - history.push(`/manage/`); + notification["success"]({ + message: t("jobs.successes.partsqueue"), + }); } else { - notification["error"]({ - message: t("jobs.errors.voiding", { - error: JSON.stringify(result.errors), - }), - }); + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); } - }} - getPopupContainer={(trigger) => trigger.parentNode} + } + }, + { + key: 'closejob', + disabled: !jobInPostProduction, + label: !jobInPostProduction ? ( + t("menus.jobsactions.closejob") + ) : ( + + {t("menus.jobsactions.closejob")} + + ) + }, + { + key: 'admin', + label: - {t("menus.jobsactions.void")} - - - - )} - - ); - return ( - - - - ); + menuItems.push( + { + key: 'exportcustdata', + disabled: !job.converted, + label: t("jobs.actions.exportcustdata"), + onClick: handleExportCustData + } + ); + + if (HasFeatureAccess({featureName: "csi", bodyshop})) { + const children = [ + { + key: 'email', + disabled: !!!job.ownr_ea, + label: t("general.labels.email"), + onClick: handleCreateCsi + }, + { + key: 'text', + disabled: !!!job.ownr_ph1, + label: t("general.labels.text"), + onClick: handleCreateCsi + }, + { + key: 'generate', + disabled: job.csiinvites && job.csiinvites.length > 0, + label: t("jobs.actions.generatecsi"), + onClick: handleCreateCsi + }, + ]; + + if (job.csiinvites.length) { + children.push( + { + type: "divider" + }, + ...job.csiinvites.map((item, idx) => { + return item.completedon ? + { + key: idx, + label: + {item.completedon} + + } : + { + key: idx, + onClick: () => { + navigator.clipboard.writeText( + `${window.location.protocol}//${window.location.host}/csi/${item.id}` + ); + }, + label: t("general.actions.copylink") + } + }), + ) + } + menuItems.push( + { + key: 'sendcsi', + label: t("jobs.actions.sendcsi"), + disabled: !job.converted, + children + } + ); + } + + menuItems.push({ + key: 'jobcosting', + disabled: !job.converted, + label: t("jobs.labels.jobcosting"), + onClick: () => { + logImEXEvent("job_header_job_costing"); + + setJobCostingContext({ + actions: {refetch: refetch}, + context: { + jobId: job.id, + }, + }); + } + } + ); + + if (job && !job.converted) { + menuItems.push( + { + key: 'deletejob', + label: e.stopPropagation()} + onConfirm={handleDeleteJob} + > + {t("menus.jobsactions.deletejob")} + + } + ); + } + + menuItems.push( + { + key: 'manualevent', + onClick: (e) => { + setVisibility(true); + }, + label: t("appointments.labels.manualevent") + } + ) + + if (!jobRO && job.converted) { + menuItems.push({ + key: 'voidjob', + label: + e.stopPropagation()} + onConfirm={handleVoidJob} + > + {t("menus.jobsactions.void")} + + + }); + } + + const menu = { + items: menuItems, + key: 'popovermenu' + } + + return ( + <> + + {t("general.actions.cancel")} + , + , + ]} + > +
{ + console.log(s); + handleLostSaleFinish(s); + }} + > + + - - - - - {bodyshop.region_config.toLowerCase().startsWith("ca") && ( - - - - - - )} - - - - - - - - - - - - - - - - - - prev.auto_add_ats !== cur.auto_add_ats} - > - {() => { - if (form.getFieldValue("auto_add_ats")) - return ( - - +export function JobsDetailRates({jobRO, form, job, bodyshop}) { + const {t} = useTranslation(); + return ( +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // - // - // - // - // - } - - - - - Tax Profile + prev.auto_add_ats !== cur.auto_add_ats} + > + {() => { + if (form.getFieldValue("auto_add_ats")) + return ( + + + + ); - + return null; + }} + + - - - - - -
- ); + + {t("jobs.forms.laborrates")} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // + // + // + // + // + } + + + + + Tax Profile + + + + + + + + + + ); } + export default connect(mapStateToProps, null)(JobsDetailRates); diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.labor.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.labor.component.jsx index 75e80d4a1..cdef71c8e 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.labor.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.labor.component.jsx @@ -1,427 +1,429 @@ -import { Collapse, Form, Switch } from "antd"; +import {Collapse, Form, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, + jobRO: selectJobReadOnly, }); export function JobsDetailRatesLabor({ - jobRO, - expanded, - required = true, - form, -}) { - const { t } = useTranslation(); + jobRO, + expanded, + required = true, + form, + }) { + const {t} = useTranslation(); - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } + export default connect(mapStateToProps, null)(JobsDetailRatesLabor); diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.materials.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.materials.component.jsx index d9e641531..e3e312fb3 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.materials.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.materials.component.jsx @@ -1,145 +1,147 @@ -import { Collapse, Form, Input, InputNumber, Switch } from "antd"; +import {Collapse, Form, Input, InputNumber, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, + jobRO: selectJobReadOnly, }); export function JobsDetailRatesMaterials({ - jobRO, - expanded, - required = true, - form, -}) { - const { t } = useTranslation(); + jobRO, + expanded, + required = true, + form, + }) { + const {t} = useTranslation(); - return ( - - - - - - - - - + return ( + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - ); + + + + + + + + + + + + + + + + + + + + + + ); } + export default connect(mapStateToProps, null)(JobsDetailRatesMaterials); diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.other.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.other.component.jsx index 9d52c75bc..0617a8fea 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.other.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.other.component.jsx @@ -1,104 +1,106 @@ -import { Collapse, Form, Switch } from "antd"; +import {Collapse, Form, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, + jobRO: selectJobReadOnly, }); export function JobsDetailRatesOther({ - jobRO, - expanded, - required = true, - form, -}) { - const { t } = useTranslation(); + jobRO, + expanded, + required = true, + form, + }) { + const {t} = useTranslation(); - return ( - - - - - - - - - - - - - - - - - - + return ( + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - ); + + + + + + + + + + + + + + + + + + + ); } + export default connect(mapStateToProps, null)(JobsDetailRatesOther); diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx index 2cd2b8917..241327a3d 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx @@ -1,1223 +1,1225 @@ -import { Collapse, Form, InputNumber, Switch } from "antd"; +import {Collapse, Form, InputNumber, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, + jobRO: selectJobReadOnly, }); export function JobsDetailRatesParts({ - jobRO, - expanded, - required = true, - form, -}) { - const { t } = useTranslation(); + jobRO, + expanded, + required = true, + form, + }) { + const {t} = useTranslation(); - return ( - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); + return ( + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } + export default connect(mapStateToProps, null)(JobsDetailRatesParts); diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.profile-override.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.profile-override.component.jsx index e046a4afa..a127cd9c7 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.profile-override.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.profile-override.component.jsx @@ -1,42 +1,43 @@ -import { Button, Popconfirm } from "antd"; +import {Button, Popconfirm} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDetailRatesProfileOVerride); -export function JobsDetailRatesProfileOVerride({ bodyshop, form }) { - const { t } = useTranslation(); - return ( - { - form.setFieldsValue({ - cieca_pft: { - ...bodyshop.md_responsibility_centers.taxes.tax_ty1, - ...bodyshop.md_responsibility_centers.taxes.tax_ty2, - ...bodyshop.md_responsibility_centers.taxes.tax_ty3, - ...bodyshop.md_responsibility_centers.taxes.tax_ty4, - ...bodyshop.md_responsibility_centers.taxes.tax_ty5, - }, - materials: bodyshop.md_responsibility_centers.cieca_pfm, - cieca_pfl: bodyshop.md_responsibility_centers.cieca_pfl, - parts_tax_rates: bodyshop.md_responsibility_centers.parts_tax_rates, - }); - }} - title={t("jobs.actions.taxprofileoverride_confirm")} - > - - - ); +export function JobsDetailRatesProfileOVerride({bodyshop, form}) { + const {t} = useTranslation(); + return ( + { + form.setFieldsValue({ + cieca_pft: { + ...bodyshop.md_responsibility_centers.taxes.tax_ty1, + ...bodyshop.md_responsibility_centers.taxes.tax_ty2, + ...bodyshop.md_responsibility_centers.taxes.tax_ty3, + ...bodyshop.md_responsibility_centers.taxes.tax_ty4, + ...bodyshop.md_responsibility_centers.taxes.tax_ty5, + }, + materials: bodyshop.md_responsibility_centers.cieca_pfm, + cieca_pfl: bodyshop.md_responsibility_centers.cieca_pfl, + parts_tax_rates: bodyshop.md_responsibility_centers.parts_tax_rates, + }); + }} + title={t("jobs.actions.taxprofileoverride_confirm")} + > + + + ); } diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.taxes.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.taxes.component.jsx index 31d5b7213..0a6e85e3e 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.taxes.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.taxes.component.jsx @@ -1,155 +1,157 @@ -import { Collapse, Divider, Form, Input, InputNumber, Space } from "antd"; +import {Collapse, Divider, Form, Input, InputNumber, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, - bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, }); export function JobsDetailRatesTaxes({ - jobRO, - expanded, - bodyshop, - required = true, - form, -}) { - const { t } = useTranslation(); - const formItems = []; - for (let tyCounter = 1; tyCounter <= 5; tyCounter++) { - const section = []; + jobRO, + expanded, + bodyshop, + required = true, + form, + }) { + const {t} = useTranslation(); + const formItems = []; + for (let tyCounter = 1; tyCounter <= 5; tyCounter++) { + const section = []; - section.push( - TaxFormItems({ - typeNum: tyCounter, - rootElements: true, - bodyshop, - jobRO, - }) - ); + section.push( + TaxFormItems({ + typeNum: tyCounter, + rootElements: true, + bodyshop, + jobRO, + }) + ); - for (let iterator = 1; iterator <= 5; iterator++) { - section.push( - TaxFormItems({ - typeNum: tyCounter, - typeNumIterator: iterator, - rootElements: false, - jobRO, - }) - ); + for (let iterator = 1; iterator <= 5; iterator++) { + section.push( + TaxFormItems({ + typeNum: tyCounter, + typeNumIterator: iterator, + rootElements: false, + jobRO, + }) + ); + } + formItems.push(Space({children: section, wrap: true})); + formItems.push(); } - formItems.push(Space({ children: section, wrap: true })); - formItems.push(); - } - return ( - - - {formItems} - - - ); + return ( + + + {formItems} + + + ); } + export default connect(mapStateToProps, null)(JobsDetailRatesTaxes); function TaxFormItems({ - typeNum, - typeNumIterator, - rootElements, - bodyshopjobRO, - jobRO, -}) { - const { t } = useTranslation(); + typeNum, + typeNumIterator, + rootElements, + bodyshopjobRO, + jobRO, + }) { + const {t} = useTranslation(); + + if (rootElements) + return ( + <> + + + + + ); - if (rootElements) return ( - <> - - - - + <> + + + + + + + + + + + + + ); - - return ( - <> - - - - - - - - - - - - - - ); } diff --git a/client/src/components/jobs-detail-totals/jobs-detail-totals.component.jsx b/client/src/components/jobs-detail-totals/jobs-detail-totals.component.jsx index 8a52d28ba..c38f5e619 100644 --- a/client/src/components/jobs-detail-totals/jobs-detail-totals.component.jsx +++ b/client/src/components/jobs-detail-totals/jobs-detail-totals.component.jsx @@ -1,15 +1,16 @@ -import { Divider } from "antd"; +import {Divider} from "antd"; import React from "react"; import JobPayments from "../job-payments/job-payments.component"; import JobTotalsTable from "../job-totals-table/job-totals-table.component"; -export function JobsDetailTotals({ job, refetch }) { - return ( -
- - - -
- ); +export function JobsDetailTotals({job, refetch}) { + return ( +
+ + + +
+ ); } + export default JobsDetailTotals; diff --git a/client/src/components/jobs-documents-gallery/job-documents.utility.js b/client/src/components/jobs-documents-gallery/job-documents.utility.js index ce5a3bcb4..b954c2081 100644 --- a/client/src/components/jobs-documents-gallery/job-documents.utility.js +++ b/client/src/components/jobs-documents-gallery/job-documents.utility.js @@ -1,26 +1,26 @@ -import { DetermineFileType } from "../documents-upload/documents-upload.utility"; +import {DetermineFileType} from "../documents-upload/documents-upload.utility"; export const GenerateSrcUrl = (value) => { - let extension = value.extension; - if (extension && extension.toLowerCase().includes("heic")) extension = "jpg"; + let extension = value.extension; + if (extension && extension.toLowerCase().includes("heic")) extension = "jpg"; - return `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/${DetermineFileType( - value.type - )}/upload/${value.key}${extension ? `.${extension}` : ""}`; + return `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/${DetermineFileType( + value.type + )}/upload/${value.key}${extension ? `.${extension}` : ""}`; }; export const GenerateThumbUrl = (value) => { - let extension = value.extension; - if (extension && extension.toLowerCase().includes("heic")) extension = "jpg"; - else if ( - DetermineFileType(value.type) !== "image" || - (value.type && value.type.includes("application")) - ) - extension = "jpg"; + let extension = value.extension; + if (extension && extension.toLowerCase().includes("heic")) extension = "jpg"; + else if ( + DetermineFileType(value.type) !== "image" || + (value.type && value.type.includes("application")) + ) + extension = "jpg"; - return `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/${DetermineFileType( - value.type - )}/upload/${process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS}/${ - value.key - }${extension ? `.${extension}` : ""}`; + return `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/${DetermineFileType( + value.type + )}/upload/${process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS}/${ + value.key + }${extension ? `.${extension}` : ""}`; }; diff --git a/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx index 2ed2e3ec4..6ee486a4f 100644 --- a/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx @@ -1,145 +1,145 @@ -import { Button, Space } from "antd"; +import {Button, Space} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import cleanAxios from "../../utils/CleanAxios"; import formatBytes from "../../utils/formatbytes"; //import yauzl from "yauzl"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDocumentsDownloadButton); -export function JobsDocumentsDownloadButton({ - bodyshop, - galleryImages, - identifier, -}) { - const { t } = useTranslation(); - const [download, setDownload] = useState(null); - const { Direct_Media_Download } = useTreatments( - ["Direct_Media_Download"], - {}, - bodyshop.imexshopid - ); - const imagesToDownload = [ - ...galleryImages.images.filter((image) => image.isSelected), - ...galleryImages.other.filter((image) => image.isSelected), - ]; +export function JobsDocumentsDownloadButton({bodyshop, galleryImages, identifier}) { - function downloadProgress(progressEvent) { - setDownload((currentDownloadState) => { - return { - downloaded: progressEvent.loaded || 0, - speed: - (progressEvent.loaded || 0) - - ((currentDownloadState && currentDownloadState.downloaded) || 0), - }; - }); - } + const {t} = useTranslation(); + const [download, setDownload] = useState(null); - const handleDownload = async () => { - logImEXEvent("jobs_documents_download"); - - const zipUrl = await axios({ - url: "/media/download", - method: "POST", - //responseType: "arraybuffer", // Important - data: { ids: imagesToDownload.map((_) => _.key) }, + const {treatments: {Direct_Media_Download}} = useSplitTreatments({ + attributes: {}, + names: ["Direct_Media_Download"], + splitKey: bodyshop.imexshopid, }); - const theDownloadedZip = await cleanAxios({ - url: zipUrl.data, - method: "GET", - responseType: "arraybuffer", - onDownloadProgress: downloadProgress, - }); - setDownload(null); - if (Direct_Media_Download.treatment === "on") { - try { - // const parentDir = await window.showDirectoryPicker({ - // id: "media", - // startIn: "downloads", - // }); + const imagesToDownload = [ + ...galleryImages.images.filter((image) => image.isSelected), + ...galleryImages.other.filter((image) => image.isSelected), + ]; - // const directory = await parentDir.getDirectoryHandle(identifier, { - // create: true, - // }); - - // yauzl.fromBuffer( - // Buffer.from(theDownloadedZip.data), - // {}, - // (err, zipFile) => { - // if (err) throw err; - // zipFile.on("entry", (entry) => { - // zipFile.openReadStream(entry, async (readErr, readStream) => { - // if (readErr) { - // zipFile.close(); - // throw readErr; - // } - // if (err) throw err; - // let fileSystemHandle = await directory.getFileHandle( - // entry.fileName, - // { - // create: true, - // } - // ); - // const writable = await fileSystemHandle.createWritable(); - // readStream.on("data", async function (chunk) { - // await writable.write(chunk); - // }); - // readStream.on("end", async function () { - // await writable.close(); - // }); - // }); - // }); - // } - // ); - } catch (e) { - console.log(e); - standardMediaDownload(theDownloadedZip.data); - } - } else { - standardMediaDownload(theDownloadedZip.data); + function downloadProgress(progressEvent) { + setDownload((currentDownloadState) => { + return { + downloaded: progressEvent.loaded || 0, + speed: + (progressEvent.loaded || 0) - + ((currentDownloadState && currentDownloadState.downloaded) || 0), + }; + }); } - function standardMediaDownload(bufferData) { - const a = document.createElement("a"); - const url = window.URL.createObjectURL(new Blob([bufferData])); - a.href = url; - a.download = `${identifier || "documents"}.zip`; - a.click(); - } - }; - - return ( - <> - - - ); + const handleDownload = async () => { + logImEXEvent("jobs_documents_download"); + + const zipUrl = await axios({ + url: "/media/download", + method: "POST", + //responseType: "arraybuffer", // Important + data: {ids: imagesToDownload.map((_) => _.key)}, + }); + + const theDownloadedZip = await cleanAxios({ + url: zipUrl.data, + method: "GET", + responseType: "arraybuffer", + onDownloadProgress: downloadProgress, + }); + setDownload(null); + if (Direct_Media_Download.treatment === "on") { + try { + // const parentDir = await window.showDirectoryPicker({ + // id: "media", + // startIn: "downloads", + // }); + + // const directory = await parentDir.getDirectoryHandle(identifier, { + // create: true, + // }); + + // yauzl.fromBuffer( + // Buffer.from(theDownloadedZip.data), + // {}, + // (err, zipFile) => { + // if (err) throw err; + // zipFile.on("entry", (entry) => { + // zipFile.openReadStream(entry, async (readErr, readStream) => { + // if (readErr) { + // zipFile.close(); + // throw readErr; + // } + // if (err) throw err; + // let fileSystemHandle = await directory.getFileHandle( + // entry.fileName, + // { + // create: true, + // } + // ); + // const writable = await fileSystemHandle.createWritable(); + // readStream.on("data", async function (chunk) { + // await writable.write(chunk); + // }); + // readStream.on("end", async function () { + // await writable.close(); + // }); + // }); + // }); + // } + // ); + } catch (e) { + console.log(e); + standardMediaDownload(theDownloadedZip.data); + } + } else { + standardMediaDownload(theDownloadedZip.data); + } + + function standardMediaDownload(bufferData) { + const a = document.createElement("a"); + const url = window.URL.createObjectURL(new Blob([bufferData])); + a.href = url; + a.download = `${identifier || "documents"}.zip`; + a.click(); + } + }; + + return ( + <> + + + ); } diff --git a/client/src/components/jobs-documents-gallery/jobs-document-gallery.reassign.component.jsx b/client/src/components/jobs-documents-gallery/jobs-document-gallery.reassign.component.jsx index 18be6fb62..376ac8f4d 100644 --- a/client/src/components/jobs-documents-gallery/jobs-document-gallery.reassign.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-document-gallery.reassign.component.jsx @@ -1,172 +1,172 @@ -import { useApolloClient } from "@apollo/client"; -import { Button, Form, notification, Popover, Space } from "antd"; +import {useApolloClient} from "@apollo/client"; +import {Button, Form, notification, Popover, Space} from "antd"; import axios from "axios"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { GET_DOC_SIZE_BY_JOB } from "../../graphql/documents.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {GET_DOC_SIZE_BY_JOB} from "../../graphql/documents.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import JobSearchSelect from "../job-search-select/job-search-select.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDocumentsGalleryReassign); export function JobsDocumentsGalleryReassign({ - bodyshop, - galleryImages, - callback, -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); + bodyshop, + galleryImages, + callback, + }) { + const {t} = useTranslation(); + const [form] = Form.useForm(); - const selectedImages = useMemo(() => { - return [ - ...galleryImages.images.filter((image) => image.isSelected), - ...galleryImages.other.filter((image) => image.isSelected), - ]; - }, [galleryImages]); - const client = useApolloClient(); - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); + const selectedImages = useMemo(() => { + return [ + ...galleryImages.images.filter((image) => image.isSelected), + ...galleryImages.other.filter((image) => image.isSelected), + ]; + }, [galleryImages]); + const client = useApolloClient(); + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); - // const updateImage = async (i, jobid) => { - // //Move the cloudinary image + // const updateImage = async (i, jobid) => { + // //Move the cloudinary image - // //Update it in the database. - // const result = await updateDocument({ - // variables: { - // id: i.id, - // document: { - // key: i.public_id, - // jobid: jobid, - // }, - // }, - // }); + // //Update it in the database. + // const result = await updateDocument({ + // variables: { + // id: i.id, + // document: { + // key: i.public_id, + // jobid: jobid, + // }, + // }, + // }); - // if (!!result.errors) { - // notification["error"]({ - // message: t("documents.errors.updating", { - // message: JSON.stringify(result.errors), - // }), - // }); - // } else { - // notification["success"]({ - // message: t("documents.successes.updated"), - // }); - // } - // }; + // if (!!result.errors) { + // notification["error"]({ + // message: t("documents.errors.updating", { + // message: JSON.stringify(result.errors), + // }), + // }); + // } else { + // notification["success"]({ + // message: t("documents.successes.updated"), + // }); + // } + // }; - const handleFinish = async ({ jobid }) => { - setLoading(true); + const handleFinish = async ({jobid}) => { + setLoading(true); - //Check to see if the space remaining on the new job is sufficient. If it isn't cancel this. - const newJobData = await client.query({ - query: GET_DOC_SIZE_BY_JOB, - variables: { jobId: jobid }, - }); + //Check to see if the space remaining on the new job is sufficient. If it isn't cancel this. + const newJobData = await client.query({ + query: GET_DOC_SIZE_BY_JOB, + variables: {jobId: jobid}, + }); - const transferedDocSizeTotal = selectedImages.reduce( - (acc, val) => acc + val.size, - 0 + const transferedDocSizeTotal = selectedImages.reduce( + (acc, val) => acc + val.size, + 0 + ); + + const shouldPreventTransfer = + bodyshop.jobsizelimit - + newJobData.data.documents_aggregate.aggregate.sum.size < + transferedDocSizeTotal; + + if (shouldPreventTransfer) { + notification.open({ + key: "cannotuploaddocuments", + type: "error", + message: t("documents.labels.reassign_limitexceeded_title"), + description: t("documents.labels.reassign_limitexceeded"), + }); + setLoading(false); + return; + } + + const res = await axios.post("/media/rename", { + tojobid: jobid, + documents: selectedImages.map((i) => { + //Need to check if the current key folder is null, or another job. + const currentKeys = i.key.split("/"); + currentKeys[1] = jobid; + currentKeys.join("/"); + return { + id: i.id, + from: i.key, + to: currentKeys.join("/"), + extension: i.extension, + type: i.type, + }; + }), + }); + //Add in confirmation & errors. + if (callback) callback(); + + if (res.errors) { + notification["error"]({ + message: t("documents.errors.updating", { + message: JSON.stringify(res.errors), + }), + }); + } + if (!res.mutationResult?.errors) { + notification["success"]({ + message: t("documents.successes.updated"), + }); + } + setOpen(false); + setLoading(false); + }; + + const popContent = ( +
+ + + + + + + + + +
); - const shouldPreventTransfer = - bodyshop.jobsizelimit - - newJobData.data.documents_aggregate.aggregate.sum.size < - transferedDocSizeTotal; - - if (shouldPreventTransfer) { - notification.open({ - key: "cannotuploaddocuments", - type: "error", - message: t("documents.labels.reassign_limitexceeded_title"), - description: t("documents.labels.reassign_limitexceeded"), - }); - setLoading(false); - return; - } - - const res = await axios.post("/media/rename", { - tojobid: jobid, - documents: selectedImages.map((i) => { - //Need to check if the current key folder is null, or another job. - const currentKeys = i.key.split("/"); - currentKeys[1] = jobid; - currentKeys.join("/"); - return { - id: i.id, - from: i.key, - to: currentKeys.join("/"), - extension: i.extension, - type: i.type, - }; - }), - }); - //Add in confirmation & errors. - if (callback) callback(); - - if (res.errors) { - notification["error"]({ - message: t("documents.errors.updating", { - message: JSON.stringify(res.errors), - }), - }); - } - if (!res.mutationResult?.errors) { - notification["success"]({ - message: t("documents.successes.updated"), - }); - } - setVisible(false); - setLoading(false); - }; - - const popContent = ( -
-
- - - - - - - - -
- ); - - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx index d7e930e8b..fd9be8f23 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx @@ -1,11 +1,11 @@ -import { EditFilled, FileExcelFilled, SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Col, Row, Space } from "antd"; -import React, { useEffect, useState } from "react"; -import { Gallery } from "react-grid-gallery"; -import { useTranslation } from "react-i18next"; +import {EditFilled, FileExcelFilled, SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Col, Row, Space} from "antd"; +import React, {useEffect, useState} from "react"; +import {Gallery} from "react-grid-gallery"; +import {useTranslation} from "react-i18next"; import DocumentsUploadComponent from "../documents-upload/documents-upload.component"; -import { DetermineFileType } from "../documents-upload/documents-upload.utility"; -import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility"; +import {DetermineFileType} from "../documents-upload/documents-upload.utility"; +import {GenerateSrcUrl, GenerateThumbUrl} from "./job-documents.utility"; import JobsDocumentsDownloadButton from "./jobs-document-gallery.download.component"; import JobsDocumentsGalleryReassign from "./jobs-document-gallery.reassign.component"; import JobsDocumentsDeleteButton from "./jobs-documents-gallery.delete.component"; @@ -15,237 +15,238 @@ import Lightbox from "react-image-lightbox"; import "react-image-lightbox/style.css"; function JobsDocumentsComponent({ - data, - jobId, - refetch, - billId, - billsCallback, - totalSize, - downloadIdentifier, - ignoreSizeLimit, -}) { - const [galleryImages, setgalleryImages] = useState({ images: [], other: [] }); - const { t } = useTranslation(); - const [modalState, setModalState] = useState({ open: false, index: 0 }); + data, + jobId, + refetch, + billId, + billsCallback, + totalSize, + downloadIdentifier, + ignoreSizeLimit, + }) { + const [galleryImages, setgalleryImages] = useState({images: [], other: []}); + const {t} = useTranslation(); + const [modalState, setModalState] = useState({open: false, index: 0}); - useEffect(() => { - let documents = data.reduce( - (acc, value) => { - const fileType = DetermineFileType(value.type); - if (value.type.startsWith("image")) { - acc.images.push({ - // src: GenerateSrcUrl(value), - src: GenerateThumbUrl(value), - // src: GenerateSrcUrl(value), - // thumbnail: GenerateThumbUrl(value), - fullsize: GenerateSrcUrl(value), - height: 225, - width: 225, - isSelected: false, - key: value.key, - extension: value.extension, - id: value.id, - type: value.type, - size: value.size, - tags: [{ value: value.type, title: value.type }], - }); - } else { - let thumb; - switch (fileType) { - case "raw": - thumb = `${window.location.origin}/file.png`; - break; - default: - thumb = GenerateThumbUrl(value); - break; - } + useEffect(() => { + let documents = data.reduce( + (acc, value) => { + const fileType = DetermineFileType(value.type); + if (value.type.startsWith("image")) { + acc.images.push({ + // src: GenerateSrcUrl(value), + src: GenerateThumbUrl(value), + // src: GenerateSrcUrl(value), + // thumbnail: GenerateThumbUrl(value), + fullsize: GenerateSrcUrl(value), + height: 225, + width: 225, + isSelected: false, + key: value.key, + extension: value.extension, + id: value.id, + type: value.type, + size: value.size, + tags: [{value: value.type, title: value.type}], + }); + } else { + let thumb; + switch (fileType) { + case "raw": + thumb = `${window.location.origin}/file.png`; + break; + default: + thumb = GenerateThumbUrl(value); + break; + } - const fileName = value.key.split("/").pop(); - acc.other.push({ - source: GenerateSrcUrl(value), - src: thumb, - thumbnail: thumb, - tags: [ - { - value: fileName, - title: fileName, - }, + const fileName = value.key.split("/").pop(); + acc.other.push({ + source: GenerateSrcUrl(value), + src: thumb, + thumbnail: thumb, + tags: [ + { + value: fileName, + title: fileName, + }, - { value: value.type, title: value.type }, - ...(value.bill - ? [ - { - value: value.bill.vendor.name, - title: t("vendors.fields.name"), - }, - { value: value.bill.date, title: t("bills.fields.date") }, - { - value: value.bill.invoice_number, - title: t("bills.fields.invoice_number"), - }, - ] - : []), - ], - height: 225, - width: 225, - isSelected: false, - extension: value.extension, - key: value.key, - id: value.id, - type: value.type, - size: value.size, - }); - } + {value: value.type, title: value.type}, + ...(value.bill + ? [ + { + value: value.bill.vendor.name, + title: t("vendors.fields.name"), + }, + {value: value.bill.date, title: t("bills.fields.date")}, + { + value: value.bill.invoice_number, + title: t("bills.fields.invoice_number"), + }, + ] + : []), + ], + height: 225, + width: 225, + isSelected: false, + extension: value.extension, + key: value.key, + id: value.id, + type: value.type, + size: value.size, + }); + } - return acc; - }, - { images: [], other: [] } + return acc; + }, + {images: [], other: []} + ); + setgalleryImages(documents); + }, [data, setgalleryImages, t]); + + return ( +
+ +
+ + + + + + {!billId && ( + + )} + + + + + + + + + + + { + setModalState({open: true, index: index}); + // window.open( + // item.fullsize, + // "_blank", + // "toolbar=0,location=0,menubar=0" + // ); + }} + onSelect={(index, image) => { + setgalleryImages({ + ...galleryImages, + images: galleryImages.images.map((g, idx) => + index === idx ? {...g, isSelected: !g.isSelected} : g + ), + }); + }} + /> + + + + + { + return { + backgroundImage: , + height: "100%", + width: "100%", + cursor: "pointer", + }; + }} + onClick={(index) => { + window.open( + galleryImages.other[index].source, + "_blank", + "toolbar=0,location=0,menubar=0" + ); + }} + onSelect={(index) => { + setgalleryImages({ + ...galleryImages, + other: galleryImages.other.map((g, idx) => + index === idx ? {...g, isSelected: !g.isSelected} : g + ), + }); + }} + /> + + + {modalState.open && ( + { + const newWindow = window.open( + `${window.location.protocol}//${ + window.location.host + }/edit?documentId=${ + galleryImages.images[modalState.index].id + }`, + "_blank", + "noopener,noreferrer" + ); + if (newWindow) newWindow.opener = null; + }} + />, + ]} + mainSrc={galleryImages.images[modalState.index].fullsize} + nextSrc={ + galleryImages.images[ + (modalState.index + 1) % galleryImages.images.length + ].fullsize + } + prevSrc={ + galleryImages.images[ + (modalState.index + galleryImages.images.length - 1) % + galleryImages.images.length + ].fullsize + } + onCloseRequest={() => setModalState({open: false, index: 0})} + onMovePrevRequest={() => + setModalState({ + ...modalState, + index: + (modalState.index + galleryImages.images.length - 1) % + galleryImages.images.length, + }) + } + onMoveNextRequest={() => + setModalState({ + ...modalState, + index: (modalState.index + 1) % galleryImages.images.length, + }) + } + /> + )} + + ); - setgalleryImages(documents); - }, [data, setgalleryImages, t]); - - return ( -
- -
- - - - - - {!billId && ( - - )} - - - - - - - - - - - { - setModalState({ open: true, index: index }); - // window.open( - // item.fullsize, - // "_blank", - // "toolbar=0,location=0,menubar=0" - // ); - }} - onSelect={(index, image) => { - setgalleryImages({ - ...galleryImages, - images: galleryImages.images.map((g, idx) => - index === idx ? { ...g, isSelected: !g.isSelected } : g - ), - }); - }} - /> - - - - - { - return { - backgroundImage: , - height: "100%", - width: "100%", - cursor: "pointer", - }; - }} - onClick={(index) => { - window.open( - galleryImages.other[index].source, - "_blank", - "toolbar=0,location=0,menubar=0" - ); - }} - onSelect={(index) => { - setgalleryImages({ - ...galleryImages, - other: galleryImages.other.map((g, idx) => - index === idx ? { ...g, isSelected: !g.isSelected } : g - ), - }); - }} - /> - - - {modalState.open && ( - { - const newWindow = window.open( - `${window.location.protocol}//${ - window.location.host - }/edit?documentId=${ - galleryImages.images[modalState.index].id - }`, - "_blank", - "noopener,noreferrer" - ); - if (newWindow) newWindow.opener = null; - }} - />, - ]} - mainSrc={galleryImages.images[modalState.index].fullsize} - nextSrc={ - galleryImages.images[ - (modalState.index + 1) % galleryImages.images.length - ].fullsize - } - prevSrc={ - galleryImages.images[ - (modalState.index + galleryImages.images.length - 1) % - galleryImages.images.length - ].fullsize - } - onCloseRequest={() => setModalState({ open: false, index: 0 })} - onMovePrevRequest={() => - setModalState({ - ...modalState, - index: - (modalState.index + galleryImages.images.length - 1) % - galleryImages.images.length, - }) - } - onMoveNextRequest={() => - setModalState({ - ...modalState, - index: (modalState.index + 1) % galleryImages.images.length, - }) - } - /> - )} - - - ); } + export default JobsDocumentsComponent; diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx index 0efe8b798..c2b765570 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx @@ -1,35 +1,35 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; -import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries"; +import {GET_DOCUMENTS_BY_JOB} from "../../graphql/documents.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobDocuments from "./jobs-documents-gallery.component"; export default function JobsDocumentsContainer({ - jobId, - billId, - documentsList, - billsCallback, -}) { - const { loading, error, data, refetch } = useQuery(GET_DOCUMENTS_BY_JOB, { - variables: { jobId: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: !!billId, - }); + jobId, + billId, + documentsList, + billsCallback, + }) { + const {loading, error, data, refetch} = useQuery(GET_DOCUMENTS_BY_JOB, { + variables: {jobId: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !!billId, + }); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx index ce5669df2..dee737273 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx @@ -1,62 +1,62 @@ -import { QuestionCircleOutlined } from "@ant-design/icons"; -import { Button, notification, Popconfirm } from "antd"; +import {QuestionCircleOutlined} from "@ant-design/icons"; +import {Button, notification, Popconfirm} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; //Context: currentUserEmail, bodyshop, jobid, invoiceid export default function JobsDocumentsDeleteButton({ - galleryImages, - deletionCallback, -}) { - const { t } = useTranslation(); + galleryImages, + deletionCallback, + }) { + const {t} = useTranslation(); - const imagesToDelete = [ - ...galleryImages.images.filter((image) => image.isSelected), - ...galleryImages.other.filter((image) => image.isSelected), - ]; - const [loading, setLoading] = useState(false); + const imagesToDelete = [ + ...galleryImages.images.filter((image) => image.isSelected), + ...galleryImages.other.filter((image) => image.isSelected), + ]; + const [loading, setLoading] = useState(false); - const handleDelete = async () => { - logImEXEvent("job_documents_delete", { count: imagesToDelete.length }); - setLoading(true); - const res = await axios.post("/media/delete", { - ids: imagesToDelete, - }); + const handleDelete = async () => { + logImEXEvent("job_documents_delete", {count: imagesToDelete.length}); + setLoading(true); + const res = await axios.post("/media/delete", { + ids: imagesToDelete, + }); - if (res.data.error) { - notification["error"]({ - message: t("documents.errors.deleting", { - error: JSON.stringify(res.data.error.response.errors), - }), - }); - } else { - notification.open({ - key: "docdeletedsuccesfully", - type: "success", - message: t("documents.successes.delete"), - }); + if (res.data.error) { + notification["error"]({ + message: t("documents.errors.deleting", { + error: JSON.stringify(res.data.error.response.errors), + }), + }); + } else { + notification.open({ + key: "docdeletedsuccesfully", + type: "success", + message: t("documents.successes.delete"), + }); - if (deletionCallback) deletionCallback(); - } + if (deletionCallback) deletionCallback(); + } - setLoading(false); - }; + setLoading(false); + }; - return ( - } - onConfirm={handleDelete} - title={t("documents.labels.confirmdelete")} - okText={t("general.actions.delete")} - okButtonProps={{ type: "danger" }} - cancelText={t("general.actions.cancel")} - > - - - ); + return ( + } + onConfirm={handleDelete} + title={t("documents.labels.confirmdelete")} + okText={t("general.actions.delete")} + okButtonProps={{type: "danger"}} + cancelText={t("general.actions.cancel")} + > + + + ); } diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx index 27774f5a8..6fa2344c4 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx @@ -1,53 +1,54 @@ -import React, { useEffect } from "react"; -import { Gallery } from "react-grid-gallery"; -import { useTranslation } from "react-i18next"; -import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility"; +import React, {useEffect} from "react"; +import {Gallery} from "react-grid-gallery"; +import {useTranslation} from "react-i18next"; +import {GenerateSrcUrl, GenerateThumbUrl} from "./job-documents.utility"; function JobsDocumentGalleryExternal({ - data, + data, - externalMediaState, -}) { - const [galleryImages, setgalleryImages] = externalMediaState; - const { t } = useTranslation(); + externalMediaState, + }) { + const [galleryImages, setgalleryImages] = externalMediaState; + const {t} = useTranslation(); - useEffect(() => { - let documents = data.reduce((acc, value) => { - if (value.type.startsWith("image")) { - acc.push({ - fullsize: GenerateSrcUrl(value), - src: GenerateThumbUrl(value), - thumbnailHeight: 225, - thumbnailWidth: 225, - isSelected: false, - key: value.key, - extension: value.extension, - id: value.id, - type: value.type, - tags: [{ value: value.type, title: value.type }], - size: value.size, - }); - } + useEffect(() => { + let documents = data.reduce((acc, value) => { + if (value.type.startsWith("image")) { + acc.push({ + fullsize: GenerateSrcUrl(value), + src: GenerateThumbUrl(value), + thumbnailHeight: 225, + thumbnailWidth: 225, + isSelected: false, + key: value.key, + extension: value.extension, + id: value.id, + type: value.type, + tags: [{value: value.type, title: value.type}], + size: value.size, + }); + } - return acc; - }, []); - setgalleryImages(documents); - }, [data, setgalleryImages, t]); + return acc; + }, []); + setgalleryImages(documents); + }, [data, setgalleryImages, t]); - return ( -
- { - setgalleryImages( - galleryImages.map((g, idx) => - index === idx ? { ...g, isSelected: !g.isSelected } : g - ) - ); - }} - /> -
- ); + return ( +
+ { + setgalleryImages( + galleryImages.map((g, idx) => + index === idx ? {...g, isSelected: !g.isSelected} : g + ) + ); + }} + /> +
+ ); } + export default JobsDocumentGalleryExternal; diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.selectall.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.selectall.component.jsx index b140e2043..593c15f21 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.selectall.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.selectall.component.jsx @@ -1,67 +1,67 @@ -import { Button, Space } from "antd"; +import {Button, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; export default function JobsDocumentsGallerySelectAllComponent({ - galleryImages, - setGalleryImages, -}) { - const { t } = useTranslation(); + galleryImages, + setGalleryImages, + }) { + const {t} = useTranslation(); - const handleSelectAll = () => { - setGalleryImages({ - ...galleryImages, - other: galleryImages.other.map((i) => { - return { ...i, isSelected: true }; - }), - images: galleryImages.images.map((i) => { - return { ...i, isSelected: true }; - }), - }); - }; - const handleSelectAllImages = () => { - setGalleryImages({ - ...galleryImages, + const handleSelectAll = () => { + setGalleryImages({ + ...galleryImages, + other: galleryImages.other.map((i) => { + return {...i, isSelected: true}; + }), + images: galleryImages.images.map((i) => { + return {...i, isSelected: true}; + }), + }); + }; + const handleSelectAllImages = () => { + setGalleryImages({ + ...galleryImages, - images: galleryImages.images.map((i) => { - return { ...i, isSelected: true }; - }), - }); - }; - const handleSelectAllDocuments = () => { - setGalleryImages({ - ...galleryImages, - other: galleryImages.other.map((i) => { - return { ...i, isSelected: true }; - }), - }); - }; - const handleDeselectAll = () => { - setGalleryImages({ - ...galleryImages, - other: galleryImages.other.map((i) => { - return { ...i, isSelected: false }; - }), - images: galleryImages.images.map((i) => { - return { ...i, isSelected: false }; - }), - }); - }; + images: galleryImages.images.map((i) => { + return {...i, isSelected: true}; + }), + }); + }; + const handleSelectAllDocuments = () => { + setGalleryImages({ + ...galleryImages, + other: galleryImages.other.map((i) => { + return {...i, isSelected: true}; + }), + }); + }; + const handleDeselectAll = () => { + setGalleryImages({ + ...galleryImages, + other: galleryImages.other.map((i) => { + return {...i, isSelected: false}; + }), + images: galleryImages.images.map((i) => { + return {...i, isSelected: false}; + }), + }); + }; - return ( - - - - - - - ); + return ( + + + + + + + ); } diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx index f9889f3a6..f91daae96 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx @@ -1,18 +1,14 @@ -import { SyncOutlined, FileExcelFilled } from "@ant-design/icons"; -import { Alert, Button, Card, Space } from "antd"; -import React, { useEffect, useState } from "react"; -import { Gallery } from "react-grid-gallery"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - getBillMedia, - getJobMedia, - toggleMediaSelected, -} from "../../redux/media/media.actions"; -import { selectAllMedia } from "../../redux/media/media.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { CreateExplorerLinkForJob } from "../../utils/localmedia"; +import {FileExcelFilled, SyncOutlined} from "@ant-design/icons"; +import {Alert, Button, Card, Space} from "antd"; +import React, {useEffect, useState} from "react"; +import {Gallery} from "react-grid-gallery"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {getBillMedia, getJobMedia, toggleMediaSelected,} from "../../redux/media/media.actions"; +import {selectAllMedia} from "../../redux/media/media.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {CreateExplorerLinkForJob} from "../../utils/localmedia"; import DocumentsLocalUploadComponent from "../documents-local-upload/documents-local-upload.component"; import JobsDocumentsLocalDeleteButton from "./jobs-documents-local-gallery.delete.component"; import JobsLocalGalleryDownloadButton from "./jobs-documents-local-gallery.download"; @@ -23,194 +19,194 @@ import Lightbox from "react-image-lightbox"; import "react-image-lightbox/style.css"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - allMedia: selectAllMedia, + bodyshop: selectBodyshop, + allMedia: selectAllMedia, }); const mapDispatchToProps = (dispatch) => ({ - getJobMedia: (id) => dispatch(getJobMedia(id)), - getBillMedia: ({ jobid, invoice_number }) => { - dispatch(getBillMedia({ jobid, invoice_number })); - }, - toggleMediaSelected: ({ jobid, filename }) => - dispatch(toggleMediaSelected({ jobid, filename })), + getJobMedia: (id) => dispatch(getJobMedia(id)), + getBillMedia: ({jobid, invoice_number}) => { + dispatch(getBillMedia({jobid, invoice_number})); + }, + toggleMediaSelected: ({jobid, filename}) => + dispatch(toggleMediaSelected({jobid, filename})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDocumentsLocalGallery); export function JobsDocumentsLocalGallery({ - bodyshop, - toggleMediaSelected, - getJobMedia, - getBillMedia, - allMedia, - job, - invoice_number, - vendorid, -}) { - const { t } = useTranslation(); - const [modalState, setModalState] = useState({ open: false, index: 0 }); - useEffect(() => { - if (job) { - if (invoice_number) { - getBillMedia({ jobid: job.id, invoice_number }); - } else { - getJobMedia(job.id); - } - } - }, [job, invoice_number, getJobMedia, getBillMedia]); - let optimized; - const jobMedia = - allMedia && allMedia[job.id] - ? allMedia[job.id].reduce( - (acc, val) => { - if ( - val.type && - val.type.mime && - val.type.mime.startsWith("image") - ) { - acc.images.push({ - ...val, - fullsize: val.src, - src: val.thumbnail, - height: val.thumbnailHeight, - width: val.thumbnailWidth, - ...(val.optimized && { src: val.optimized, fullsize: val.src }), - }); - if (val.optimized) optimized = true; + bodyshop, + toggleMediaSelected, + getJobMedia, + getBillMedia, + allMedia, + job, + invoice_number, + vendorid, + }) { + const {t} = useTranslation(); + const [modalState, setModalState] = useState({open: false, index: 0}); + useEffect(() => { + if (job) { + if (invoice_number) { + getBillMedia({jobid: job.id, invoice_number}); } else { - acc.other.push({ - ...val, - fullsize: val.src, - src: val.thumbnail, - height: val.thumbnailHeight, - width: val.thumbnailWidth, - tags: [{ value: val.filename, title: val.filename }], - }); - } - return acc; - }, - { images: [], other: [] } - ) - : { images: [], other: [] }; - - return ( -
- - - - - - - - - - - - - - - { - toggleMediaSelected({ jobid: job.id, filename: image.filename }); - }} - {...(optimized && { - customControls: [ - , - ], - })} - onClick={(index) => { - setModalState({ open: true, index: index }); - // const media = allMedia[job.id].find( - // (m) => m.optimized === item.src - // ); + } + }, [job, invoice_number, getJobMedia, getBillMedia]); + let optimized; + const jobMedia = + allMedia && allMedia[job.id] + ? allMedia[job.id].reduce( + (acc, val) => { + if ( + val.type && + val.type.mime && + val.type.mime.startsWith("image") + ) { + acc.images.push({ + ...val, + fullsize: val.src, + src: val.thumbnail, + height: val.thumbnailHeight, + width: val.thumbnailWidth, + ...(val.optimized && {src: val.optimized, fullsize: val.src}), + }); + if (val.optimized) optimized = true; + } else { + acc.other.push({ + ...val, + fullsize: val.src, + src: val.thumbnail, + height: val.thumbnailHeight, + width: val.thumbnailWidth, + tags: [{value: val.filename, title: val.filename}], + }); + } + return acc; + }, + {images: [], other: []} + ) + : {images: [], other: []}; - // window.open( - // media ? media.fullsize : item.fullsize, - // "_blank", - // "toolbar=0,location=0,menubar=0" - // ); - }} - /> - - - { - return { - backgroundImage: , - height: "100%", - width: "100%", - cursor: "pointer", - }; - }} - onClick={(index) => { - window.open( - jobMedia.other[index].fullsize, - "_blank", - "toolbar=0,location=0,menubar=0" - ); - }} - onSelect={(index, image) => { - toggleMediaSelected({ jobid: job.id, filename: image.filename }); - }} - /> - - {modalState.open && ( - setModalState({ open: false, index: 0 })} - onMovePrevRequest={() => - setModalState({ - ...modalState, - index: - (modalState.index + jobMedia.images.length - 1) % - jobMedia.images.length, - }) - } - onMoveNextRequest={() => - setModalState({ - ...modalState, - index: (modalState.index + 1) % jobMedia.images.length, - }) - } - /> - )} -
- ); + return ( +
+ + + + + + + + + + + + + + + { + toggleMediaSelected({jobid: job.id, filename: image.filename}); + }} + {...(optimized && { + customControls: [ + , + ], + })} + onClick={(index) => { + setModalState({open: true, index: index}); + // const media = allMedia[job.id].find( + // (m) => m.optimized === item.src + // ); + + // window.open( + // media ? media.fullsize : item.fullsize, + // "_blank", + // "toolbar=0,location=0,menubar=0" + // ); + }} + /> + + + { + return { + backgroundImage: , + height: "100%", + width: "100%", + cursor: "pointer", + }; + }} + onClick={(index) => { + window.open( + jobMedia.other[index].fullsize, + "_blank", + "toolbar=0,location=0,menubar=0" + ); + }} + onSelect={(index, image) => { + toggleMediaSelected({jobid: job.id, filename: image.filename}); + }} + /> + + {modalState.open && ( + setModalState({open: false, index: 0})} + onMovePrevRequest={() => + setModalState({ + ...modalState, + index: + (modalState.index + jobMedia.images.length - 1) % + jobMedia.images.length, + }) + } + onMoveNextRequest={() => + setModalState({ + ...modalState, + index: (modalState.index + 1) % jobMedia.images.length, + }) + } + /> + )} +
+ ); } diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.delete.component.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.delete.component.jsx index 0fe38256c..29af34e74 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.delete.component.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.delete.component.jsx @@ -1,81 +1,81 @@ -import { QuestionCircleOutlined } from "@ant-design/icons"; -import { Button, notification, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {QuestionCircleOutlined} from "@ant-design/icons"; +import {Button, notification, Popconfirm} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import cleanAxios from "../../utils/CleanAxios"; //Context: currentUserEmail, bodyshop, jobid, invoiceid +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {getJobMedia} from "../../redux/media/media.actions"; +import {selectAllMedia} from "../../redux/media/media.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { getJobMedia } from "../../redux/media/media.actions"; -import { selectAllMedia } from "../../redux/media/media.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - allMedia: selectAllMedia, + allMedia: selectAllMedia, - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - getJobMedia: (id) => dispatch(getJobMedia(id)), + getJobMedia: (id) => dispatch(getJobMedia(id)), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDocumentsLocalDeleteButton); export function JobsDocumentsLocalDeleteButton({ - bodyshop, - getJobMedia, - allMedia, - jobid, -}) { - const { t } = useTranslation(); + bodyshop, + getJobMedia, + allMedia, + jobid, + }) { + const {t} = useTranslation(); - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(false); - const handleDelete = async () => { - logImEXEvent("job_documents_delete"); - setLoading(true); + const handleDelete = async () => { + logImEXEvent("job_documents_delete"); + setLoading(true); - const delres = await cleanAxios.post( - `${bodyshop.localmediaserverhttp}/jobs/delete`, - { - jobid: jobid, - files: ((allMedia && allMedia[jobid]) || []) - .filter((i) => i.isSelected) - .map((i) => i.filename), - }, - { headers: { ims_token: bodyshop.localmediatoken } } + const delres = await cleanAxios.post( + `${bodyshop.localmediaserverhttp}/jobs/delete`, + { + jobid: jobid, + files: ((allMedia && allMedia[jobid]) || []) + .filter((i) => i.isSelected) + .map((i) => i.filename), + }, + {headers: {ims_token: bodyshop.localmediatoken}} + ); + + if (delres.errors) { + notification["error"]({ + message: t("documents.errors.deleting", { + message: JSON.stringify(delres.errors), + }), + }); + } else { + notification.open({ + key: "docdeletedsuccesfully", + type: "success", + message: t("documents.successes.delete"), + }); + } + getJobMedia(jobid); + setLoading(false); + }; + + return ( + } + onConfirm={handleDelete} + title={t("documents.labels.confirmdelete")} + okText={t("general.actions.delete")} + okButtonProps={{type: "danger"}} + cancelText={t("general.actions.cancel")} + > + + ); - - if (delres.errors) { - notification["error"]({ - message: t("documents.errors.deleting", { - message: JSON.stringify(delres.errors), - }), - }); - } else { - notification.open({ - key: "docdeletedsuccesfully", - type: "success", - message: t("documents.successes.delete"), - }); - } - getJobMedia(jobid); - setLoading(false); - }; - - return ( - } - onConfirm={handleDelete} - title={t("documents.labels.confirmdelete")} - okText={t("general.actions.delete")} - okButtonProps={{ type: "danger" }} - cancelText={t("general.actions.cancel")} - > - - - ); } diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.download.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.download.jsx index 57d186d69..02dff33a5 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.download.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.download.jsx @@ -1,74 +1,75 @@ -import { Button } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Button} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import cleanAxios from "../../utils/CleanAxios"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectAllMedia } from "../../redux/media/media.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectAllMedia} from "../../redux/media/media.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - allMedia: selectAllMedia, + bodyshop: selectBodyshop, + allMedia: selectAllMedia, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsLocalGalleryDownloadButton); export function JobsLocalGalleryDownloadButton({ - bodyshop, - galleryImages, - allMedia, - job, -}) { - const { t } = useTranslation(); - const [download, setDownload] = useState(null); + bodyshop, + galleryImages, + allMedia, + job, + }) { + const {t} = useTranslation(); + const [download, setDownload] = useState(null); - function downloadProgress(progressEvent) { - setDownload((currentDownloadState) => { - return { - downloaded: progressEvent.loaded || 0, - speed: - (progressEvent.loaded || 0) - - ((currentDownloadState && currentDownloadState.downloaded) || 0), - }; - }); - } + function downloadProgress(progressEvent) { + setDownload((currentDownloadState) => { + return { + downloaded: progressEvent.loaded || 0, + speed: + (progressEvent.loaded || 0) - + ((currentDownloadState && currentDownloadState.downloaded) || 0), + }; + }); + } - const handleDownload = async () => { - const theDownloadedZip = await cleanAxios.post( - `${bodyshop.localmediaserverhttp}/jobs/download`, - { - jobid: job.id, - files: ((allMedia && allMedia[job.id]) || []) - .filter((i) => i.isSelected) - .map((i) => i.filename), - }, - { - headers: { ims_token: bodyshop.localmediatoken }, - responseType: "arraybuffer", - onDownloadProgress: downloadProgress, - } + const handleDownload = async () => { + const theDownloadedZip = await cleanAxios.post( + `${bodyshop.localmediaserverhttp}/jobs/download`, + { + jobid: job.id, + files: ((allMedia && allMedia[job.id]) || []) + .filter((i) => i.isSelected) + .map((i) => i.filename), + }, + { + headers: {ims_token: bodyshop.localmediatoken}, + responseType: "arraybuffer", + onDownloadProgress: downloadProgress, + } + ); + setDownload(null); + standardMediaDownload(theDownloadedZip.data, job.ro_number); + }; + + return ( + ); - setDownload(null); - standardMediaDownload(theDownloadedZip.data, job.ro_number); - }; - - return ( - - ); } function standardMediaDownload(bufferData, filename) { - const a = document.createElement("a"); - const url = window.URL.createObjectURL(new Blob([bufferData])); - a.href = url; - a.download = `${filename}.zip`; - a.click(); + const a = document.createElement("a"); + const url = window.URL.createObjectURL(new Blob([bufferData])); + a.href = url; + a.download = `${filename}.zip`; + a.click(); } diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx index 19e18be1e..a1eef302d 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx @@ -1,82 +1,79 @@ -import React, { useEffect } from "react"; -import { Gallery } from "react-grid-gallery"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - getJobMedia, - toggleMediaSelected, -} from "../../redux/media/media.actions"; -import { selectAllMedia } from "../../redux/media/media.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect} from "react"; +import {Gallery} from "react-grid-gallery"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {getJobMedia, toggleMediaSelected,} from "../../redux/media/media.actions"; +import {selectAllMedia} from "../../redux/media/media.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - allMedia: selectAllMedia, + bodyshop: selectBodyshop, + allMedia: selectAllMedia, }); const mapDispatchToProps = (dispatch) => ({ - getJobMedia: (id) => dispatch(getJobMedia(id)), + getJobMedia: (id) => dispatch(getJobMedia(id)), - toggleMediaSelected: ({ jobid, filename }) => - dispatch(toggleMediaSelected({ jobid, filename })), + toggleMediaSelected: ({jobid, filename}) => + dispatch(toggleMediaSelected({jobid, filename})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobDocumentsLocalGalleryExternal); function JobDocumentsLocalGalleryExternal({ - jobId, - externalMediaState, - getJobMedia, - toggleMediaSelected, - allMedia, -}) { - const [galleryImages, setgalleryImages] = externalMediaState; - const { t } = useTranslation(); + jobId, + externalMediaState, + getJobMedia, + toggleMediaSelected, + allMedia, + }) { + const [galleryImages, setgalleryImages] = externalMediaState; + const {t} = useTranslation(); - useEffect(() => { - if (jobId) { - getJobMedia(jobId); - } - }, [jobId, getJobMedia]); + useEffect(() => { + if (jobId) { + getJobMedia(jobId); + } + }, [jobId, getJobMedia]); - useEffect(() => { - let documents = - allMedia && allMedia[jobId] - ? allMedia[jobId].reduce((acc, val) => { - if ( - val.type && - val.type.mime && - val.type.mime.startsWith("image") - ) { - acc.push({ ...val, src: val.thumbnail, fullsize: val.src }); - } - return acc; - }, []) - : []; - console.log( - "🚀 ~ file: jobs-documents-local-gallery.external.component.jsx:48 ~ useEffect ~ documents:", - documents + useEffect(() => { + let documents = + allMedia && allMedia[jobId] + ? allMedia[jobId].reduce((acc, val) => { + if ( + val.type && + val.type.mime && + val.type.mime.startsWith("image") + ) { + acc.push({...val, src: val.thumbnail, fullsize: val.src}); + } + return acc; + }, []) + : []; + console.log( + "🚀 ~ file: jobs-documents-local-gallery.external.component.jsx:48 ~ useEffect ~ documents:", + documents + ); + + setgalleryImages(documents); + }, [allMedia, jobId, setgalleryImages, t]); + + return ( +
+ { + setgalleryImages( + galleryImages.map((g, idx) => + index === idx ? {...g, isSelected: !g.isSelected} : g + ) + ); + }} + /> +
); - - setgalleryImages(documents); - }, [allMedia, jobId, setgalleryImages, t]); - - return ( -
- { - setgalleryImages( - galleryImages.map((g, idx) => - index === idx ? { ...g, isSelected: !g.isSelected } : g - ) - ); - }} - /> -
- ); } diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.reassign.component.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.reassign.component.jsx index 74c5a52b9..b27474a14 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.reassign.component.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.reassign.component.jsx @@ -1,96 +1,96 @@ -import { Button, Form, Popover, Space } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { getJobMedia } from "../../redux/media/media.actions"; -import { selectAllMedia } from "../../redux/media/media.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Button, Form, Popover, Space} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {getJobMedia} from "../../redux/media/media.actions"; +import {selectAllMedia} from "../../redux/media/media.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import cleanAxios from "../../utils/CleanAxios"; import JobSearchSelect from "../job-search-select/job-search-select.component"; const mapStateToProps = createStructuredSelector({ - allMedia: selectAllMedia, - bodyshop: selectBodyshop, + allMedia: selectAllMedia, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - getJobMedia: (id) => dispatch(getJobMedia(id)), + getJobMedia: (id) => dispatch(getJobMedia(id)), - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDocumentsLocalGalleryReassign); export function JobsDocumentsLocalGalleryReassign({ - bodyshop, - jobid, - allMedia, - getJobMedia, -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); + bodyshop, + jobid, + allMedia, + getJobMedia, + }) { + const {t} = useTranslation(); + const [form] = Form.useForm(); - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); - const handleFinish = async ({ jobid: newJobid }) => { - setLoading(true); - const selectedDocuments = allMedia[jobid].filter((m) => m.isSelected); + const handleFinish = async ({jobid: newJobid}) => { + setLoading(true); + const selectedDocuments = allMedia[jobid].filter((m) => m.isSelected); - await cleanAxios.post( - `${bodyshop.localmediaserverhttp}/jobs/move`, - { - from_jobid: jobid, - jobid: newJobid, - files: selectedDocuments.map((f) => f.filename), - }, - { headers: { ims_token: bodyshop.localmediatoken } } + await cleanAxios.post( + `${bodyshop.localmediaserverhttp}/jobs/move`, + { + from_jobid: jobid, + jobid: newJobid, + files: selectedDocuments.map((f) => f.filename), + }, + {headers: {ims_token: bodyshop.localmediatoken}} + ); + + getJobMedia(jobid); + setOpen(false); + setLoading(false); + }; + + const popContent = ( +
+
+ + + + + + + + +
); - getJobMedia(jobid); - setVisible(false); - setLoading(false); - }; - - const popContent = ( -
-
- - - - - - - - -
- ); - - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.selectall.component.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.selectall.component.jsx index 459a1fdac..a8c41d2ac 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.selectall.component.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.selectall.component.jsx @@ -1,53 +1,51 @@ -import { Button, Space } from "antd"; +import {Button, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {deselectAllMediaForJob, selectAllmediaForJob,} from "../../redux/media/media.actions"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectAllmediaForJob, - deselectAllMediaForJob, -} from "../../redux/media/media.actions"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - selectAllmediaForJob: (jobid) => dispatch(selectAllmediaForJob(jobid)), - deselectAllmediaForJob: (jobid) => dispatch(deselectAllMediaForJob(jobid)), + selectAllmediaForJob: (jobid) => dispatch(selectAllmediaForJob(jobid)), + deselectAllmediaForJob: (jobid) => dispatch(deselectAllMediaForJob(jobid)), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDocumentsLocalGallerySelectAllComponent); export function JobsDocumentsLocalGallerySelectAllComponent({ - jobid, - selectAllmediaForJob, - deselectAllmediaForJob, -}) { - const { t } = useTranslation(); + jobid, + selectAllmediaForJob, + deselectAllmediaForJob, + }) { + const {t} = useTranslation(); - // onSelectImage={(index, image) => { - // toggleMediaSelected({ jobid: job.id, filename: image.filename }); - // }} + // onSelectImage={(index, image) => { + // toggleMediaSelected({ jobid: job.id, filename: image.filename }); + // }} - const handleSelectAll = () => { - selectAllmediaForJob({ jobid }); - }; + const handleSelectAll = () => { + selectAllmediaForJob({jobid}); + }; - const handleDeselectAll = () => { - deselectAllmediaForJob({ jobid }); - }; + const handleDeselectAll = () => { + deselectAllmediaForJob({jobid}); + }; - return ( - - + return ( + + - - - ); + + + ); } diff --git a/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx b/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx index 3204d7311..919e71421 100644 --- a/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx +++ b/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx @@ -1,228 +1,225 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; import axios from "axios"; import _ from "lodash"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { auth, logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { UPDATE_JOBS } from "../../graphql/jobs.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {UPDATE_JOBS} from "../../graphql/jobs.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); function updateJobCache(items) { - client.cache.modify({ - id: "ROOT_QUERY", - fields: { - jobs(existingJobs = []) { - return existingJobs.filter( - (jobRef) => jobRef.__ref.includes(items) === false - ); - }, - }, - }); + client.cache.modify({ + id: "ROOT_QUERY", + fields: { + jobs(existingJobs = []) { + return existingJobs.filter( + (jobRef) => jobRef.__ref.includes(items) === false + ); + }, + }, + }); } export function JobsExportAllButton({ - bodyshop, - currentUser, - jobIds, - disabled, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const [updateJob] = useMutation(UPDATE_JOBS); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + bodyshop, + currentUser, + jobIds, + disabled, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOBS); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const [loading, setLoading] = useState(false); - const handleQbxml = async () => { - logImEXEvent("jobs_export_all"); - let PartnerResponse; - setLoading(true); - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { - PartnerResponse = await axios.post(`/qbo/receivables`, { - jobIds: jobIds, - elgen: true, - }); - } else { - let QbXmlResponse; - try { - QbXmlResponse = await axios.post( - "/accounting/qbxml/receivables", - { jobIds: jobIds }, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } - ); - } catch (error) { - console.log("Error getting QBXML from Server.", error); - notification["error"]({ - message: t("jobs.errors.exporting", { - error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), - }), - }); - setLoading(false); - return; - } - - try { - PartnerResponse = await axios.post( - "http://localhost:1337/qb/", - // "http://609feaeae986.ngrok.io/qb/", - QbXmlResponse.data, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } - ); - } catch (error) { - console.log("Error connecting to quickbooks or partner.", error); - notification["error"]({ - message: t("jobs.errors.exporting-partner"), - }); - setLoading(false); - return; - } - } - - console.log("PartnerResponse", PartnerResponse); - const groupedData = _.groupBy( - PartnerResponse.data, - bodyshop.accountingconfig.qbo ? "jobid" : "id" - ); - - await Promise.all( - Object.keys(groupedData).map(async (key) => { - //Check to see if any of them failed. If they didn't don't execute the update. - const failedTransactions = groupedData[key].filter((r) => !r.success); - const successfulTransactions = groupedData[key].filter( - (r) => r.success - ); - if (failedTransactions.length > 0) { - //Uh oh. At least one was no good. - failedTransactions.forEach((ft) => { - notification.open({ - // key: "failedexports", - type: "error", - message: t("jobs.errors.exporting", { - error: ft.errorMessage || "", - }), + const [loading, setLoading] = useState(false); + const handleQbxml = async () => { + logImEXEvent("jobs_export_all"); + let PartnerResponse; + setLoading(true); + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { + PartnerResponse = await axios.post(`/qbo/receivables`, { + jobIds: jobIds, + elgen: true, }); - //Call is not awaited as it is not critical to finish before proceeding. - }); - - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - jobid: key, - successful: false, - message: JSON.stringify( - failedTransactions.map((ft) => ft.errorMessage) - ), - useremail: currentUser.email, - }, - ], - }, - }); - } } else { - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - jobid: key, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); - - const jobUpdateResponse = await updateJob({ - variables: { - jobIds: [key], - fields: { - status: - bodyshop.md_ro_statuses.default_exported || "Exported*", - date_exported: new Date(), - }, - }, - }); - - if (!!!jobUpdateResponse.errors) { - notification.open({ - type: "success", - key: "jobsuccessexport", - message: t("jobs.successes.exported"), - }); - updateJobCache( - jobUpdateResponse.data.update_jobs.returning.map( - (job) => job.id - ) - ); - } else { - notification["error"]({ - message: t("jobs.errors.exporting", { - error: JSON.stringify(jobUpdateResponse.error), - }), - }); + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/receivables", + {jobIds: jobIds}, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("jobs.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + setLoading(false); + return; + } + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + // "http://609feaeae986.ngrok.io/qb/", + QbXmlResponse.data, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("jobs.errors.exporting-partner"), + }); + setLoading(false); + return; } - } - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { - notification.open({ - type: "success", - key: "jobsuccessexport", - message: t("jobs.successes.exported"), - }); - updateJobCache([ - ...new Set( - successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && bodyshop.accountingconfig.qbo - ? "jobid" - : "id" - ] - ) - ), - ]); - } } - }) + + console.log("PartnerResponse", PartnerResponse); + const groupedData = _.groupBy( + PartnerResponse.data, + bodyshop.accountingconfig.qbo ? "jobid" : "id" + ); + + await Promise.all( + Object.keys(groupedData).map(async (key) => { + //Check to see if any of them failed. If they didn't don't execute the update. + const failedTransactions = groupedData[key].filter((r) => !r.success); + const successfulTransactions = groupedData[key].filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.forEach((ft) => { + notification.open({ + // key: "failedexports", + type: "error", + message: t("jobs.errors.exporting", { + error: ft.errorMessage || "", + }), + }); + //Call is not awaited as it is not critical to finish before proceeding. + }); + + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + jobid: key, + successful: false, + message: JSON.stringify( + failedTransactions.map((ft) => ft.errorMessage) + ), + useremail: currentUser.email, + }, + ], + }, + }); + } + } else { + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + jobid: key, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); + + const jobUpdateResponse = await updateJob({ + variables: { + jobIds: [key], + fields: { + status: + bodyshop.md_ro_statuses.default_exported || "Exported*", + date_exported: new Date(), + }, + }, + }); + + if (!!!jobUpdateResponse.errors) { + notification.open({ + type: "success", + key: "jobsuccessexport", + message: t("jobs.successes.exported"), + }); + updateJobCache( + jobUpdateResponse.data.update_jobs.returning.map( + (job) => job.id + ) + ); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(jobUpdateResponse.error), + }), + }); + } + } + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { + notification.open({ + type: "success", + key: "jobsuccessexport", + message: t("jobs.successes.exported"), + }); + updateJobCache([ + ...new Set( + successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && bodyshop.accountingconfig.qbo + ? "jobid" + : "id" + ] + ) + ), + ]); + } + } + }) + ); + + if (!!completedCallback) completedCallback([]); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + }; + + return ( + ); - - if (!!completedCallback) completedCallback([]); - if (!!loadingCallback) loadingCallback(false); - setLoading(false); - }; - - return ( - - ); } export default connect(mapStateToProps, null)(JobsExportAllButton); diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx index 37a88e1ef..a52988e1c 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx @@ -1,212 +1,212 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Checkbox, Divider, Input, Table, Button } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Checkbox, Divider, Input, Table} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import PhoneFormatter from "../../utils/PhoneFormatter"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; export default function JobsFindModalComponent({ - selectedJob, - setSelectedJob, - jobsList, - jobsListLoading, - importOptionsState, - modalSearchState, - jobsListRefetch, - partsQueueToggle, - setPartsQueueToggle, -}) { - const { t } = useTranslation(); - const [modalSearch, setModalSearch] = modalSearchState; - const [importOptions, setImportOptions] = importOptionsState; + selectedJob, + setSelectedJob, + jobsList, + jobsListLoading, + importOptionsState, + modalSearchState, + jobsListRefetch, + partsQueueToggle, + setPartsQueueToggle, + }) { + const {t} = useTranslation(); + const [modalSearch, setModalSearch] = modalSearchState; + const [importOptions, setImportOptions] = importOptionsState; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - width: "8%", - render: (text, record) => ( - + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + width: "8%", + render: (text, record) => ( + {record.ro_number || t("general.labels.na")} - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, - width: "25%", + width: "25%", - render: (text, record) => { - return record.owner ? ( - - - - ) : ( - - + render: (text, record) => { + return record.owner ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - width: "12%", - ellipsis: true, - render: (text, record) => { - return record.ownr_ph1 ? ( - {record.ownr_ph1} - ) : ( - t("general.labels.unknown") - ); - }, - }, - { - title: t("jobs.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - width: "12%", - ellipsis: true, - render: (text, record) => { - return record.ownr_ph2 ? ( - {record.ownr_ph2} - ) : ( - t("general.labels.unknown") - ); - }, - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - width: "10%", - ellipsis: true, - render: (text, record) => { - return record.status || t("general.labels.na"); - }, - }, - - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - width: "15%", - ellipsis: true, - render: (text, record) => ( - - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ), - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate_no", - key: "plate_no", - width: "8%", - ellipsis: true, - render: (text, record) => { - return record.plate_no ? ( - {record.plate_no} - ) : ( - t("general.labels.unknown") - ); - }, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - width: "12%", - ellipsis: true, - render: (text, record) => { - return record.clm_no ? ( - {record.clm_no} - ) : ( - t("general.labels.unknown") - ); - }, - }, - ]; - - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - setSelectedJob(record.id); - return; - } - } - setSelectedJob(null); - }; - - return ( -
-
( -
- {t("jobs.labels.existing_jobs")} - - { - setModalSearch(e.target.value); - }} - /> -
- )} - pagination={{ position: "bottom" }} - columns={columns} - rowKey="id" - loading={jobsListLoading} - dataSource={jobsList} - rowSelection={{ - onSelect: (props) => { - setSelectedJob(props.id); - }, - type: "radio", - selectedRowKeys: [selectedJob], - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); + ); }, - }; - }} - /> - - - setImportOptions({ - ...importOptions, - overrideHeaders: e.target.checked, - }) + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + width: "12%", + ellipsis: true, + render: (text, record) => { + return record.ownr_ph1 ? ( + {record.ownr_ph1} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + width: "12%", + ellipsis: true, + render: (text, record) => { + return record.ownr_ph2 ? ( + {record.ownr_ph2} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + width: "10%", + ellipsis: true, + render: (text, record) => { + return record.status || t("general.labels.na"); + }, + }, + + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + width: "15%", + ellipsis: true, + render: (text, record) => ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ), + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + width: "8%", + ellipsis: true, + render: (text, record) => { + return record.plate_no ? ( + {record.plate_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + width: "12%", + ellipsis: true, + render: (text, record) => { + return record.clm_no ? ( + {record.clm_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + ]; + + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + setSelectedJob(record.id); + return; + } } - > - {t("jobs.labels.override_header")} - - setPartsQueueToggle(e.target.checked)} - > - {t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")} - - - ); + setSelectedJob(null); + }; + + return ( +
+
( +
+ {t("jobs.labels.existing_jobs")} + + { + setModalSearch(e.target.value); + }} + /> +
+ )} + pagination={{position: "bottom"}} + columns={columns} + rowKey="id" + loading={jobsListLoading} + dataSource={jobsList} + rowSelection={{ + onSelect: (props) => { + setSelectedJob(props.id); + }, + type: "radio", + selectedRowKeys: [selectedJob], + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + + setImportOptions({ + ...importOptions, + overrideHeaders: e.target.checked, + }) + } + > + {t("jobs.labels.override_header")} + + setPartsQueueToggle(e.target.checked)} + > + {t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")} + + + ); } diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx index 64dc8be9a..d5857f1d4 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx @@ -1,102 +1,101 @@ -import { useQuery } from "@apollo/client"; -import { Modal } from "antd"; +import {useQuery} from "@apollo/client"; +import {Modal} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ALL_ACTIVE_JOBS} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobsFindModalComponent from "./jobs-find-modal.component"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export default connect( - mapStateToProps, - null + mapStateToProps, + null )(function JobsFindModalContainer({ - bodyshop, - loading, - error, - selectedJob, - setSelectedJob, - importOptionsState, - modalSearchState, - partsQueueToggle, - setPartsQueueToggle, - ...modalProps -}) { - const { t } = useTranslation(); + bodyshop, + loading, + error, + selectedJob, + setSelectedJob, + importOptionsState, + modalSearchState, + partsQueueToggle, + setPartsQueueToggle, + ...modalProps + }) { + const {t} = useTranslation(); - const jobsList = useQuery(QUERY_ALL_ACTIVE_JOBS, { - variables: { - statuses: bodyshop.md_ro_statuses.active_statuses || ["Open"], - }, - skip: !modalProps.visible, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const jobsList = useQuery(QUERY_ALL_ACTIVE_JOBS, { + variables: { + statuses: bodyshop.md_ro_statuses.active_statuses || ["Open"], + }, + skip: !modalProps.open, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const modalSearch = modalSearchState[0]; + const modalSearch = modalSearchState[0]; - const jobsData = - jobsList.data && jobsList.data.jobs - ? modalSearch - ? jobsList.data.jobs.filter( - (j) => - (j.ro_number || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.status || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.clm_no || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(modalSearch.toLowerCase()) - ) - : jobsList.data.jobs - : null; + const jobsData = + jobsList.data && jobsList.data.jobs + ? modalSearch + ? jobsList.data.jobs.filter( + (j) => + (j.ro_number || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.status || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.clm_no || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) + ) + : jobsList.data.jobs + : null; - return ( - - {loading ? : null} - {error ? : null} - {true ? ( - - ) : null} - - ); + return ( + + {loading ? : null} + {error ? : null} + + + ); }); diff --git a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx index b5048d0ef..3b164466d 100644 --- a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -1,276 +1,282 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import axios from "axios"; import _ from "lodash"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import {pageLimit} from "../../utils/config"; +import useLocalStorage from "../../utils/useLocalStorage"; import StartChatButton from "../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; -import {pageLimit} from "../../utils/config"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function JobsList({ bodyshop, refetch, loading, jobs, total }) { - const search = queryString.parse(useLocation().search); - const [openSearchResults, setOpenSearchResults] = useState([]); - const [searchLoading, setSearchLoading] = useState(false); - const { page, sortcolumn, sortorder } = search; - const history = useHistory(); +export function JobsList({bodyshop, refetch, loading, jobs, total}) { + const search = queryString.parse(useLocation().search); + const [openSearchResults, setOpenSearchResults] = useState([]); + const [searchLoading, setSearchLoading] = useState(false); + const [filter, setFilter] = useLocalStorage("filter_jobs_all", null); + const {page, sortcolumn, sortorder} = search; + const history = useNavigate(); - const { t } = useTranslation(); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: true, //(a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: sortcolumn === "ro_number" && sortorder, - render: (text, record) => ( - - {record.ro_number || t("general.labels.na")} - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "ownr_ln", - key: "ownr_ln", - ellipsis: true, - //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + const {t} = useTranslation(); + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: true, //(a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: sortcolumn === "ro_number" && sortorder, + render: (text, record) => ( + + {record.ro_number || t("general.labels.na")} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "ownr_ln", + key: "ownr_ln", + ellipsis: true, + //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - //sortOrder: sortcolumn === "ownr_ln" && sortorder, - render: (text, record) => { - return record.ownerid ? ( - - - - ) : ( - - + //sortOrder: sortcolumn === "ownr_ln" && sortorder, + render: (text, record) => { + return record.ownerid ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", + ); + }, + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", - ellipsis: true, - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", + ellipsis: true, + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", - ellipsis: true, - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", + ellipsis: true, + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", - ellipsis: true, - sorter: true, // (a, b) => alphaSort(a.status, b.status), - sortOrder: sortcolumn === "status" && sortorder, - render: (text, record) => { - return record.status || t("general.labels.na"); - }, - filters: bodyshop.md_ro_statuses.statuses.map((s) => { - return { text: s, value: [s] }; - }), - onFilter: (value, record) => value.includes(record.status), - }, + ellipsis: true, + sorter: true, // (a, b) => alphaSort(a.status, b.status), + sortOrder: sortcolumn === "status" && sortorder, + render: (text, record) => { + return record.status || t("general.labels.na"); + }, + filteredValue: filter?.status || null, + filters: bodyshop.md_ro_statuses.statuses.map((s) => { + return {text: s, value: [s]}; + }), + onFilter: (value, record) => value.includes(record.status), + }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ) : ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ); - }, - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate_no", - key: "plate_no", - ellipsis: true, - sorter: true, //(a, b) => alphaSort(a.plate_no, b.plate_no), - sortOrder: sortcolumn === "plate_no" && sortorder, - render: (text, record) => { - return record.plate_no ? record.plate_no : ""; - }, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - sorter: true, //(a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: sortcolumn === "clm_no" && sortorder, - render: (text, record) => - `${record.clm_no || ""}${ - record.po_number ? ` (PO: ${record.po_number})` : "" - }`, - }, - { - title: t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - ellipsis: true, - }, - { - title: t("jobs.fields.clm_total"), - dataIndex: "clm_total", - key: "clm_total", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + ellipsis: true, + sorter: true, //(a, b) => alphaSort(a.plate_no, b.plate_no), + sortOrder: sortcolumn === "plate_no" && sortorder, + render: (text, record) => { + return record.plate_no ? record.plate_no : ""; + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: true, //(a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: sortcolumn === "clm_no" && sortorder, + render: (text, record) => + `${record.clm_no || ""}${ + record.po_number ? ` (PO: ${record.po_number})` : "" + }`, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + }, + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", - sorter: true, //(a, b) => a.clm_total - b.clm_total, - sortOrder: sortcolumn === "clm_total" && sortorder, - render: (text, record) => { - return record.clm_total ? ( - {record.clm_total} - ) : ( - t("general.labels.unknown") - ); - }, - }, - { - title: t("jobs.fields.owner_owing"), - dataIndex: "owner_owing", - key: "owner_owing", + sorter: true, //(a, b) => a.clm_total - b.clm_total, + sortOrder: sortcolumn === "clm_total" && sortorder, + render: (text, record) => { + return record.clm_total ? ( + {record.clm_total} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.owner_owing"), + dataIndex: "owner_owing", + key: "owner_owing", - render: (text, record) => ( - {record.owner_owing} - ), - }, - { - title: t("jobs.fields.comment"), - dataIndex: "comment", - key: "comment", - ellipsis: true, - }, - ]; + render: (text, record) => ( + {record.owner_owing} + ), + }, + { + title: t("jobs.fields.comment"), + dataIndex: "comment", + key: "comment", + ellipsis: true, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - search.page = pagination.current; - search.sortcolumn = sorter.column && sorter.column.key; - search.sortorder = sorter.order; - if (filters.status) { - search.statusFilters = JSON.stringify(_.flattenDeep(filters.status)); - } else { - delete search.statusFilters; - } - history.push({ search: queryString.stringify(search) }); - }; - - useEffect(() => { - if (search.search && search.search.trim() !== "") { - searchJobs(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - async function searchJobs(value) { - try { - setSearchLoading(true); - const searchData = await axios.post("/search", { - search: value || search.search, - index: "jobs", - }); - setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); - } catch (error) { - console.log("Error while fetching search results", error); - } finally { - setSearchLoading(false); - } - } - - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - - - )} - - { - search.search = value; - history.push({ search: queryString.stringify(search) }); - searchJobs(value); - }} - loading={loading || searchLoading} - enterButton - /> - - } - > -
{ + search.page = pagination.current; + search.sortcolumn = sorter.column && sorter.column.key; + search.sortorder = sorter.order; + if (filters.status) { + search.statusFilters = JSON.stringify(_.flattenDeep(filters.status)); + } else { + delete search.statusFilters; } - columns={columns} - rowKey="id" - dataSource={search?.search ? openSearchResults : jobs} - onChange={handleTableChange} - /> - - ); + setFilter(filters); + history({search: queryString.stringify(search)}); + }; + + useEffect(() => { + if (search.search && search.search.trim() !== "") { + searchJobs(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function searchJobs(value) { + try { + setSearchLoading(true); + const searchData = await axios.post("/search", { + search: value || search.search, + index: "jobs", + }); + setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); + } catch (error) { + console.log("Error while fetching search results", error); + } finally { + setSearchLoading(false); + } + } + + return ( + + {search.search && ( + <> + + {t("general.labels.searchresults", {search: search.search})} + + + + )} + + { + search.search = value; + history({search: queryString.stringify(search)}); + searchJobs(value); + }} + loading={loading || searchLoading} + enterButton + /> + + } + > +
+ + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsList); diff --git a/client/src/components/jobs-list/jobs-list.component.jsx b/client/src/components/jobs-list/jobs-list.component.jsx index fb2e1daa6..e5b708fed 100644 --- a/client/src/components/jobs-list/jobs-list.component.jsx +++ b/client/src/components/jobs-list/jobs-list.component.jsx @@ -1,22 +1,18 @@ -import { - SyncOutlined, - ExclamationCircleFilled, - PauseCircleOutlined, - BranchesOutlined, -} from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Grid, Input, Space, Table, Tooltip } from "antd"; +import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined, SyncOutlined,} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Grid, Input, Space, Table, Tooltip} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { onlyUnique } from "../../utils/arrayHelper"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ALL_ACTIVE_JOBS} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {onlyUnique} from "../../utils/arrayHelper"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort } from "../../utils/sorters"; +import {alphaSort, statusSort} from "../../utils/sorters"; +import useLocalStorage from "../../utils/useLocalStorage"; import AlertComponent from "../alert/alert.component"; import ChatOpenButton from "../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; @@ -25,13 +21,13 @@ const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, }); -export function JobsList({ bodyshop }) { +export function JobsList({bodyshop}) { const searchParams = queryString.parse(useLocation().search); - const { selected } = searchParams; + const {selected} = searchParams; const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) .filter((screen) => !!screen[1]) .slice(-1)[0]; - const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { + const {loading, error, data, refetch} = useQuery(QUERY_ALL_ACTIVE_JOBS, { variables: { statuses: bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"], }, @@ -39,16 +35,14 @@ export function JobsList({ bodyshop }) { nextFetchPolicy: "network-only", }); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + const [state, setState] = useState({sortedInfo: {}}); + const [filter, setFilter] = useLocalStorage("filter_jobs_list", null); - const { t } = useTranslation(); - const history = useHistory(); + const {t} = useTranslation(); + const history = useNavigate(); const [searchText, setSearchText] = useState(""); - if (error) return ; + if (error) return ; const jobs = data ? searchText === "" @@ -91,13 +85,14 @@ export function JobsList({ bodyshop }) { : []; const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + setState({...state, sortedInfo: sorter}); + setFilter(filters); }; const handleOnRowClick = (record) => { if (record) { if (record.id) { - history.push({ + history({ search: queryString.stringify({ ...searchParams, selected: record.id, @@ -126,14 +121,14 @@ export function JobsList({ bodyshop }) { {record.ro_number || t("general.labels.na")} {record.production_vars && record.production_vars.alert ? ( - + ) : null} {record.suspended && ( - + )} {record.iouparent && ( - + )} @@ -156,11 +151,11 @@ export function JobsList({ bodyshop }) { to={"/manage/owners/" + record.ownerid} onClick={(e) => e.stopPropagation()} > - + ) : ( - + ); }, @@ -172,7 +167,7 @@ export function JobsList({ bodyshop }) { ellipsis: true, responsive: ["md"], render: (text, record) => ( - + ), }, { @@ -182,7 +177,7 @@ export function JobsList({ bodyshop }) { ellipsis: true, responsive: ["md"], render: (text, record) => ( - + ), }, @@ -195,6 +190,7 @@ export function JobsList({ bodyshop }) { sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filteredValue: filter?.status || null, filters: (jobs && jobs @@ -205,7 +201,14 @@ export function JobsList({ bodyshop }) { text: s || "No Status*", value: [s], }; - })) || + }) + .sort((a, b) => + statusSort( + a.text, + b.text, + bodyshop.md_ro_statuses.active_statuses + ) + )) || [], onFilter: (value, record) => value.includes(record.status), }, @@ -262,6 +265,7 @@ export function JobsList({ bodyshop }) { dataIndex: "ins_co_nm", key: "ins_co_nm", ellipsis: true, + filteredValue: filter?.ins_co_nm || null, filters: (jobs && jobs @@ -269,10 +273,11 @@ export function JobsList({ bodyshop }) { .filter(onlyUnique) .map((s) => { return { - text: s, + text: s || "No Ins. Co.*", value: [s], }; - })) || + }) + .sort((a, b) => alphaSort(a.text, b.text))) || [], onFilter: (value, record) => value.includes(record.ins_co_nm), responsive: ["md"], @@ -298,6 +303,7 @@ export function JobsList({ bodyshop }) { ellipsis: true, responsive: ["xl"], filterSearch: true, + filteredValue: filter?.estimator || null, filters: (jobs && jobs @@ -305,10 +311,11 @@ export function JobsList({ bodyshop }) { .filter(onlyUnique) .map((s) => { return { - text: s || "N/A", + text: s || "No Estimator*", value: [s], }; - })) || + }) + .sort((a, b) => alphaSort(a.text, b.text))) || [], onFilter: (value, record) => value.includes( @@ -350,7 +357,7 @@ export function JobsList({ bodyshop }) { extra={
{ - const newPartRates = _.cloneDeep(form.getFieldValue("parts_tax_rates")); + const handleConfirm = () => { + const newPartRates = _.cloneDeep(form.getFieldValue("parts_tax_rates")); - Object.keys(newPartRates).forEach((key) => { - newPartRates[key] = { - ...newPartRates[key], - prt_tax_in: false, - prt_tax_rt: 0, - }; - }); + Object.keys(newPartRates).forEach((key) => { + newPartRates[key] = { + ...newPartRates[key], + prt_tax_in: false, + prt_tax_rt: 0, + }; + }); - form.setFieldsValue({ - state_tax_rate: 0, - tax_lbr_rt: 0, - tax_levies_rt: 0, - tax_sub_rt: 0, - tax_shop_mat_rt: 0, - tax_paint_mat_rt: 0, - tax_str_rt: 0, - tax_tow_rt: 0, - parts_tax_rates: newPartRates, - }); - }; + form.setFieldsValue({ + state_tax_rate: 0, + tax_lbr_rt: 0, + tax_levies_rt: 0, + tax_sub_rt: 0, + tax_shop_mat_rt: 0, + tax_paint_mat_rt: 0, + tax_str_rt: 0, + tax_tow_rt: 0, + parts_tax_rates: newPartRates, + }); + }; - return ( - - - - ); + return ( + + + + ); } + export default connect(mapStateToProps, null)(JobsMarkPstExempt); diff --git a/client/src/components/jobs-notes/jobs-notes.container.jsx b/client/src/components/jobs-notes/jobs-notes.container.jsx index f62a219cb..763f869ff 100644 --- a/client/src/components/jobs-notes/jobs-notes.container.jsx +++ b/client/src/components/jobs-notes/jobs-notes.container.jsx @@ -1,73 +1,70 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { notification } from "antd"; -import React, { useState } from "react"; +import {useMutation, useQuery} from "@apollo/client"; +import {notification} from "antd"; +import React, {useState} from "react"; //import SpinComponent from "../../components/loading-spinner/loading-spinner.component"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - DELETE_NOTE, - QUERY_NOTES_BY_JOB_PK, -} from "../../graphql/notes.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {DELETE_NOTE, QUERY_NOTES_BY_JOB_PK,} from "../../graphql/notes.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import JobNotesComponent from "./jobs.notes.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect(mapStateToProps, mapDispatchToProps)(JobNotesContainer); -export function JobNotesContainer({ jobId, insertAuditTrail }) { - const { loading, error, data, refetch } = useQuery(QUERY_NOTES_BY_JOB_PK, { - variables: { id: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const [deleteNote] = useMutation(DELETE_NOTE); - const { t } = useTranslation(); - const [deleteLoading, setDeleteLoading] = useState(false); - const handleNoteDelete = (id) => { - logImEXEvent("job_note_delete"); - setDeleteLoading(true); - deleteNote({ - variables: { - noteId: id, - }, - }).then((r) => { - refetch(); - notification["success"]({ - message: t("notes.successes.deleted"), - }); - insertAuditTrail({ - jobid: jobId, - operation: AuditTrailMapping.jobnotedeleted(), - }); +export function JobNotesContainer({jobId, insertAuditTrail}) { + const {loading, error, data, refetch} = useQuery(QUERY_NOTES_BY_JOB_PK, { + variables: {id: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - setDeleteLoading(false); - }; - //if (loading) return ; - if (error) return ; - return ( - - ); + const [deleteNote] = useMutation(DELETE_NOTE); + const {t} = useTranslation(); + const [deleteLoading, setDeleteLoading] = useState(false); + const handleNoteDelete = (id) => { + logImEXEvent("job_note_delete"); + setDeleteLoading(true); + deleteNote({ + variables: { + noteId: id, + }, + }).then((r) => { + refetch(); + notification["success"]({ + message: t("notes.successes.deleted"), + }); + insertAuditTrail({ + jobid: jobId, + operation: AuditTrailMapping.jobnotedeleted(), + }); + }); + setDeleteLoading(false); + }; + + //if (loading) return ; + if (error) return ; + return ( + + ); } diff --git a/client/src/components/jobs-notes/jobs.notes.component.jsx b/client/src/components/jobs-notes/jobs.notes.component.jsx index c47dec740..51196f4f2 100644 --- a/client/src/components/jobs-notes/jobs.notes.component.jsx +++ b/client/src/components/jobs-notes/jobs.notes.component.jsx @@ -1,215 +1,210 @@ -import { - AuditOutlined, - DeleteFilled, - EditFilled, - EyeInvisibleFilled, - WarningFilled, -} from "@ant-design/icons"; -import { Button, Card, Form, Input, Space, Table } from "antd"; +import {AuditOutlined, DeleteFilled, EditFilled, EyeInvisibleFilled, WarningFilled,} from "@ant-design/icons"; +import {Button, Card, Form, Input, Space, Table} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; +import {TemplateList} from "../../utils/TemplateConstants"; import useLocalStorage from "../../utils/useLocalStorage"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import NoteUpsertModal from "../note-upsert-modal/note-upsert-modal.container"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - setNoteUpsertContext: (context) => - dispatch(setModalContext({ context: context, modal: "noteUpsert" })), + setNoteUpsertContext: (context) => + dispatch(setModalContext({context: context, modal: "noteUpsert"})), }); export function JobNotesComponent({ - jobRO, - loading, - data, - refetch, - handleNoteDelete, - jobId, - setNoteUpsertContext, - deleteLoading, - ro_number, - relatedRos, -}) { - const { t } = useTranslation(); - const [filter, setFilter] = useLocalStorage("filter_job_notes_icons", null); + jobRO, + loading, + data, + refetch, + handleNoteDelete, + jobId, + setNoteUpsertContext, + deleteLoading, + ro_number, + relatedRos, + }) { + const {t} = useTranslation(); + const [filter, setFilter] = useLocalStorage("filter_job_notes_icons", null); - const Templates = TemplateList("job_special", { - ro_number, - }); + const Templates = TemplateList("job_special", { + ro_number, + }); - const columns = [ - { - title: "", - dataIndex: "icons", - key: "icons", - width: 80, - filteredValue: filter?.icons || null, - filters: [ + const columns = [ { - text: t("notes.labels.usernotes"), - value: false, - }, - { - text: t("notes.labels.systemnotes"), - value: true, - }, - ], - onFilter: (value, record) => record.audit === value, - render: (text, record) => ( - + title: "", + dataIndex: "icons", + key: "icons", + width: 80, + filteredValue: filter?.icons || null, + filters: [ + { + text: t("notes.labels.usernotes"), + value: false, + }, + { + text: t("notes.labels.systemnotes"), + value: true, + }, + ], + onFilter: (value, record) => record.audit === value, + render: (text, record) => ( + {record.critical ? ( - + ) : null} - {record.private ? : null} - {record.audit ? : null} + {record.private ? : null} + {record.audit ? : null} - ), - }, - { - title: t("notes.fields.type"), - dataIndex: "type", - key: "type", - width: 120, - filteredValue: filter?.type || null, - filters: [ - { value: "general", text: t("notes.fields.types.general") }, - { value: "customer", text: t("notes.fields.types.customer") }, - { value: "shop", text: t("notes.fields.types.shop") }, - { value: "office", text: t("notes.fields.types.office") }, - { value: "parts", text: t("notes.fields.types.parts") }, - { value: "paint", text: t("notes.fields.types.paint") }, - { - value: "supplement", - text: t("notes.fields.types.supplement"), + ), }, - ], - onFilter: (value, record) => value.includes(record.type), - render: (text, record) => t(`notes.fields.types.${record.type}`), - }, - { - title: t("notes.fields.text"), - dataIndex: "text", - key: "text", - ellipsis: true, - render: (text, record) => ( - {text} - ), - }, - - { - title: t("notes.fields.updatedat"), - dataIndex: "updated_at", - key: "updated_at", - defaultSortOrder: "descend", - width: 200, - sorter: (a, b) => new Date(a.updated_at) - new Date(b.updated_at), - render: (text, record) => ( - {record.updated_at} - ), - }, - { - title: t("notes.fields.createdby"), - dataIndex: "created_by", - key: "created_by", - width: 200, - }, - { - title: t("notes.actions.actions"), - dataIndex: "actions", - key: "actions", - width: 200, - render: (text, record) => ( - - - - value.includes(record.type), + render: (text, record) => t(`notes.fields.types.${record.type}`), + }, + { + title: t("notes.fields.text"), + dataIndex: "text", + key: "text", + ellipsis: true, + render: (text, record) => ( + {text} + ), + }, - variables: { id: record.id }, - }} - messageObject={{ - subject: Templates.individual_job_note.subject, - }} - id={jobId} - /> - - ), - }, - ]; + { + title: t("notes.fields.updatedat"), + dataIndex: "updated_at", + key: "updated_at", + defaultSortOrder: "descend", + width: 200, + sorter: (a, b) => new Date(a.updated_at) - new Date(b.updated_at), + render: (text, record) => ( + {record.updated_at} + ), + }, + { + title: t("notes.fields.createdby"), + dataIndex: "created_by", + key: "created_by", + width: 200, + }, + { + title: t("notes.actions.actions"), + dataIndex: "actions", + key: "actions", + width: 200, + render: (text, record) => ( + + + + { - setFilter(filters); - }; + variables: {id: record.id}, + }} + messageObject={{ + subject: Templates.individual_job_note.subject, + }} + id={jobId} + /> + + ), + }, + ]; - return ( -
- - - - - - { - setNoteUpsertContext({ - actions: { refetch: refetch }, - context: { - jobId: jobId, - relatedRos: relatedRos, - }, - }); - }} - > - {t("notes.actions.new")} - - } - > - + const handleTableChange = (pagination, filters, sorter) => { + setFilter(filters); + }; -
- - - ); + return ( +
+ + + + + + { + setNoteUpsertContext({ + actions: {refetch: refetch}, + context: { + jobId: jobId, + relatedRos: relatedRos, + }, + }); + }} + > + {t("notes.actions.new")} + + } + > + + +
+ + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobNotesComponent); diff --git a/client/src/components/jobs-ready-list/jobs-ready-list.component.jsx b/client/src/components/jobs-ready-list/jobs-ready-list.component.jsx index fee461df2..1862cf300 100644 --- a/client/src/components/jobs-ready-list/jobs-ready-list.component.jsx +++ b/client/src/components/jobs-ready-list/jobs-ready-list.component.jsx @@ -1,408 +1,409 @@ -import { - BranchesOutlined, - ExclamationCircleFilled, - PauseCircleOutlined, - SyncOutlined, -} from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Grid, Input, Space, Table, Tooltip } from "antd"; +import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined, SyncOutlined,} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Grid, Input, Space, Table, Tooltip} from "antd"; import queryString from "query-string"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ALL_ACTIVE_JOBS} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort } from "../../utils/sorters"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {pageLimit} from "../../utils/config"; +import {alphaSort, statusSort} from "../../utils/sorters"; +import useLocalStorage from "../../utils/useLocalStorage"; import AlertComponent from "../alert/alert.component"; import ChatOpenButton from "../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; -import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function JobsReadyList({ bodyshop }) { - const searchParams = queryString.parse(useLocation().search); - const { selected } = searchParams; - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; +export function JobsReadyList({bodyshop}) { + const searchParams = queryString.parse(useLocation().search); + const {selected} = searchParams; + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const readyStatuses = useMemo(() => { - if (bodyshop.md_ro_statuses.ready_statuses) - return bodyshop.md_ro_statuses.ready_statuses; + const readyStatuses = useMemo(() => { + if (bodyshop.md_ro_statuses.ready_statuses) + return bodyshop.md_ro_statuses.ready_statuses; - return bodyshop.md_ro_statuses.post_production_statuses.filter( - (s) => - s !== bodyshop.md_ro_statuses.default_invoiced && - s !== bodyshop.md_ro_statuses.default_exported - ); - }, [bodyshop.md_ro_statuses]); + return bodyshop.md_ro_statuses.post_production_statuses.filter( + (s) => + s !== bodyshop.md_ro_statuses.default_invoiced && + s !== bodyshop.md_ro_statuses.default_exported + ); + }, [bodyshop.md_ro_statuses]); - const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { - variables: { - statuses: readyStatuses, - isConverted: true, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data, refetch} = useQuery(QUERY_ALL_ACTIVE_JOBS, { + variables: { + statuses: readyStatuses, + isConverted: true, + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + const [state, setState] = useState({sortedInfo: {}}); + const [filter, setFilter] = useLocalStorage("filter_jobs_ready", null); - const { t } = useTranslation(); - const history = useHistory(); - const [searchText, setSearchText] = useState(""); + const {t} = useTranslation(); + const history = useNavigate(); + const [searchText, setSearchText] = useState(""); - if (error) return ; + if (error) return ; - const jobs = data - ? searchText === "" - ? data.jobs - : data.jobs.filter( - (j) => - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_co_nm || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.comments || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.est_ct_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.est_ct_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : []; + const jobs = data + ? searchText === "" + ? data.jobs + : data.jobs.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.comments || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.est_ct_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.est_ct_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, sortedInfo: sorter}); + setFilter(filters); + }; - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - history.push({ - search: queryString.stringify({ - ...searchParams, - selected: record.id, - }), - }); - } - } - }; + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + history({ + search: queryString.stringify({ + ...searchParams, + selected: record.id, + }), + }); + } + } + }; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - - render: (text, record) => ( - e.stopPropagation()} - > - - {record.ro_number || t("general.labels.na")} - {record.production_vars && record.production_vars.alert ? ( - - ) : null} - {record.suspended && ( - - )} - {record.iouparent && ( - - - - )} - - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - - responsive: ["md"], - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - render: (text, record) => { - return record.owner ? ( - e.stopPropagation()} - > - - - ) : ( - - + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + e.stopPropagation()} + > + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && ( + + )} + {record.iouparent && ( + + + + )} + + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + responsive: ["md"], + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => { + return record.owner ? ( + e.stopPropagation()} + > + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - ellipsis: true, - responsive: ["md"], - render: (text, record) => ( - - ), - }, - - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - ellipsis: true, - - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - filters: - (jobs && - jobs - .map((j) => j.status) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "No Status*", - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.status), - }, - - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - e.stopPropagation()} - > - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ) : ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ); - }, - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate_no", - key: "plate_no", - ellipsis: true, - - responsive: ["md"], - sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), - sortOrder: - state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - responsive: ["md"], - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - render: (text, record) => - `${record.clm_no || ""}${ - record.po_number ? ` (PO: ${record.po_number})` : "" - }`, - }, - { - title: t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - ellipsis: true, - filters: - (jobs && - jobs - .map((j) => j.ins_co_nm) - .filter(onlyUnique) - .map((s) => { - return { - text: s, - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.ins_co_nm), - responsive: ["md"], - }, - { - title: t("jobs.fields.clm_total"), - dataIndex: "clm_total", - key: "clm_total", - responsive: ["md"], - ellipsis: true, - - sorter: (a, b) => a.clm_total - b.clm_total, - sortOrder: - state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, - render: (text, record) => ( - {record.clm_total} - ), - }, - { - title: t("jobs.labels.estimator"), - dataIndex: "jobs.labels.estimator", - key: "jobs.labels.estimator", - ellipsis: true, - responsive: ["xl"], - filterSearch: true, - filters: - (jobs && - jobs - .map((j) => `${j.est_ct_fn || ""} ${j.est_ct_ln || ""}`.trim()) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "N/A", - value: [s], - }; - })) || - [], - onFilter: (value, record) => - value.includes( - `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim() - ), - render: (text, record) => - `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim(), - }, - { - title: t("jobs.fields.comment"), - dataIndex: "comment", - key: "comment", - ellipsis: true, - responsive: ["md"], - }, - // { - // title: t("jobs.fields.owner_owing"), - // dataIndex: "owner_owing", - // key: "owner_owing", - // responsive: ["md"], - // render: (text, record) => ( - // {record.owner_owing} - // ), - // }, - ]; - - const scrollMapper = { - xs: true, - sm: true, - md: true, - lg: "100%", - xl: "100%", - xxl: "100%", - }; - - return ( - - ({readyStatuses && readyStatuses.join(", ")}) - - { - setSearchText(e.target.value); - }} - value={searchText} - enterButton - /> - - } - > -
{ - handleOnRowClick(record); - }, - selectedRowKeys: [selected], - type: "radio", - }} - onChange={handleTableChange} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); + ); }, - }; - }} - /> - - ); + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + ellipsis: true, + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filteredValue: filter?.status || null, + filters: + (jobs && + jobs + .map((j) => j.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + }) + .sort((a, b) => + statusSort( + a.text, + b.text, + bodyshop.md_ro_statuses.active_statuses + ) + )) || + [], + onFilter: (value, record) => value.includes(record.status), + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()} + > + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + ellipsis: true, + + responsive: ["md"], + sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), + sortOrder: + state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + responsive: ["md"], + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + render: (text, record) => + `${record.clm_no || ""}${ + record.po_number ? ` (PO: ${record.po_number})` : "" + }`, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + filteredValue: filter?.ins_co_nm || null, + filters: + (jobs && + jobs + .map((j) => j.ins_co_nm) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Ins Co.*", + value: [s], + }; + }) + .sort((a, b) => alphaSort(a.text, b.text))) || + [], + onFilter: (value, record) => value.includes(record.ins_co_nm), + responsive: ["md"], + }, + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + responsive: ["md"], + ellipsis: true, + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, + render: (text, record) => ( + {record.clm_total} + ), + }, + { + title: t("jobs.labels.estimator"), + dataIndex: "jobs.labels.estimator", + key: "estimator", + ellipsis: true, + responsive: ["xl"], + filteredValue: filter?.estimator || null, + filterSearch: true, + filters: + (jobs && + jobs + .map((j) => `${j.est_ct_fn || ""} ${j.est_ct_ln || ""}`.trim()) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Estimator*", + value: [s], + }; + }) + .sort((a, b) => alphaSort(a.text, b.text))) || + [], + onFilter: (value, record) => + value.includes( + `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim() + ), + render: (text, record) => + `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim(), + }, + { + title: t("jobs.fields.comment"), + dataIndex: "comment", + key: "comment", + ellipsis: true, + responsive: ["md"], + }, + // { + // title: t("jobs.fields.owner_owing"), + // dataIndex: "owner_owing", + // key: "owner_owing", + // responsive: ["md"], + // render: (text, record) => ( + // {record.owner_owing} + // ), + // }, + ]; + + const scrollMapper = { + xs: true, + sm: true, + md: true, + lg: "100%", + xl: "100%", + xxl: "100%", + }; + + return ( + + ({readyStatuses && readyStatuses.join(", ")}) + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> + + } + > +
{ + handleOnRowClick(record); + }, + selectedRowKeys: [selected], + type: "radio", + }} + onChange={handleTableChange} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + ); } export default connect(mapStateToProps, null)(JobsReadyList); diff --git a/client/src/components/jobs-related-ros/jobs-related-ros.component.jsx b/client/src/components/jobs-related-ros/jobs-related-ros.component.jsx index 9f1a3b5b9..1d77bebc8 100644 --- a/client/src/components/jobs-related-ros/jobs-related-ros.component.jsx +++ b/client/src/components/jobs-related-ros/jobs-related-ros.component.jsx @@ -1,20 +1,26 @@ -import { Space, Tag } from "antd"; +import {Space, Tag} from "antd"; import React from "react"; -import { Link } from "react-router-dom"; +import {Link} from "react-router-dom"; -export default function JobsRelatedRos({ jobid, job }) { - if (!(job && job.vehicle && job.vehicle.jobs)) return null; - return ( - - {job.vehicle.jobs - .filter((j) => j.id !== job.id) - .map((j) => ( - - {`${j.ro_number || "N/A"}${ - j.clm_no ? ` | ${j.clm_no}` : "" - }${j.status ? ` | ${j.status}` : ""}`} - - ))} - - ); +export default function JobsRelatedRos({jobid, job, disabled}) { + if (!(job && job.vehicle && job.vehicle.jobs)) return null; + return ( + + {job.vehicle.jobs + .filter((j) => j.id !== job.id) + .map((j) => ( + + {disabled ? ( + <>{`${j.ro_number || "N/A"}${j.clm_no ? ` | ${j.clm_no}` : ""}${ + j.status ? ` | ${j.status}` : "" + }`} + ) : ( + {`${j.ro_number || "N/A"}${ + j.clm_no ? ` | ${j.clm_no}` : "" + }${j.status ? ` | ${j.status}` : ""}`} + )} + + ))} + + ); } diff --git a/client/src/components/labor-allocations-adjustment-edit/labor-allocations-adjustment-edit.component.jsx b/client/src/components/labor-allocations-adjustment-edit/labor-allocations-adjustment-edit.component.jsx index 5d5a56d2c..b75f284a4 100644 --- a/client/src/components/labor-allocations-adjustment-edit/labor-allocations-adjustment-edit.component.jsx +++ b/client/src/components/labor-allocations-adjustment-edit/labor-allocations-adjustment-edit.component.jsx @@ -1,182 +1,175 @@ -import { useMutation } from "@apollo/client"; -import { - Button, - Card, - Form, - InputNumber, - notification, - Popover, - Select, -} from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Form, InputNumber, notification, Popover, Select,} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(LaborAllocationsAdjustmentEdit); export function LaborAllocationsAdjustmentEdit({ - insertAuditTrail, - jobId, - mod_lbr_ty, - adjustments, - children, - refetchQueryNames, -}) { - const [loading, setLoading] = useState(false); - const [visible, setVisible] = useState(false); - const [updateAdjustments] = useMutation(UPDATE_JOB); - const [form] = Form.useForm(); + insertAuditTrail, + jobId, + mod_lbr_ty, + adjustments, + children, + refetchQueryNames, + }) { + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); + const [updateAdjustments] = useMutation(UPDATE_JOB); + const [form] = Form.useForm(); - const { t } = useTranslation(); + const {t} = useTranslation(); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateAdjustments({ - variables: { - jobId: jobId, - job: { - lbr_adjustments: { - ...adjustments, - [values.mod_lbr_ty]: values.hours, - }, - }, - }, - ...(refetchQueryNames ? { refetchQueries: refetchQueryNames } : {}), - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateAdjustments({ + variables: { + jobId: jobId, + job: { + lbr_adjustments: { + ...adjustments, + [values.mod_lbr_ty]: values.hours, + }, + }, + }, + ...(refetchQueryNames ? {refetchQueries: refetchQueryNames} : {}), + }); - if (!!result.errors) { - notification["error"]({ - message: t("jobs.errors.saving", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("jobs.successes.save"), - }); - insertAuditTrail({ - jobid: jobId, - operation: AuditTrailMapping.jobmodifylbradj({ - mod_lbr_ty: values.mod_lbr_ty, - hours: - values.hours - - ((adjustments && adjustments[mod_lbr_ty]) || 0).toFixed(1), - }), - }); - } - setLoading(false); - setVisible(false); - }; + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("jobs.successes.save"), + }); + insertAuditTrail({ + jobid: jobId, + operation: AuditTrailMapping.jobmodifylbradj({ + mod_lbr_ty: values.mod_lbr_ty, + hours: + values.hours - + ((adjustments && adjustments[mod_lbr_ty]) || 0).toFixed(1), + }), + }); + } + setLoading(false); + setOpen(false); + }; - const overlay = ( - -
-
+
+ + + + + + + + + +
+ + ); + + return ( + setOpen(vis)} + content={overlay} + trigger="click" > - - - - - - - - -
-
- ); - - return ( - setVisible(vis)} - content={overlay} - trigger="click" - > - {children} - - ); + {children} + + ); } diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx index 83f99d867..4a4828d23 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx +++ b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx @@ -1,266 +1,268 @@ -import { EditFilled } from "@ant-design/icons"; -import { Card, Col, Row, Space, Table, Typography } from "antd"; +import {EditFilled} from "@ant-design/icons"; +import {Card, Col, Row, Space, Table, Typography} from "antd"; import _ from "lodash"; -import React, { useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect, useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort } from "../../utils/sorters"; -import LaborAllocationsAdjustmentEdit from "../labor-allocations-adjustment-edit/labor-allocations-adjustment-edit.component"; +import {alphaSort} from "../../utils/sorters"; +import LaborAllocationsAdjustmentEdit + from "../labor-allocations-adjustment-edit/labor-allocations-adjustment-edit.component"; import "./labor-allocations-table.styles.scss"; -import { CalculateAllocationsTotals } from "./labor-allocations-table.utility"; +import {CalculateAllocationsTotals} from "./labor-allocations-table.utility"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); export function LaborAllocationsTable({ - jobId, - joblines, - timetickets, - bodyshop, - adjustments, - technician, -}) { - const { t } = useTranslation(); - const [totals, setTotals] = useState([]); - const [state, setState] = useState({ - sortedInfo: { - columnKey: "cost_center", - field: "cost_center", - order: "ascend", - }, - filteredInfo: {}, - }); + jobId, + joblines, + timetickets, + bodyshop, + adjustments, + technician, + }) { + const {t} = useTranslation(); + const [totals, setTotals] = useState([]); + const [state, setState] = useState({ + sortedInfo: { + columnKey: "cost_center", + field: "cost_center", + order: "ascend", + }, + filteredInfo: {}, + }); - useEffect(() => { - if (!!joblines && !!timetickets && !!bodyshop); - setTotals( - CalculateAllocationsTotals(bodyshop, joblines, timetickets, adjustments) - ); - if (!jobId) setTotals([]); - }, [joblines, timetickets, bodyshop, adjustments, jobId]); + useEffect(() => { + if (!!joblines && !!timetickets && !!bodyshop) ; + setTotals( + CalculateAllocationsTotals(bodyshop, joblines, timetickets, adjustments) + ); + if (!jobId) setTotals([]); + }, [joblines, timetickets, bodyshop, adjustments, jobId]); - const convertedLines = useMemo( - () => joblines && joblines.filter((j) => j.convertedtolbr), - [joblines] - ); - - const columns = [ - { - title: t("timetickets.fields.cost_center"), - dataIndex: "cost_center", - key: "cost_center", - defaultSortOrder: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, - render: (text, record) => `${record.cost_center} (${record.mod_lbr_ty})`, - }, - { - title: t("jobs.labels.hrs_total"), - dataIndex: "total", - key: "total", - sorter: (a, b) => a.total - b.total, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => record.total.toFixed(1), - }, - { - title: t("jobs.labels.hrs_claimed"), - dataIndex: "hrs_claimed", - key: "hrs_claimed", - sorter: (a, b) => a.claimed - b.claimed, - sortOrder: - state.sortedInfo.columnKey === "claimed" && state.sortedInfo.order, - render: (text, record) => record.claimed && record.claimed.toFixed(1), - }, - { - title: t("jobs.labels.adjustments"), - dataIndex: "adjustments", - key: "adjustments", - sorter: (a, b) => a.adjustments - b.adjustments, - sortOrder: - state.sortedInfo.columnKey === "adjustments" && state.sortedInfo.order, - render: (text, record) => ( - - {record.adjustments.toFixed(1)} - {!technician && ( - - - - )} - - ), - }, - { - title: t("jobs.labels.difference"), - dataIndex: "difference", - - key: "difference", - sorter: (a, b) => a.difference - b.difference, - sortOrder: - state.sortedInfo.columnKey === "difference" && state.sortedInfo.order, - render: (text, record) => ( - = 0 ? "green" : "red", - }} - > - {_.round(record.difference, 1)} - - ), - }, - ]; - const convertedTableCols = [ - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - ellipsis: true, - }, - { - title: t("joblines.fields.op_code_desc"), - dataIndex: "op_code_desc", - key: "op_code_desc", - ellipsis: true, - render: (text, record) => - `${record.op_code_desc || ""}${ - record.alt_partm ? ` ${record.alt_partm}` : "" - }`, - }, - - { - title: t("joblines.fields.act_price"), - dataIndex: "act_price", - key: "act_price", - ellipsis: true, - render: (text, record) => ( - <> - - {record.db_ref === "900510" || record.db_ref === "900511" - ? record.prt_dsmk_m - : record.act_price} - - {record.prt_dsmk_p && record.prt_dsmk_p !== 0 ? ( - {`(${record.prt_dsmk_p}%)`} - ) : ( - <> - )} - - ), - }, - { - title: t("joblines.fields.part_qty"), - dataIndex: "part_qty", - key: "part_qty", - }, - { - title: t("joblines.fields.mod_lbr_ty"), - dataIndex: "conv_mod_lbr_ty", - key: "conv_mod_lbr_ty", - render: (text, record) => - record.convertedtolbr_data && record.convertedtolbr_data.mod_lbr_ty, - }, - { - title: t("joblines.fields.mod_lb_hrs"), - dataIndex: "conv_mod_lb_hrs", - key: "conv_mod_lb_hrs", - render: (text, record) => - record.convertedtolbr_data && - record.convertedtolbr_data.mod_lb_hrs && - record.convertedtolbr_data.mod_lb_hrs.toFixed(1), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const summary = - totals && - totals.reduce( - (acc, val) => { - acc.hrs_total += val.total; - acc.hrs_claimed += val.claimed; - acc.adjustments += val.adjustments; - acc.difference += val.difference; - return acc; - }, - { hrs_total: 0, hrs_claimed: 0, adjustments: 0, difference: 0 } + const convertedLines = useMemo( + () => joblines && joblines.filter((j) => j.convertedtolbr), + [joblines] ); - return ( - - - -
`${record.cost_center} ${record.mod_lbr_ty}`} - pagination={false} - onChange={handleTableChange} - dataSource={totals} - scroll={{ - x: true, - }} - summary={() => ( - - - - {t("general.labels.totals")} - - - - {summary.hrs_total.toFixed(1)} - - - {summary.hrs_claimed.toFixed(1)} - - - {summary.adjustments.toFixed(1)} - - - alphaSort(a.cost_center, b.cost_center), + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + render: (text, record) => `${record.cost_center} (${record.mod_lbr_ty})`, + }, + { + title: t("jobs.labels.hrs_total"), + dataIndex: "total", + key: "total", + sorter: (a, b) => a.total - b.total, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => record.total.toFixed(1), + }, + { + title: t("jobs.labels.hrs_claimed"), + dataIndex: "hrs_claimed", + key: "hrs_claimed", + sorter: (a, b) => a.claimed - b.claimed, + sortOrder: + state.sortedInfo.columnKey === "claimed" && state.sortedInfo.order, + render: (text, record) => record.claimed && record.claimed.toFixed(1), + }, + { + title: t("jobs.labels.adjustments"), + dataIndex: "adjustments", + key: "adjustments", + sorter: (a, b) => a.adjustments - b.adjustments, + sortOrder: + state.sortedInfo.columnKey === "adjustments" && state.sortedInfo.order, + render: (text, record) => ( + + {record.adjustments.toFixed(1)} + {!technician && ( + + + + )} + + ), + }, + { + title: t("jobs.labels.difference"), + dataIndex: "difference", + + key: "difference", + sorter: (a, b) => a.difference - b.difference, + sortOrder: + state.sortedInfo.columnKey === "difference" && state.sortedInfo.order, + render: (text, record) => ( + = 0 ? "green" : "red", + color: record.difference >= 0 ? "green" : "red", }} - > - {summary.difference.toFixed(1)} - - - + > + {_.round(record.difference, 1)} + + ), + }, + ]; + const convertedTableCols = [ + { + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + ellipsis: true, + }, + { + title: t("joblines.fields.op_code_desc"), + dataIndex: "op_code_desc", + key: "op_code_desc", + ellipsis: true, + render: (text, record) => + `${record.op_code_desc || ""}${ + record.alt_partm ? ` ${record.alt_partm}` : "" + }`, + }, + + { + title: t("joblines.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + ellipsis: true, + render: (text, record) => ( + <> + + {record.db_ref === "900510" || record.db_ref === "900511" + ? record.prt_dsmk_m + : record.act_price} + + {record.prt_dsmk_p && record.prt_dsmk_p !== 0 ? ( + {`(${record.prt_dsmk_p}%)`} + ) : ( + <> + )} + + ), + }, + { + title: t("joblines.fields.part_qty"), + dataIndex: "part_qty", + key: "part_qty", + }, + { + title: t("joblines.fields.mod_lbr_ty"), + dataIndex: "conv_mod_lbr_ty", + key: "conv_mod_lbr_ty", + render: (text, record) => + record.convertedtolbr_data && record.convertedtolbr_data.mod_lbr_ty, + }, + { + title: t("joblines.fields.mod_lb_hrs"), + dataIndex: "conv_mod_lb_hrs", + key: "conv_mod_lb_hrs", + render: (text, record) => + record.convertedtolbr_data && + record.convertedtolbr_data.mod_lb_hrs && + record.convertedtolbr_data.mod_lb_hrs.toFixed(1), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + const summary = + totals && + totals.reduce( + (acc, val) => { + acc.hrs_total += val.total; + acc.hrs_claimed += val.claimed; + acc.adjustments += val.adjustments; + acc.difference += val.difference; + return acc; + }, + {hrs_total: 0, hrs_claimed: 0, adjustments: 0, difference: 0} + ); + + return ( + + + +
`${record.cost_center} ${record.mod_lbr_ty}`} + pagination={false} + onChange={handleTableChange} + dataSource={totals} + scroll={{ + x: true, + }} + summary={() => ( + + + + {t("general.labels.totals")} + + + + {summary.hrs_total.toFixed(1)} + + + {summary.hrs_claimed.toFixed(1)} + + + {summary.adjustments.toFixed(1)} + + + = 0 ? "green" : "red", + }} + > + {summary.difference.toFixed(1)} + + + + )} + /> + + + {convertedLines && convertedLines.length > 0 && ( + + +
+ + )} - /> - - - {convertedLines && convertedLines.length > 0 && ( - - -
- - - )} - - ); + + ); } + export default connect(mapStateToProps, null)(LaborAllocationsTable); diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.payroll.component.jsx b/client/src/components/labor-allocations-table/labor-allocations-table.payroll.component.jsx index 6bb247992..66bc490c3 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.payroll.component.jsx +++ b/client/src/components/labor-allocations-table/labor-allocations-table.payroll.component.jsx @@ -1,333 +1,325 @@ -import { - Button, - Card, - Col, - Row, - Space, - Table, - Typography, - notification, -} from "antd"; -import { SyncOutlined } from "@ant-design/icons"; +import {Button, Card, Col, notification, Row, Space, Table, Typography,} from "antd"; +import {SyncOutlined} from "@ant-design/icons"; import axios from "axios"; import _ from "lodash"; -import React, { useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect, useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import "./labor-allocations-table.styles.scss"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); export function PayrollLaborAllocationsTable({ - jobId, - joblines, - timetickets, - bodyshop, - adjustments, - technician, - refetch, -}) { - const { t } = useTranslation(); - const [totals, setTotals] = useState([]); - const [state, setState] = useState({ - sortedInfo: { - columnKey: "cost_center", - field: "cost_center", - order: "ascend", - }, - filteredInfo: {}, - }); + jobId, + joblines, + timetickets, + bodyshop, + adjustments, + technician, + refetch, + }) { + const {t} = useTranslation(); + const [totals, setTotals] = useState([]); + const [state, setState] = useState({ + sortedInfo: { + columnKey: "cost_center", + field: "cost_center", + order: "ascend", + }, + filteredInfo: {}, + }); - useEffect(() => { - async function CalculateTotals() { - const { data } = await axios.post("/payroll/calculatelabor", { - jobid: jobId, - }); - setTotals(data); - } - - if (!!joblines && !!timetickets && !!bodyshop) { - CalculateTotals(); - } - if (!jobId) setTotals([]); - }, [joblines, timetickets, bodyshop, adjustments, jobId]); - - const convertedLines = useMemo( - () => joblines && joblines.filter((j) => j.convertedtolbr), - [joblines] - ); - - const columns = [ - { - title: t("timetickets.fields.employee"), - dataIndex: "employeeid", - key: "employeeid", - render: (text, record) => { - if (record.employeeid === undefined) { - return ( - - {t("timetickets.labels.unassigned")} - - ); + useEffect(() => { + async function CalculateTotals() { + const {data} = await axios.post("/payroll/calculatelabor", { + jobid: jobId, + }); + setTotals(data); } - const emp = bodyshop.employees.find((e) => e.id === record.employeeid); - return `${emp?.first_name} ${emp?.last_name}`; - }, - }, - { - title: t("joblines.fields.mod_lbr_ty"), - dataIndex: "mod_lbr_ty", - key: "mod_lbr_ty", - render: (text, record) => - record.employeeid === undefined ? ( - - {t("timetickets.labels.unassigned")} - - ) : ( - t(`joblines.fields.lbr_types.${record.mod_lbr_ty?.toUpperCase()}`) - ), - }, - // { - // title: t("timetickets.fields.rate"), - // dataIndex: "rate", - // key: "rate", - // }, - { - title: t("jobs.labels.hrs_total"), - dataIndex: "expectedHours", - key: "expectedHours", - sorter: (a, b) => a.expectedHours - b.expectedHours, - sortOrder: - state.sortedInfo.columnKey === "expectedHours" && - state.sortedInfo.order, - render: (text, record) => record.expectedHours.toFixed(5), - }, - { - title: t("jobs.labels.hrs_claimed"), - dataIndex: "claimedHours", - key: "claimedHours", - sorter: (a, b) => a.claimedHours - b.claimedHours, - sortOrder: - state.sortedInfo.columnKey === "claimedHours" && state.sortedInfo.order, - render: (text, record) => - record.claimedHours && record.claimedHours.toFixed(5), - }, - { - title: t("jobs.labels.difference"), - dataIndex: "difference", - key: "difference", - sorter: (a, b) => a.difference - b.difference, - sortOrder: - state.sortedInfo.columnKey === "difference" && state.sortedInfo.order, - render: (text, record) => { - const difference = _.round( - record.expectedHours - record.claimedHours, - 5 - ); + if (!!joblines && !!timetickets && !!bodyshop) { + CalculateTotals(); + } + if (!jobId) setTotals([]); + }, [joblines, timetickets, bodyshop, adjustments, jobId]); - return ( - = 0 ? "green" : "red", - }} - > - {difference} - - ); - }, - }, - ]; - const convertedTableCols = [ - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - ellipsis: true, - }, - { - title: t("joblines.fields.op_code_desc"), - dataIndex: "op_code_desc", - key: "op_code_desc", - ellipsis: true, - render: (text, record) => - `${record.op_code_desc || ""}${ - record.alt_partm ? ` ${record.alt_partm}` : "" - }`, - }, - - { - title: t("joblines.fields.act_price"), - dataIndex: "act_price", - key: "act_price", - ellipsis: true, - render: (text, record) => ( - <> - - {record.db_ref === "900510" || record.db_ref === "900511" - ? record.prt_dsmk_m - : record.act_price} - - {record.prt_dsmk_p && record.prt_dsmk_p !== 0 ? ( - {`(${record.prt_dsmk_p}%)`} - ) : ( - <> - )} - - ), - }, - { - title: t("joblines.fields.part_qty"), - dataIndex: "part_qty", - key: "part_qty", - }, - { - title: t("joblines.fields.mod_lbr_ty"), - dataIndex: "conv_mod_lbr_ty", - key: "conv_mod_lbr_ty", - render: (text, record) => - record.convertedtolbr_data && record.convertedtolbr_data.mod_lbr_ty, - }, - { - title: t("joblines.fields.mod_lb_hrs"), - dataIndex: "conv_mod_lb_hrs", - key: "conv_mod_lb_hrs", - render: (text, record) => - record.convertedtolbr_data && - record.convertedtolbr_data.mod_lb_hrs && - record.convertedtolbr_data.mod_lb_hrs.toFixed(5), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const summary = - totals && - totals.reduce( - (acc, val) => { - acc.hrs_total += val.expectedHours; - acc.hrs_claimed += val.claimedHours; - // acc.adjustments += val.adjustments; - acc.difference += val.expectedHours - val.claimedHours; - return acc; - }, - { hrs_total: 0, hrs_claimed: 0, adjustments: 0, difference: 0 } + const convertedLines = useMemo( + () => joblines && joblines.filter((j) => j.convertedtolbr), + [joblines] ); - return ( - - - - + + + + } + > +
`${record.employeeid} ${record.mod_lbr_ty}`} + pagination={false} + onChange={handleTableChange} + dataSource={totals} + scroll={{ + x: true, + }} + summary={() => ( + + + + {t("general.labels.totals")} + + + + + {summary.hrs_total.toFixed(5)} + + + {summary.hrs_claimed.toFixed(5)} + - if (refetch) refetch(); - } else { - notification.open({ - type: "error", - message: t("timetickets.errors.payall", { - error: JSON.stringify(""), - }), - }); - } - }} - > - {t("timetickets.actions.payall")} - - - - } - > -
`${record.employeeid} ${record.mod_lbr_ty}`} - pagination={false} - onChange={handleTableChange} - dataSource={totals} - scroll={{ - x: true, - }} - summary={() => ( - - - - {t("general.labels.totals")} - - - - - {summary.hrs_total.toFixed(5)} - - - {summary.hrs_claimed.toFixed(5)} - - - - {summary.difference.toFixed(5)} - - + + {summary.difference.toFixed(5)} + + + )} + /> + + + {convertedLines && convertedLines.length > 0 && ( + + +
+ + )} - /> - - - {convertedLines && convertedLines.length > 0 && ( - - -
- - - )} - - ); + + ); } + export default connect(mapStateToProps, null)(PayrollLaborAllocationsTable); diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.styles.scss b/client/src/components/labor-allocations-table/labor-allocations-table.styles.scss index afd84fec5..27a513032 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.styles.scss +++ b/client/src/components/labor-allocations-table/labor-allocations-table.styles.scss @@ -24,6 +24,7 @@ padding: 0.625em; text-align: center; } + table td.currency { text-align: right; } diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.utility.js b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js index d236de913..f045f89bb 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.utility.js +++ b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js @@ -1,44 +1,44 @@ import i18next from "i18next"; export const CalculateAllocationsTotals = ( - bodyshop, - joblines, - timetickets, - adjustments = [] + bodyshop, + joblines, + timetickets, + adjustments = [] ) => { - const responsibilitycenters = bodyshop.md_responsibility_centers; - const jobCodes = joblines.map((item) => item.mod_lbr_ty); - //.filter((value, index, self) => self.indexOf(value) === index && !!value); - const ticketCodes = timetickets.map((item) => item.ciecacode); - //.filter((value, index, self) => self.indexOf(value) === index && !!value); - const adjustmentCodes = Object.keys(adjustments); - const allCodes = [...jobCodes, ...ticketCodes, ...adjustmentCodes].filter( - (value, index, self) => self.indexOf(value) === index && !!value - ); + const responsibilitycenters = bodyshop.md_responsibility_centers; + const jobCodes = joblines.map((item) => item.mod_lbr_ty); + //.filter((value, index, self) => self.indexOf(value) === index && !!value); + const ticketCodes = timetickets.map((item) => item.ciecacode); + //.filter((value, index, self) => self.indexOf(value) === index && !!value); + const adjustmentCodes = Object.keys(adjustments); + const allCodes = [...jobCodes, ...ticketCodes, ...adjustmentCodes].filter( + (value, index, self) => self.indexOf(value) === index && !!value + ); - const r = allCodes.reduce((acc, value) => { - const r = { - opcode: value, - cost_center: - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber - ? i18next.t( - `joblines.fields.lbr_types.${value && value.toUpperCase()}` - ) - : responsibilitycenters.defaults.costs[value], - mod_lbr_ty: value, - total: joblines.reduce((acc2, val2) => { - return val2.mod_lbr_ty === value ? acc2 + val2.mod_lb_hrs : acc2; - }, 0), - adjustments: adjustments[value] || 0, - claimed: timetickets.reduce((acc3, val3) => { - return val3.ciecacode === value ? acc3 + val3.productivehrs : acc3; - }, 0), - }; + const r = allCodes.reduce((acc, value) => { + const r = { + opcode: value, + cost_center: + bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber + ? i18next.t( + `joblines.fields.lbr_types.${value && value.toUpperCase()}` + ) + : responsibilitycenters.defaults.costs[value], + mod_lbr_ty: value, + total: joblines.reduce((acc2, val2) => { + return val2.mod_lbr_ty === value ? acc2 + val2.mod_lb_hrs : acc2; + }, 0), + adjustments: adjustments[value] || 0, + claimed: timetickets.reduce((acc3, val3) => { + return val3.ciecacode === value ? acc3 + val3.productivehrs : acc3; + }, 0), + }; - r.difference = r.total + r.adjustments - r.claimed; - acc.push(r); - return acc; - }, []); + r.difference = r.total + r.adjustments - r.claimed; + acc.push(r); + return acc; + }, []); - return r; + return r; }; diff --git a/client/src/components/layout-form-row/layout-form-row.component.jsx b/client/src/components/layout-form-row/layout-form-row.component.jsx index d2db2f23f..63baf3713 100644 --- a/client/src/components/layout-form-row/layout-form-row.component.jsx +++ b/client/src/components/layout-form-row/layout-form-row.component.jsx @@ -1,78 +1,78 @@ -import { Col, Divider, Row } from "antd"; +import {Col, Divider, Row} from "antd"; import React from "react"; import "./layout-form-row.styles.scss"; export default function LayoutFormRow({ - header, - children, - grow = false, - noDivider = false, - ...restProps -}) { - const DividerHeader = () => - !noDivider && ( - - {header} - - ); + header, + children, + grow = false, + noDivider = false, + ...restProps + }) { + const DividerHeader = () => + !noDivider && ( + + {header} + + ); - if (!!!children.length) { - //We have only one element. It's going to get the whole thing. - return ( -
- - {children} -
- ); - } - const rowGutter = { gutter: [16, 16] }; + if (!!!children.length) { + //We have only one element. It's going to get the whole thing. + return ( +
+ + {children} +
+ ); + } + const rowGutter = {gutter: [16, 16]}; - const colSpan = (spanOverride) => { - if (spanOverride) return { span: spanOverride }; - return { - xs: { - span: !grow ? 24 : Math.max(12, 24 / children.length), - }, - sm: { - span: !grow ? 12 : Math.max(12, 24 / children.length), - }, - md: { - span: !grow ? 8 : Math.max(8, 24 / children.length), - }, - lg: { - span: !grow ? 6 : Math.max(6, 24 / children.length), - }, - xl: { - span: !grow ? 4 : Math.max(4, 24 / children.length), - }, + const colSpan = (spanOverride) => { + if (spanOverride) return {span: spanOverride}; + return { + xs: { + span: !grow ? 24 : Math.max(12, 24 / children.length), + }, + sm: { + span: !grow ? 12 : Math.max(12, 24 / children.length), + }, + md: { + span: !grow ? 8 : Math.max(8, 24 / children.length), + }, + lg: { + span: !grow ? 6 : Math.max(6, 24 / children.length), + }, + xl: { + span: !grow ? 4 : Math.max(4, 24 / children.length), + }, + }; }; - }; - //{header ? {header} : null} - return ( -
- - - {children.map( - (c, idx) => - c && ( -
- {c} - - ) - )} - - - ); + //{header ? {header} : null} + return ( +
+ + + {children.map( + (c, idx) => + c && ( +
+ {c} + + ) + )} + + + ); } diff --git a/client/src/components/loading-skeleton/loading-skeleton.component.jsx b/client/src/components/loading-skeleton/loading-skeleton.component.jsx index 6d9af741a..38613ac65 100644 --- a/client/src/components/loading-skeleton/loading-skeleton.component.jsx +++ b/client/src/components/loading-skeleton/loading-skeleton.component.jsx @@ -1,12 +1,12 @@ import React from "react"; import "./loading-skeleton.styles.scss"; -import { Skeleton } from "antd"; +import {Skeleton} from "antd"; export default function LoadingSkeleton(props) { - return ( - - {props.children} - - ); + return ( + + {props.children} + + ); } diff --git a/client/src/components/loading-spinner/loading-spinner.component.jsx b/client/src/components/loading-spinner/loading-spinner.component.jsx index e66b0f1af..b02819ac2 100644 --- a/client/src/components/loading-spinner/loading-spinner.component.jsx +++ b/client/src/components/loading-spinner/loading-spinner.component.jsx @@ -1,22 +1,24 @@ import React from "react"; -import { Spin } from "antd"; +import {Spin} from "antd"; import "./loading-spinner.styles.scss"; -export default function LoadingSpinner({ loading = true, message, ...props }) { - return ( -
- - {props.children} - -
- ); +export default function LoadingSpinner({loading = true, message, ...props}) { + return ( +
+ + {props.children} + +
+ ); } diff --git a/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx b/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx index 5fa6a359c..6a8086322 100644 --- a/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx +++ b/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx @@ -1,25 +1,26 @@ -import { BuildFilled, LoginOutlined } from "@ant-design/icons"; +import {BuildFilled, LoginOutlined} from "@ant-design/icons"; import React from "react"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); -export function ManageSignInButton({ currentUser }) { - return currentUser.authorized ? ( - - - Manage - - ) : ( - - - Sign In - - ); +export function ManageSignInButton({currentUser}) { + return currentUser.authorized ? ( + + + Manage + + ) : ( + + + Sign In + + ); } + export default connect(mapStateToProps, null)(ManageSignInButton); diff --git a/client/src/components/no-shop/no-shop.component.jsx b/client/src/components/no-shop/no-shop.component.jsx index 1847999e9..5c1dd2068 100644 --- a/client/src/components/no-shop/no-shop.component.jsx +++ b/client/src/components/no-shop/no-shop.component.jsx @@ -1,12 +1,12 @@ import React from "react"; -import { Result } from "antd"; -import { useTranslation } from "react-i18next"; +import {Result} from "antd"; +import {useTranslation} from "react-i18next"; export default function NoShop() { - const { t } = useTranslation(); - return ( -
- -
- ); + const {t} = useTranslation(); + return ( +
+ +
+ ); } diff --git a/client/src/components/not-found/not-found.component.jsx b/client/src/components/not-found/not-found.component.jsx index 3ecc6a307..493131154 100644 --- a/client/src/components/not-found/not-found.component.jsx +++ b/client/src/components/not-found/not-found.component.jsx @@ -1,16 +1,16 @@ import React from "react"; -import { Result } from "antd"; -import { useTranslation } from "react-i18next"; +import {Result} from "antd"; +import {useTranslation} from "react-i18next"; export default function NotFound() { - const { t } = useTranslation(); - return ( -
- -
- ); + const {t} = useTranslation(); + return ( +
+ +
+ ); } diff --git a/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx b/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx index 89fdf78be..0faba49c3 100644 --- a/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx +++ b/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx @@ -1,124 +1,114 @@ -import { - Checkbox, - Col, - Form, - Input, - Row, - Select, - Space, - Switch, - Tag, -} from "antd"; +import {Checkbox, Col, Form, Input, Row, Select, Space, Switch, Tag,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectNoteUpsert } from "../../redux/modals/modals.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectNoteUpsert} from "../../redux/modals/modals.selectors"; import NotesPresetButton from "../notes-preset-button/notes-preset-button.component"; const mapStateToProps = createStructuredSelector({ - noteUpsertModal: selectNoteUpsert, + noteUpsertModal: selectNoteUpsert, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(NoteUpsertModalComponent); -export function NoteUpsertModalComponent({ form, noteUpsertModal }) { - const { t } = useTranslation(); - const { jobId, existingNote, relatedRos } = noteUpsertModal.context; +export function NoteUpsertModalComponent({form, noteUpsertModal}) { + const {t} = useTranslation(); + const {jobId, existingNote, relatedRos} = noteUpsertModal.context; - const filteredRelatedRos = relatedRos - ? relatedRos.filter((j) => j.id !== jobId) - : []; + const filteredRelatedRos = relatedRos + ? relatedRos.filter((j) => j.id !== jobId) + : []; - return ( - <> - -
- - - - - - - - - - - - + + + + + + + + + + + +
+
{!existingNote && t("notes.labels.addtorelatedro")}
+ {!existingNote && + filteredRelatedRos.map((j, idx) => ( + + + + + + {`${j.ro_number || "N/A"}${j.clm_no ? ` | ${j.clm_no}` : ""}${ + j.status ? ` | ${j.status}` : "" + }`} + + + ))} +
+ + ); } diff --git a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx index f925b7100..b071156c2 100644 --- a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx +++ b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx @@ -1,145 +1,145 @@ -import { useMutation } from "@apollo/client"; -import { Form, Modal, notification } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_NEW_NOTE, UPDATE_NOTE } from "../../graphql/notes.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectNoteUpsert } from "../../redux/modals/modals.selectors"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Form, Modal, notification} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_NEW_NOTE, UPDATE_NOTE} from "../../graphql/notes.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectNoteUpsert} from "../../redux/modals/modals.selectors"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import NoteUpsertModalComponent from "./note-upsert-modal.component"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - noteUpsertModal: selectNoteUpsert, + currentUser: selectCurrentUser, + noteUpsertModal: selectNoteUpsert, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function NoteUpsertModalContainer({ - currentUser, - noteUpsertModal, - toggleModalVisible, - insertAuditTrail, -}) { - const { t } = useTranslation(); - const [insertNote] = useMutation(INSERT_NEW_NOTE); - const [updateNote] = useMutation(UPDATE_NOTE); + currentUser, + noteUpsertModal, + toggleModalVisible, + insertAuditTrail, + }) { + const {t} = useTranslation(); + const [insertNote] = useMutation(INSERT_NEW_NOTE); + const [updateNote] = useMutation(UPDATE_NOTE); - const { visible, context, actions } = noteUpsertModal; - const { jobId, existingNote, text } = context; - const { refetch } = actions; + const {open, context, actions} = noteUpsertModal; + const {jobId, existingNote, text} = context; + const {refetch} = actions; - const [form] = Form.useForm(); + const [form] = Form.useForm(); - useEffect(() => { - //Required to prevent infinite looping. - if (existingNote && visible) { - form.setFieldsValue(existingNote); - } else if (!existingNote && visible) { - form.resetFields(); + useEffect(() => { + //Required to prevent infinite looping. + if (existingNote && open) { + form.setFieldsValue(existingNote); + } else if (!existingNote && open) { + form.resetFields(); - if (text) { - form.setFieldValue("text", text); - } - } - }, [existingNote, form, visible, text]); + if (text) { + form.setFieldValue("text", text); + } + } + }, [existingNote, form, open, text]); - const handleFinish = async (formValues) => { - const { relatedros, ...values } = formValues; + const handleFinish = async (formValues) => { + const {relatedros, ...values} = formValues; - if (existingNote) { - logImEXEvent("job_note_update"); + if (existingNote) { + logImEXEvent("job_note_update"); - updateNote({ - variables: { - noteId: existingNote.id, - note: values, - }, - }).then((r) => { - notification["success"]({ - message: t("notes.successes.updated"), - }); - insertAuditTrail({ - jobid: context.jobId, - operation: AuditTrailMapping.jobnoteupdated(), - }); - }); - if (refetch) refetch(); - toggleModalVisible(); - } else { - logImEXEvent("job_note_insert"); - const AdditionalNoteInserts = relatedros - ? Object.keys(relatedros).filter((key) => relatedros[key]) - : []; + updateNote({ + variables: { + noteId: existingNote.id, + note: values, + }, + }).then((r) => { + notification["success"]({ + message: t("notes.successes.updated"), + }); + insertAuditTrail({ + jobid: context.jobId, + operation: AuditTrailMapping.jobnoteupdated(), + }); + }); + if (refetch) refetch(); + toggleModalVisible(); + } else { + logImEXEvent("job_note_insert"); + const AdditionalNoteInserts = relatedros + ? Object.keys(relatedros).filter((key) => relatedros[key]) + : []; - await insertNote({ - variables: { - noteInput: [ - { ...values, jobid: jobId, created_by: currentUser.email }, - ], - }, - refetchQueries: ["QUERY_NOTES_BY_JOB_PK"], - }); + await insertNote({ + variables: { + noteInput: [ + {...values, jobid: jobId, created_by: currentUser.email}, + ], + }, + refetchQueries: ["QUERY_NOTES_BY_JOB_PK"], + }); - if (AdditionalNoteInserts.length > 0) { - //Insert the others. - AdditionalNoteInserts.forEach(async (newJobId) => { - await insertNote({ - variables: { - noteInput: [ - { ...values, jobid: newJobId, created_by: currentUser.email }, - ], - }, - }); - insertAuditTrail({ - jobid: newJobId, - operation: AuditTrailMapping.jobnoteadded(), - }); - }); - } + if (AdditionalNoteInserts.length > 0) { + //Insert the others. + AdditionalNoteInserts.forEach(async (newJobId) => { + await insertNote({ + variables: { + noteInput: [ + {...values, jobid: newJobId, created_by: currentUser.email}, + ], + }, + }); + insertAuditTrail({ + jobid: newJobId, + operation: AuditTrailMapping.jobnoteadded(), + }); + }); + } - if (refetch) refetch(); - form.resetFields(); - toggleModalVisible(); - notification["success"]({ - message: t("notes.successes.create"), - }); - insertAuditTrail({ - jobid: context.jobId, - operation: AuditTrailMapping.jobnoteadded(), - }); - } - }; + if (refetch) refetch(); + form.resetFields(); + toggleModalVisible(); + notification["success"]({ + message: t("notes.successes.create"), + }); + insertAuditTrail({ + jobid: context.jobId, + operation: AuditTrailMapping.jobnoteadded(), + }); + } + }; - return ( - { - form.submit(); - }} - onCancel={() => { - toggleModalVisible(); - }} - destroyOnClose - > -
- - -
- ); + return ( + { + form.submit(); + }} + onCancel={() => { + toggleModalVisible(); + }} + destroyOnClose + > +
+ + +
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(NoteUpsertModalContainer); diff --git a/client/src/components/notes-preset-button/notes-preset-button.component.jsx b/client/src/components/notes-preset-button/notes-preset-button.component.jsx index 6cf5de285..15c57fffb 100644 --- a/client/src/components/notes-preset-button/notes-preset-button.component.jsx +++ b/client/src/components/notes-preset-button/notes-preset-button.component.jsx @@ -1,57 +1,52 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Dropdown, Menu } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Dropdown} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function NotesPresetButton({ bodyshop, form }) { - const { t } = useTranslation(); +export function NotesPresetButton({bodyshop, form}) { + const {t} = useTranslation(); - const handleSelect = (item) => { - form.setFieldsValue({ text: item.text }); - }; + const handleSelect = (item) => { + form.setFieldsValue({text: item.text}); + }; - const menu = ( - - {bodyshop.md_notes_presets.map((i, idx) => ( - handleSelect(i)} - key={idx} - style={{ breakInside: "avoid" }} - > - {i.label} - - ))} - - ); - return ( - - ); + const menu = { + items: bodyshop.md_notes_presets.map((i, idx) => ({ + key: idx, + label: i.label, + style: {breakInside: "avoid"}, + onClick: () => handleSelect(i), + })), + style: { + columnCount: Math.floor(bodyshop.md_notes_presets.length / 10) + 1, + }, + } + + return ( + + ); } export default connect(mapStateToProps, mapDispatchToProps)(NotesPresetButton); diff --git a/client/src/components/owner-detail-form/owner-detail-form.component.jsx b/client/src/components/owner-detail-form/owner-detail-form.component.jsx index 7178aa322..29838e6ec 100644 --- a/client/src/components/owner-detail-form/owner-detail-form.component.jsx +++ b/client/src/components/owner-detail-form/owner-detail-form.component.jsx @@ -1,109 +1,107 @@ -import { Form, Input, Switch } from "antd"; +import {Form, Input, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import FormItemPhone, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import FormItemPhone, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -export default function OwnerDetailFormComponent({ form, loading }) { - const { t } = useTranslation(); - const { getFieldValue } = form; - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PhoneItemFormatterValidation(getFieldValue, "ownr_ph1"), - ]} - > - - - - PhoneItemFormatterValidation(getFieldValue, "ownr_ph2"), - ]} - > - - - - - - - - - - - - -
- ); +export default function OwnerDetailFormComponent({form, loading}) { + const {t} = useTranslation(); + const {getFieldValue} = form; + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PhoneItemFormatterValidation(getFieldValue, "ownr_ph1"), + ]} + > + + + + PhoneItemFormatterValidation(getFieldValue, "ownr_ph2"), + ]} + > + + + + + + + + + + + + +
+ ); } diff --git a/client/src/components/owner-detail-form/owner-detail-form.container.jsx b/client/src/components/owner-detail-form/owner-detail-form.container.jsx index fc1ae6bd1..d2a046f16 100644 --- a/client/src/components/owner-detail-form/owner-detail-form.container.jsx +++ b/client/src/components/owner-detail-form/owner-detail-form.container.jsx @@ -1,105 +1,109 @@ -import { Button, Form, notification, PageHeader, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useHistory } from "react-router-dom"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { DELETE_OWNER, UPDATE_OWNER } from "../../graphql/owners.queries"; +import {Button, Form, notification, Popconfirm} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + +import React, {useState} from "react"; +import {useNavigate} from "react-router-dom"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {DELETE_OWNER, UPDATE_OWNER} from "../../graphql/owners.queries"; import OwnerDetailFormComponent from "./owner-detail-form.component"; -function OwnerDetailFormContainer({ owner, refetch }) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const history = useHistory(); - const [loading, setLoading] = useState(false); - const [updateOwner] = useMutation(UPDATE_OWNER); - const [deleteOwner] = useMutation(DELETE_OWNER); +function OwnerDetailFormContainer({owner, refetch}) { + const {t} = useTranslation(); + const [form] = Form.useForm(); + const history = useNavigate(); + const [loading, setLoading] = useState(false); + const [updateOwner] = useMutation(UPDATE_OWNER); + const [deleteOwner] = useMutation(DELETE_OWNER); - const handleDelete = async () => { - setLoading(true); - const result = await deleteOwner({ - variables: { id: owner.id }, - }); - console.log(result); - if (result.errors) { - notification["error"]({ - message: t("owners.errors.deleting", { - error: JSON.stringify(result.errors), - }), - }); - setLoading(false); - } else { - notification["success"]({ - message: t("owners.successes.delete"), - }); - setLoading(false); - history.push(`/manage/owners`); - } - }; + const handleDelete = async () => { + setLoading(true); + const result = await deleteOwner({ + variables: {id: owner.id}, + }); + console.log(result); + if (result.errors) { + notification["error"]({ + message: t("owners.errors.deleting", { + error: JSON.stringify(result.errors), + }), + }); + setLoading(false); + } else { + notification["success"]({ + message: t("owners.successes.delete"), + }); + setLoading(false); + history(`/manage/owners`); + } + }; - const handleFinish = async (values) => { - setLoading(true); - const result = await updateOwner({ - variables: { ownerId: owner.id, owner: values }, - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateOwner({ + variables: {ownerId: owner.id, owner: values}, + }); - if (!!result.errors) { - notification["error"]({ - message: t("owners.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - setLoading(false); - return; - } + if (!!result.errors) { + notification["error"]({ + message: t("owners.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + setLoading(false); + return; + } - notification["success"]({ - message: t("owners.successes.save"), - }); + notification["success"]({ + message: t("owners.successes.save"), + }); - if (refetch) await refetch(); - form.resetFields(); - form.resetFields(); - setLoading(false); - }; + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); + setLoading(false); + }; - return ( - <> - - + , + , + ]} + /> +
- {t("general.actions.delete")} - - , - , - ]} - /> - - - - - ); + + + + ); } + export default OwnerDetailFormContainer; diff --git a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx index 360954101..d75dd5bc3 100644 --- a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx +++ b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx @@ -1,133 +1,133 @@ -import { Card, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Card, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort, statusSort } from "../../utils/sorters"; +import {alphaSort, statusSort} from "../../utils/sorters"; import OwnerDetailUpdateJobsComponent from "../owner-detail-update-jobs/owner-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -function OwnerDetailJobsComponent({ bodyshop, owner }) { - const { t } = useTranslation(); - const [selectedJobs, setSelectedJobs] = useState([]); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); +function OwnerDetailJobsComponent({bodyshop, owner}) { + const {t} = useTranslation(); + const [selectedJobs, setSelectedJobs] = useState([]); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - ellipsis: true, - render: (text, record) => ( - - {record.ro_number || t("general.labels.na")} - - ), - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicleid", - key: "vehicleid", - render: (text, record) => - record.vehicleid ? ( - - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`.trim()} - - ) : ( - t("jobs.errors.novehicle") - ), - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - }, + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - { - title: t("jobs.fields.clm_total"), - dataIndex: "clm_total", - key: "clm_total", - render: (text, record) => ( - {record.clm_total} - ), - sorter: (a, b) => a.clm_total - b.clm_total, - sortOrder: - state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, - }, - ]; + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + ellipsis: true, + render: (text, record) => ( + + {record.ro_number || t("general.labels.na")} + + ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicleid", + key: "vehicleid", + render: (text, record) => + record.vehicleid ? ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`.trim()} + + ) : ( + t("jobs.errors.novehicle") + ), + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + }, - return ( - - } - > -
{ - setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); - }, - onSelectAll: (selected, selectedRows, changeRows) => { - setSelectedJobs( - selectedRows - ? selectedRows - .filter((i) => - bodyshop.md_ro_statuses.active_statuses.includes(i.status) - ) - .map((i) => i.id) - : [] - ); - }, - selectedRowKeys: selectedJobs, - getCheckboxProps: (record) => ({ - disabled: bodyshop.md_ro_statuses.active_statuses - ? !bodyshop.md_ro_statuses.active_statuses.includes(record.status) - : true, - }), - }} - /> - - ); + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + render: (text, record) => ( + {record.clm_total} + ), + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, + }, + ]; + + return ( + + } + > +
{ + setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedJobs( + selectedRows + ? selectedRows + .filter((i) => + bodyshop.md_ro_statuses.active_statuses.includes(i.status) + ) + .map((i) => i.id) + : [] + ); + }, + selectedRowKeys: selectedJobs, + getCheckboxProps: (record) => ({ + disabled: bodyshop.md_ro_statuses.active_statuses + ? !bodyshop.md_ro_statuses.active_statuses.includes(record.status) + : true, + }), + }} + /> + + ); } export default connect(mapStateToProps, null)(OwnerDetailJobsComponent); diff --git a/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx b/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx index 25428eb41..c640481a0 100644 --- a/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx +++ b/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx @@ -1,53 +1,53 @@ import React from "react"; -import { Button, notification } from "antd"; -import { useTranslation } from "react-i18next"; -import { useMutation } from "@apollo/client"; -import { UPDATE_JOBS } from "../../graphql/jobs.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {Button, notification} from "antd"; +import {useTranslation} from "react-i18next"; +import {useMutation} from "@apollo/client"; +import {UPDATE_JOBS} from "../../graphql/jobs.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; export default function OwnerDetailUpdateJobsComponent({ - owner, - selectedJobs, - disabled, -}) { - const { t } = useTranslation(); - const [updateJobs] = useMutation(UPDATE_JOBS); - const handlecClick = (e) => { - logImEXEvent("owner_update_jobs", { count: selectedJobs.length }); + owner, + selectedJobs, + disabled, + }) { + const {t} = useTranslation(); + const [updateJobs] = useMutation(UPDATE_JOBS); + const handlecClick = (e) => { + logImEXEvent("owner_update_jobs", {count: selectedJobs.length}); - updateJobs({ - variables: { - jobIds: selectedJobs, - fields: { - ownr_addr1: owner["ownr_addr1"], - ownr_addr2: owner["ownr_addr2"], - ownr_co_nm: owner["ownr_co_nm"], - ownr_city: owner["ownr_city"], - ownr_ctry: owner["ownr_ctry"], - ownr_ea: owner["ownr_ea"], - ownr_fn: owner["ownr_fn"], - ownr_ph1: owner["ownr_ph1"], - ownr_ln: owner["ownr_ln"], - ownr_ph2: owner["ownr_ph2"], - ownr_st: owner["ownr_st"], - ownr_title: owner["ownr_title"], - ownr_zip: owner["ownr_zip"], - }, - }, - }) - .then((response) => { - notification["success"]({ message: t("jobs.successes.updated") }); - }) - .catch((error) => { - notification["error"]({ - message: t("jobs.errors.updating", { error: JSON.stringify(error) }), - }); - }); - }; + updateJobs({ + variables: { + jobIds: selectedJobs, + fields: { + ownr_addr1: owner["ownr_addr1"], + ownr_addr2: owner["ownr_addr2"], + ownr_co_nm: owner["ownr_co_nm"], + ownr_city: owner["ownr_city"], + ownr_ctry: owner["ownr_ctry"], + ownr_ea: owner["ownr_ea"], + ownr_fn: owner["ownr_fn"], + ownr_ph1: owner["ownr_ph1"], + ownr_ln: owner["ownr_ln"], + ownr_ph2: owner["ownr_ph2"], + ownr_st: owner["ownr_st"], + ownr_title: owner["ownr_title"], + ownr_zip: owner["ownr_zip"], + }, + }, + }) + .then((response) => { + notification["success"]({message: t("jobs.successes.updated")}); + }) + .catch((error) => { + notification["error"]({ + message: t("jobs.errors.updating", {error: JSON.stringify(error)}), + }); + }); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/owner-find-modal/owner-find-modal.component.jsx b/client/src/components/owner-find-modal/owner-find-modal.component.jsx index 3a5f313cd..cc0b7c425 100644 --- a/client/src/components/owner-find-modal/owner-find-modal.component.jsx +++ b/client/src/components/owner-find-modal/owner-find-modal.component.jsx @@ -1,121 +1,121 @@ -import { Checkbox, Divider, Table } from "antd"; +import {Checkbox, Divider, Table} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import PhoneFormatter from "../../utils/PhoneFormatter"; export default function OwnerFindModalComponent({ - selectedOwner, - setSelectedOwner, - ownersListLoading, - ownersList, - partsQueueToggle, - setPartsQueueToggle, -}) { - //setSelectedOwner is used to set the record id of the owner to use for adding the job. - const { t } = useTranslation(); - const columns = [ - { - title: t("owners.fields.ownr_ln"), - dataIndex: "ownr_ln", - key: "ownr_ln", - }, - { - title: t("owners.fields.ownr_fn"), - dataIndex: "ownr_fn", - key: "ownr_fn", - }, - { - title: t("owners.fields.ownr_co_nm"), - dataIndex: "ownr_co_nm", - key: "ownr_co_nm", - }, - { - title: t("owners.fields.ownr_addr1"), - dataIndex: "ownr_addr1", - key: "ownr_addr1", - }, - { - title: t("owners.fields.ownr_city"), - dataIndex: "ownr_city", - key: "ownr_city", - }, - { - title: t("owners.fields.ownr_ea"), - dataIndex: "ownr_ea", - key: "ownr_ea", - }, - { - title: t("owners.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - render: (text, record) => ( - {record.ownr_ph1} - ), - }, - { - title: t("owners.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - render: (text, record) => ( - {record.ownr_ph2} - ), - }, - { - title: t("owners.fields.note"), - dataIndex: "note", - key: "note", - render: (text, record) => ( - {record.note} - ), - }, - ]; + selectedOwner, + setSelectedOwner, + ownersListLoading, + ownersList, + partsQueueToggle, + setPartsQueueToggle, + }) { + //setSelectedOwner is used to set the record id of the owner to use for adding the job. + const {t} = useTranslation(); + const columns = [ + { + title: t("owners.fields.ownr_ln"), + dataIndex: "ownr_ln", + key: "ownr_ln", + }, + { + title: t("owners.fields.ownr_fn"), + dataIndex: "ownr_fn", + key: "ownr_fn", + }, + { + title: t("owners.fields.ownr_co_nm"), + dataIndex: "ownr_co_nm", + key: "ownr_co_nm", + }, + { + title: t("owners.fields.ownr_addr1"), + dataIndex: "ownr_addr1", + key: "ownr_addr1", + }, + { + title: t("owners.fields.ownr_city"), + dataIndex: "ownr_city", + key: "ownr_city", + }, + { + title: t("owners.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + }, + { + title: t("owners.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + render: (text, record) => ( + {record.ownr_ph1} + ), + }, + { + title: t("owners.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + render: (text, record) => ( + {record.ownr_ph2} + ), + }, + { + title: t("owners.fields.note"), + dataIndex: "note", + key: "note", + render: (text, record) => ( + {record.note} + ), + }, + ]; - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - setSelectedOwner(record.id); - return; - } - } - setSelectedOwner(null); - }; + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + setSelectedOwner(record.id); + return; + } + } + setSelectedOwner(null); + }; - return ( -
-
{ - setSelectedOwner(props.id); - }, - type: "radio", - selectedRowKeys: [selectedOwner], - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, - }; - }} - /> - - setSelectedOwner(null)} - > - {t("owners.labels.create_new")} - - setPartsQueueToggle(e.target.checked)} - > - {t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")} - - - ); + return ( +
+
{ + setSelectedOwner(props.id); + }, + type: "radio", + selectedRowKeys: [selectedOwner], + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + setSelectedOwner(null)} + > + {t("owners.labels.create_new")} + + setPartsQueueToggle(e.target.checked)} + > + {t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")} + + + ); } diff --git a/client/src/components/owner-find-modal/owner-find-modal.container.jsx b/client/src/components/owner-find-modal/owner-find-modal.container.jsx index f6c9453d7..31d863afc 100644 --- a/client/src/components/owner-find-modal/owner-find-modal.container.jsx +++ b/client/src/components/owner-find-modal/owner-find-modal.container.jsx @@ -1,76 +1,76 @@ -import { useLazyQuery } from "@apollo/client"; -import { Input, Modal } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; +import {useLazyQuery} from "@apollo/client"; +import {Input, Modal} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {QUERY_SEARCH_OWNER_BY_IDX} from "../../graphql/owners.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import OwnerFindModalComponent from "./owner-find-modal.component"; -import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; export default function OwnerFindModalContainer({ - loading, - error, - owner, - selectedOwner, - setSelectedOwner, - partsQueueToggle, - setPartsQueueToggle, - ...modalProps -}) { - //use owner object to run query and find what possible owners there are. - const { t } = useTranslation(); - const [searchText, setSearchText] = useState(null); + loading, + error, + owner, + selectedOwner, + setSelectedOwner, + partsQueueToggle, + setPartsQueueToggle, + ...modalProps + }) { + //use owner object to run query and find what possible owners there are. + const {t} = useTranslation(); + const [searchText, setSearchText] = useState(null); - const [callSearchowners, ownersList] = useLazyQuery( - QUERY_SEARCH_OWNER_BY_IDX, - { - variables: { - search: searchText, - }, - } - ); + const [callSearchowners, ownersList] = useLazyQuery( + QUERY_SEARCH_OWNER_BY_IDX, + { + variables: { + search: searchText, + }, + } + ); - useEffect(() => { - if (modalProps.visible && owner) { - const s = OwnerNameDisplayFunction(owner, true); + useEffect(() => { + if (modalProps.open && owner) { + const s = OwnerNameDisplayFunction(owner, true); - setSearchText(s.trim()); - callSearchowners({ variables: { search: s.trim() } }); - } - }, [callSearchowners, modalProps.visible, owner]); + setSearchText(s.trim()); + callSearchowners({variables: {search: s.trim()}}); + } + }, [callSearchowners, modalProps.open, owner]); - return ( - - {loading ? : null} - {error ? : null} - {owner ? ( - <> - setSearchText(e.target.value)} - onSearch={(val) => - callSearchowners({ variables: { search: val.trim() } }) - } - /> - - - ) : null} - - ); + return ( + + {loading ? : null} + {error ? : null} + {owner ? ( + <> + setSearchText(e.target.value)} + onSearch={(val) => + callSearchowners({variables: {search: val.trim()}}) + } + /> + + + ) : null} + + ); } diff --git a/client/src/components/owner-name-display/owner-name-display.component.jsx b/client/src/components/owner-name-display/owner-name-display.component.jsx index da7965739..c09ae21c1 100644 --- a/client/src/components/owner-name-display/owner-name-display.component.jsx +++ b/client/src/components/owner-name-display/owner-name-display.component.jsx @@ -1,47 +1,48 @@ -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { store } from "../../redux/store"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {store} from "../../redux/store"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(OwnerNameDisplay); -export function OwnerNameDisplay({ bodyshop, ownerObject }) { - const emptyTest = - ownerObject?.ownr_fn + ownerObject?.ownr_ln + ownerObject?.ownr_co_nm; +export function OwnerNameDisplay({bodyshop, ownerObject}) { + const emptyTest = + ownerObject?.ownr_fn + ownerObject?.ownr_ln + ownerObject?.ownr_co_nm; - if (!emptyTest || emptyTest === "null" || emptyTest.trim() === "") - return "N/A"; + if (!emptyTest || emptyTest === "null" || emptyTest.trim() === "") + return "N/A"; - if (bodyshop.last_name_first) - return `${ownerObject?.ownr_ln || ""}, ${ownerObject?.ownr_fn || ""} ${ - ownerObject?.ownr_co_nm || "" + if (bodyshop.last_name_first) + return `${ownerObject?.ownr_ln || ""}, ${ownerObject?.ownr_fn || ""} ${ + ownerObject?.ownr_co_nm || "" + }`.trim(); + + return `${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_ln || ""} ${ + ownerObject.ownr_co_nm || "" }`.trim(); - - return `${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_ln || ""} ${ - ownerObject.ownr_co_nm || "" - }`.trim(); } export function OwnerNameDisplayFunction(ownerObject, forceFirstLast = false) { - const emptyTest = - ownerObject?.ownr_fn + ownerObject?.ownr_ln + ownerObject?.ownr_co_nm; + const emptyTest = + ownerObject?.ownr_fn + ownerObject?.ownr_ln + ownerObject?.ownr_co_nm; - if (!emptyTest || emptyTest === "null" || emptyTest.trim() === "") - return "N/A"; + if (!emptyTest || emptyTest === "null" || emptyTest.trim() === "") + return "N/A"; - const rdxStore = store.getState(); + const rdxStore = store.getState(); - if (rdxStore.user.bodyshop.last_name_first && !forceFirstLast) - return `${ownerObject?.ownr_ln || ""}, ${ownerObject?.ownr_fn || ""} ${ - ownerObject?.ownr_co_nm || "" + if (rdxStore.user.bodyshop.last_name_first && !forceFirstLast) + return `${ownerObject?.ownr_ln || ""}, ${ownerObject?.ownr_fn || ""} ${ + ownerObject?.ownr_co_nm || "" + }`.trim(); + + return `${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_ln || ""} ${ + ownerObject?.ownr_co_nm || "" }`.trim(); - - return `${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_ln || ""} ${ - ownerObject?.ownr_co_nm || "" - }`.trim(); } diff --git a/client/src/components/owner-search-select/owner-search-select.component.jsx b/client/src/components/owner-search-select/owner-search-select.component.jsx index a9b956568..e82af39cb 100644 --- a/client/src/components/owner-search-select/owner-search-select.component.jsx +++ b/client/src/components/owner-search-select/owner-search-select.component.jsx @@ -1,94 +1,91 @@ -import { LoadingOutlined } from "@ant-design/icons"; -import { useLazyQuery } from "@apollo/client"; -import { Empty, Select } from "antd"; +import {LoadingOutlined} from "@ant-design/icons"; +import {useLazyQuery} from "@apollo/client"; +import {Empty, Select} from "antd"; import _ from "lodash"; -import React, { forwardRef, useEffect, useState } from "react"; -import { - SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE, - SEARCH_OWNERS_FOR_AUTOCOMPLETE, -} from "../../graphql/owners.queries"; +import React, {forwardRef, useEffect, useState} from "react"; +import {SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE, SEARCH_OWNERS_FOR_AUTOCOMPLETE,} from "../../graphql/owners.queries"; import AlertComponent from "../alert/alert.component"; -import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; -const { Option } = Select; +const {Option} = Select; -const OwnerSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => { - const [callSearch, { loading, error, data }] = useLazyQuery( - SEARCH_OWNERS_FOR_AUTOCOMPLETE - ); +const OwnerSearchSelect = ({value, onChange, onBlur, disabled}, ref) => { + const [callSearch, {loading, error, data}] = useLazyQuery( + SEARCH_OWNERS_FOR_AUTOCOMPLETE + ); - const [callIdSearch, { loading: idLoading, error: idError, data: idData }] = - useLazyQuery(SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE); + const [callIdSearch, {loading: idLoading, error: idError, data: idData}] = + useLazyQuery(SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE); - const executeSearch = (v) => { - if (v && v.variables?.search !== "" && v.variables.search.length >= 2) - callSearch(v); - }; - const debouncedExecuteSearch = _.debounce(executeSearch, 500); + const executeSearch = (v) => { + if (v && v.variables?.search !== "" && v.variables.search.length >= 2) + callSearch(v); + }; + const debouncedExecuteSearch = _.debounce(executeSearch, 500); - const handleSearch = (value) => { - debouncedExecuteSearch({ variables: { search: value } }); - }; + const handleSearch = (value) => { + debouncedExecuteSearch({variables: {search: value}}); + }; - const [option, setOption] = useState(value); + const [option, setOption] = useState(value); - useEffect(() => { - if (value === option && value) { - callIdSearch({ variables: { id: value } }); - } - }, [value, option, callIdSearch]); + useEffect(() => { + if (value === option && value) { + callIdSearch({variables: {id: value}}); + } + }, [value, option, callIdSearch]); - // useEffect(() => { - // if (value !== option && onChange) { - // onChange(option); - // } - // }, [value, option, onChange]); + // useEffect(() => { + // if (value !== option && onChange) { + // onChange(option); + // } + // }, [value, option, onChange]); - const handleSelect = (value) => { - setOption(value); - if (value !== option && onChange) { - onChange(value); - } - }; + const handleSelect = (value) => { + setOption(value); + if (value !== option && onChange) { + onChange(value); + } + }; - const theOptions = [ - ...(idData && idData.owners_by_pk ? [idData.owners_by_pk] : []), - ...(data && data.search_owners ? data.search_owners : []), - ]; + const theOptions = [ + ...(idData && idData.owners_by_pk ? [idData.owners_by_pk] : []), + ...(data && data.search_owners ? data.search_owners : []), + ]; - return ( -
- - {idLoading || loading ? : null} - {error ? : null} - {idError ? ( - - ) : null} -
- ); + return ( +
+ + {idLoading || loading ? : null} + {error ? : null} + {idError ? ( + + ) : null} +
+ ); }; export default forwardRef(OwnerSearchSelect); diff --git a/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx b/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx index b94e576b4..546126aef 100644 --- a/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx +++ b/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx @@ -1,78 +1,76 @@ -import { Button, Col, Popover, Row, Tag, Descriptions } from "antd"; +import {Button, Col, Descriptions, Popover, Row, Tag} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import PhoneFormatter from "../../utils/PhoneFormatter"; -import OwnerNameDisplay, { - OwnerNameDisplayFunction, -} from "../owner-name-display/owner-name-display.component"; +import OwnerNameDisplay, {OwnerNameDisplayFunction,} from "../owner-name-display/owner-name-display.component"; -export default function OwnerTagPopoverComponent({ job }) { - const { t } = useTranslation(); - const content = ( -
- -
- - - - - - {job.ownr_ph1 || ""} - - - {job.ownr_ph2 || ""} - - - {`${job.ownr_addr1 || ""} ${job.ownr_addr2 || ""} ${ - job.ownr_city || "" - } ${job.ownr_st || ""} ${job.ownr_zip || ""}`} - - - {job.ownr_ea || ""} - - - - - - - - - - {job.owner.ownr_ph1 || ""} - - - {job.owner.ownr_ph2 || ""} - - - {job.owner.ownr_ph2 || ""} - - - {`${job.owner.ownr_addr1 || ""} ${job.owner.ownr_addr2 || ""} ${ - job.owner.ownr_city || "" - } ${job.owner.ownr_st || ""} ${job.owner.ownr_zip || ""} ${ - job.owner.ownr_ctry || "" - } `} - - - {job.owner.ownr_ea || ""} - - - - - - - - - ); +export default function OwnerTagPopoverComponent({job}) { + const {t} = useTranslation(); + const content = ( +
+ +
+ + + + + + {job.ownr_ph1 || ""} + + + {job.ownr_ph2 || ""} + + + {`${job.ownr_addr1 || ""} ${job.ownr_addr2 || ""} ${ + job.ownr_city || "" + } ${job.ownr_st || ""} ${job.ownr_zip || ""}`} + + + {job.ownr_ea || ""} + + + + + + + + + + {job.owner.ownr_ph1 || ""} + + + {job.owner.ownr_ph2 || ""} + + + {job.owner.ownr_ph2 || ""} + + + {`${job.owner.ownr_addr1 || ""} ${job.owner.ownr_addr2 || ""} ${ + job.owner.ownr_city || "" + } ${job.owner.ownr_st || ""} ${job.owner.ownr_zip || ""} ${ + job.owner.ownr_ctry || "" + } `} + + + {job.owner.ownr_ea || ""} + + + + + + + + + ); - return ( - - - - {job.owner ? OwnerNameDisplayFunction(job) : t("jobs.errors.noowner")} - - - - ); + return ( + + + + {job.owner ? OwnerNameDisplayFunction(job) : t("jobs.errors.noowner")} + + + + ); } diff --git a/client/src/components/owners-list/owners-list.component.jsx b/client/src/components/owners-list/owners-list.component.jsx index f0ed2f4c2..11338c893 100644 --- a/client/src/components/owners-list/owners-list.component.jsx +++ b/client/src/components/owners-list/owners-list.component.jsx @@ -1,138 +1,138 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory, useLocation } from "react-router-dom"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link, useLocation, useNavigate} from "react-router-dom"; import PhoneFormatter from "../../utils/PhoneFormatter"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import {pageLimit} from "../../utils/config"; export default function OwnersListComponent({ - loading, - owners, - total, - refetch, -}) { - const search = queryString.parse(useLocation().search); - const { - page, - // sortcolumn, sortorder - } = search; - const history = useHistory(); + loading, + owners, + total, + refetch, + }) { + const search = queryString.parse(useLocation().search); + const { + page, + // sortcolumn, sortorder + } = search; + const history = useNavigate(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("owners.fields.name"), - dataIndex: "name", - key: "name", - render: (text, record) => ( - - - - ), - }, - { - title: t("owners.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - render: (text, record) => { - return {record.ownr_ph1}; - }, - }, - { - title: t("owners.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - render: (text, record) => { - return {record.ownr_ph2}; - }, - }, - { - title: t("owners.fields.ownr_ea"), - dataIndex: "ownr_ea", - key: "ownr_ea", - }, - { - title: t("owners.fields.address"), - dataIndex: "address", - key: "address", - render: (text, record) => { - return ( -
{`${record.ownr_addr1 || ""} ${record.ownr_addr2 || ""} ${ - record.ownr_city || "" - } ${record.ownr_st || ""} ${record.ownr_zip || ""}`}
- ); - }, - }, - ]; + const columns = [ + { + title: t("owners.fields.name"), + dataIndex: "name", + key: "name", + render: (text, record) => ( + + + + ), + }, + { + title: t("owners.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + render: (text, record) => { + return {record.ownr_ph1}; + }, + }, + { + title: t("owners.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + render: (text, record) => { + return {record.ownr_ph2}; + }, + }, + { + title: t("owners.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + }, + { + title: t("owners.fields.address"), + dataIndex: "address", + key: "address", + render: (text, record) => { + return ( +
{`${record.ownr_addr1 || ""} ${record.ownr_addr2 || ""} ${ + record.ownr_city || "" + } ${record.ownr_st || ""} ${record.ownr_zip || ""}`}
+ ); + }, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - search.sortcolumn = sorter.columnKey; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - + + )} + + { + if (value?.length >= 3) { + search.search = value; + } else { + delete search.search; + } + history({search: queryString.stringify(search)}); + }} + enterButton + /> + + } + > +
- {t("general.actions.clear")} - - - )} - - { - if (value?.length >= 3) { - search.search = value; - } else { - delete search.search; - } - history.push({ search: queryString.stringify(search) }); - }} - enterButton - /> - - } - > -
- - ); + columns={columns} + rowKey="id" + scroll={{x: true}} + dataSource={owners} + onChange={handleTableChange} + /> + + ); } diff --git a/client/src/components/owners-list/owners-list.container.jsx b/client/src/components/owners-list/owners-list.container.jsx index 7303c4222..343638764 100644 --- a/client/src/components/owners-list/owners-list.container.jsx +++ b/client/src/components/owners-list/owners-list.container.jsx @@ -1,44 +1,44 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; -import { QUERY_ALL_OWNERS_PAGINATED } from "../../graphql/owners.queries"; +import {QUERY_ALL_OWNERS_PAGINATED} from "../../graphql/owners.queries"; import AlertComponent from "../alert/alert.component"; import OwnersListComponent from "./owners-list.component"; import queryString from "query-string"; -import { useLocation } from "react-router-dom"; +import {useLocation} from "react-router-dom"; import {pageLimit} from "../../utils/config"; export default function OwnersListContainer() { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, search } = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_OWNERS_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "created_at"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, search} = searchParams; + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_OWNERS_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + search: search || "", + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "created_at"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); - if (error) return ; - return ( - - ); + if (error) return ; + return ( + + ); } diff --git a/client/src/components/partner-ping/partner-ping.component.jsx b/client/src/components/partner-ping/partner-ping.component.jsx index 920dd9ee4..299f52aed 100644 --- a/client/src/components/partner-ping/partner-ping.component.jsx +++ b/client/src/components/partner-ping/partner-ping.component.jsx @@ -1,65 +1,66 @@ import axios from "axios"; -import React, { useEffect } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setPartnerVersion } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setPartnerVersion} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import {store} from '../../redux/store' + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) - setPartnerVersion: (version) => dispatch(setPartnerVersion(version)), + //setUserLanguage: language => dispatch(setUserLanguage(language)) + setPartnerVersion: (version) => dispatch(setPartnerVersion(version)), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PartnerPingComponent); -export function PartnerPingComponent({ bodyshop, }) { - useEffect(() => { - // Create an scoped async function in the hook +export function PartnerPingComponent({bodyshop,}) { + useEffect(() => { + // Create an scoped async function in the hook - // Execute the created function directly - checkPartnerStatus(bodyshop); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [bodyshop]); + // Execute the created function directly + checkPartnerStatus(bodyshop); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [bodyshop]); - return <>; + return <>; } export async function checkPartnerStatus(bodyshop) { - if (!bodyshop) return; - try { - //if (process.env.NODE_ENV === "development") return; - const PartnerResponse = await axios.post("http://localhost:1337/ping/"); - // const { - // appver, //qbpath - // } = PartnerResponse.data; - console.log(PartnerResponse.data) - store.dispatch(setPartnerVersion(PartnerResponse.data)); - // if ( - // checkAcctPath && - // !qbpath && - // !( - // bodyshop && - // (bodyshop.cdk_dealerid || - // bodyshop.pbs_serialnumber || - // bodyshop.accountingconfig.qbo) - // ) - // ) { - // notification["error"]({ - // title: "", - // message: i18n.t("general.messages.noacctfilepath"), - // }); - // } - } catch (error) { - console.log("ImEX Online Partner is not running.", error); - // notification["error"]({ - // title: "", - // message: i18n.t("general.messages.partnernotrunning"), - // }); - } + if (!bodyshop) return; + try { + //if (process.env.NODE_ENV === "development") return; + const PartnerResponse = await axios.post("http://localhost:1337/ping/"); + // const { + // appver, //qbpath + // } = PartnerResponse.data; + console.log(PartnerResponse.data) + store.dispatch(setPartnerVersion(PartnerResponse.data)); + // if ( + // checkAcctPath && + // !qbpath && + // !( + // bodyshop && + // (bodyshop.cdk_dealerid || + // bodyshop.pbs_serialnumber || + // bodyshop.accountingconfig.qbo) + // ) + // ) { + // notification["error"]({ + // title: "", + // message: i18n.t("general.messages.noacctfilepath"), + // }); + // } + } catch (error) { + console.log("ImEX Online Partner is not running.", error); + // notification["error"]({ + // title: "", + // message: i18n.t("general.messages.partnernotrunning"), + // }); + } } diff --git a/client/src/components/parts-dispatch-expander/parts-dispatch-expander.component.jsx b/client/src/components/parts-dispatch-expander/parts-dispatch-expander.component.jsx index 26130bf50..a32111e9c 100644 --- a/client/src/components/parts-dispatch-expander/parts-dispatch-expander.component.jsx +++ b/client/src/components/parts-dispatch-expander/parts-dispatch-expander.component.jsx @@ -1,81 +1,81 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Col, Row, Table, notification } from "antd"; -import moment from "moment-business-days"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Col, notification, Row, Table} from "antd"; +import day from "../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_PARTS_DISPATCH_LINE } from "../../graphql/parts-dispatch.queries"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; +import {UPDATE_PARTS_DISPATCH_LINE} from "../../graphql/parts-dispatch.queries"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; -export default function PartsDispatchExpander({ dispatch, job }) { - const { t } = useTranslation(); - const [updateDispatchLine] = useMutation(UPDATE_PARTS_DISPATCH_LINE); +export default function PartsDispatchExpander({dispatch, job}) { + const {t} = useTranslation(); + const [updateDispatchLine] = useMutation(UPDATE_PARTS_DISPATCH_LINE); - const handleAccept = async ({ partsDispatchLineId }) => { - const accepted_at = moment(); - const result = await updateDispatchLine({ - variables: { id: partsDispatchLineId, line: { accepted_at } }, - optimisticResponse: { - update_parts_dispatch_lines_by_pk: { - accepted_at, - id: partsDispatchLineId, + const handleAccept = async ({partsDispatchLineId}) => { + const accepted_at = day(); + const result = await updateDispatchLine({ + variables: {id: partsDispatchLineId, line: {accepted_at}}, + optimisticResponse: { + update_parts_dispatch_lines_by_pk: { + accepted_at, + id: partsDispatchLineId, + }, + }, + }); + if (result.errors) { + notification.open({ + type: "error", + message: t("parts_dispatch.errors.accepting", { + error: JSON.stringify(result.errors), + }), + }); + } + }; + + const columns = [ + { + title: t("joblines.fields.part_qty"), + dataIndex: "quantity", + key: "quantity", + width: "10%", + //sorter: (a, b) => alphaSort(a.number, b.number), }, - }, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("parts_dispatch.errors.accepting", { - error: JSON.stringify(result.errors), - }), - }); - } - }; + { + title: t("joblines.fields.line_desc"), + dataIndex: "joblineid", + key: "joblineid", + //sorter: (a, b) => alphaSort(a.number, b.number), + render: (text, record) => record.jobline.line_desc, + }, + { + title: t("parts_dispatch_lines.fields.accepted_at"), + dataIndex: "accepted_at", + key: "accepted_at", + width: "20%", - const columns = [ - { - title: t("joblines.fields.part_qty"), - dataIndex: "quantity", - key: "quantity", - width: "10%", - //sorter: (a, b) => alphaSort(a.number, b.number), - }, - { - title: t("joblines.fields.line_desc"), - dataIndex: "joblineid", - key: "joblineid", - //sorter: (a, b) => alphaSort(a.number, b.number), - render: (text, record) => record.jobline.line_desc, - }, - { - title: t("parts_dispatch_lines.fields.accepted_at"), - dataIndex: "accepted_at", - key: "accepted_at", - width: "20%", - - //sorter: (a, b) => alphaSort(a.number, b.number), - render: (text, record) => - record.accepted_at ? ( - {record.accepted_at} - ) : ( - - ), - }, - ]; - return ( - - - -
- - - - ); + //sorter: (a, b) => alphaSort(a.number, b.number), + render: (text, record) => + record.accepted_at ? ( + {record.accepted_at} + ) : ( + + ), + }, + ]; + return ( + + + +
+ + + + ); } diff --git a/client/src/components/parts-dispatch-table/parts-dispatch-table.component.jsx b/client/src/components/parts-dispatch-table/parts-dispatch-table.component.jsx index 461bad6cd..103dba636 100644 --- a/client/src/components/parts-dispatch-table/parts-dispatch-table.component.jsx +++ b/client/src/components/parts-dispatch-table/parts-dispatch-table.component.jsx @@ -1,155 +1,152 @@ -import { - MinusCircleTwoTone, - PlusCircleTwoTone, - SyncOutlined, -} from "@ant-design/icons"; -import { Button, Card, Input, Space, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { alphaSort } from "../../utils/sorters"; +import {MinusCircleTwoTone, PlusCircleTwoTone, SyncOutlined,} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {alphaSort} from "../../utils/sorters"; import PartsDispatchExpander from "../parts-dispatch-expander/parts-dispatch-expander.component"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, - bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); export function PartDispatchTableComponent({ - bodyshop, - jobRO, - job, - billsQuery, - handleOnRowClick, -}) { - const { t } = useTranslation(); + bodyshop, + jobRO, + job, + billsQuery, + handleOnRowClick, + }) { + const {t} = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - // const search = queryString.parse(useLocation().search); - // const selectedBill = search.billid; - const [searchText, setSearchText] = useState(""); + const [state, setState] = useState({ + sortedInfo: {}, + }); + // const search = queryString.parse(useLocation().search); + // const selectedBill = search.billid; + const [searchText, setSearchText] = useState(""); - const Templates = TemplateList("job_special"); + const Templates = TemplateList("job_special"); - const { refetch } = billsQuery; + const {refetch} = billsQuery; - const recordActions = (record) => ( - - - - ); - const columns = [ - { - title: t("parts_dispatch.fields.number"), - dataIndex: "number", - key: "number", - sorter: (a, b) => alphaSort(a.number, b.number), - width: "10%", - sortOrder: - state.sortedInfo.columnKey === "number" && state.sortedInfo.order, - }, - { - title: t("timetickets.fields.employee"), - dataIndex: "employeeid", - key: "employeeid", - sorter: (a, b) => alphaSort(a.employeeid, b.employeeid), - sortOrder: - state.sortedInfo.columnKey === "employeeid" && state.sortedInfo.order, - render: (text, record) => { - const e = bodyshop.employees.find((e) => e.id === record.employeeid); - return `${e?.first_name || ""} ${e?.last_name || ""}`.trim(); - }, - }, - { - title: t("parts_dispatch.fields.percent_accepted"), - dataIndex: "percent_accepted", - key: "percent_accepted", - - render: (text, record) => - record.parts_dispatch_lines.length > 0 - ? ` - ${( - (record.parts_dispatch_lines.filter((l) => l.accepted_at) - .length / - record.parts_dispatch_lines.length) * - 100 - ).toFixed(0)}%` - : "0%", - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - width: "10%", - render: (text, record) => recordActions(record, true), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - return ( - ( - - - { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> + - } - > -
( - - ), - rowExpandable: (record) => true, + ); + const columns = [ + { + title: t("parts_dispatch.fields.number"), + dataIndex: "number", + key: "number", + sorter: (a, b) => alphaSort(a.number, b.number), + width: "10%", + sortOrder: + state.sortedInfo.columnKey === "number" && state.sortedInfo.order, + }, + { + title: t("timetickets.fields.employee"), + dataIndex: "employeeid", + key: "employeeid", + sorter: (a, b) => alphaSort(a.employeeid, b.employeeid), + sortOrder: + state.sortedInfo.columnKey === "employeeid" && state.sortedInfo.order, + render: (text, record) => { + const e = bodyshop.employees.find((e) => e.id === record.employeeid); + return `${e?.first_name || ""} ${e?.last_name || ""}`.trim(); + }, + }, + { + title: t("parts_dispatch.fields.percent_accepted"), + dataIndex: "percent_accepted", + key: "percent_accepted", - expandIcon: ({ expanded, onExpand, record }) => - expanded ? ( - onExpand(record, e)} /> - ) : ( - onExpand(record, e)} /> - ), - }} - columns={columns} - rowKey="id" - dataSource={billsQuery.data ? billsQuery.data.parts_dispatch : []} - onChange={handleTableChange} - /> - - ); + render: (text, record) => + record.parts_dispatch_lines.length > 0 + ? ` + ${( + (record.parts_dispatch_lines.filter((l) => l.accepted_at) + .length / + record.parts_dispatch_lines.length) * + 100 + ).toFixed(0)}%` + : "0%", + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + width: "10%", + render: (text, record) => recordActions(record, true), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + return ( + + + + { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> + + } + > +
( + + ), + rowExpandable: (record) => true, + + expandIcon: ({expanded, onExpand, record}) => + expanded ? ( + onExpand(record, e)}/> + ) : ( + onExpand(record, e)}/> + ), + }} + columns={columns} + rowKey="id" + dataSource={billsQuery.data ? billsQuery.data.parts_dispatch : []} + onChange={handleTableChange} + /> + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PartDispatchTableComponent); diff --git a/client/src/components/parts-order-backorder-eta/parts-order-backorder-eta.component.jsx b/client/src/components/parts-order-backorder-eta/parts-order-backorder-eta.component.jsx index 57df2ef7a..c4f7908a1 100644 --- a/client/src/components/parts-order-backorder-eta/parts-order-backorder-eta.component.jsx +++ b/client/src/components/parts-order-backorder-eta/parts-order-backorder-eta.component.jsx @@ -1,91 +1,92 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification, Popover, Spin } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { MUTATION_UPDATE_BO_ETA } from "../../graphql/parts-orders.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Popover, Spin} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {MUTATION_UPDATE_BO_ETA} from "../../graphql/parts-orders.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {DateFormatter} from "../../utils/DateFormatter"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; -import { CalendarFilled } from "@ant-design/icons"; +import {CalendarFilled} from "@ant-design/icons"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export function PartsOrderBackorderEta({ - backordered_eta, - partsOrderStatus, - partsLineId, - jobLineId, - disabled, - bodyshop, -}) { - const [visibility, setVisibility] = useState(false); - const [loading, setLoading] = useState(false); - const [updateBoDate] = useMutation(MUTATION_UPDATE_BO_ETA); - const { t } = useTranslation(); - const [form] = Form.useForm(); + backordered_eta, + partsOrderStatus, + partsLineId, + jobLineId, + disabled, + bodyshop, + }) { + const [visibility, setVisibility] = useState(false); + const [loading, setLoading] = useState(false); + const [updateBoDate] = useMutation(MUTATION_UPDATE_BO_ETA); + const {t} = useTranslation(); + const [form] = Form.useForm(); - const isAlreadyBackordered = - bodyshop.md_order_statuses.default_bo === partsOrderStatus; + const isAlreadyBackordered = + bodyshop.md_order_statuses.default_bo === partsOrderStatus; - const handleFinish = async (values) => { - setLoading(true); - logImEXEvent("job_parts_backorder_update_eta"); + const handleFinish = async (values) => { + setLoading(true); + logImEXEvent("job_parts_backorder_update_eta"); - const result = await updateBoDate({ - variables: { - partsLineId, - partsOrder: { backordered_eta: values.eta }, - }, - }); + const result = await updateBoDate({ + variables: { + partsLineId, + partsOrder: {backordered_eta: values.eta}, + }, + }); - if (!!result.errors) { - notification["error"]({ - message: t("parts_orders.errors.backordering", { - message: JSON.stringify(result.errors), - }), - }); - } + if (!!result.errors) { + notification["error"]({ + message: t("parts_orders.errors.backordering", { + message: JSON.stringify(result.errors), + }), + }); + } - setVisibility(false); - setLoading(false); - }; + setVisibility(false); + setLoading(false); + }; - const handlePopover = (e) => { - setVisibility(true); - }; + const handlePopover = (e) => { + setVisibility(true); + }; - const popContent = ( -
-
- - - - - - -
- ); + const popContent = ( +
+
+ + + + + + +
+ ); - return ( - - {backordered_eta} - {isAlreadyBackordered && ( - - )} - {loading && } - - ); + return ( + + {backordered_eta} + {isAlreadyBackordered && ( + + )} + {loading && } + + ); } export default connect(mapStateToProps, null)(PartsOrderBackorderEta); diff --git a/client/src/components/parts-order-cm-received/parts-order-cm-received.component.jsx b/client/src/components/parts-order-cm-received/parts-order-cm-received.component.jsx index ed08ea3ea..4ad6d294e 100644 --- a/client/src/components/parts-order-cm-received/parts-order-cm-received.component.jsx +++ b/client/src/components/parts-order-cm-received/parts-order-cm-received.component.jsx @@ -1,66 +1,66 @@ -import { useMutation } from "@apollo/client"; -import { Checkbox, notification, Space, Spin } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { MUTATION_UPDATE_PO_CM_REECEIVED } from "../../graphql/parts-orders.queries"; +import {useMutation} from "@apollo/client"; +import {Checkbox, notification, Space, Spin} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {MUTATION_UPDATE_PO_CM_REECEIVED} from "../../graphql/parts-orders.queries"; export default function PartsOrderCmReceived({ - checked, - orderLineId, - partsOrderId, -}) { - const [updateLine] = useMutation(MUTATION_UPDATE_PO_CM_REECEIVED); - const { t } = useTranslation(); + checked, + orderLineId, + partsOrderId, + }) { + const [updateLine] = useMutation(MUTATION_UPDATE_PO_CM_REECEIVED); + const {t} = useTranslation(); - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(false); - const handleChange = async (e) => { - setLoading(true); - const result = await updateLine({ - variables: { - partsLineId: orderLineId, - partsOrder: { cm_received: e.target.checked }, - }, - update(cache) { - cache.modify({ - id: cache.identify({ - id: partsOrderId, - __typename: "parts_orders", - }), - - fields: { - parts_order_lines(ex, { readField }) { - console.log(ex); - return ex.map((lineref) => { - if (orderLineId.id !== readField("id", lineref)) { - lineref.cm_received = e.target.checked; - } - return lineref; - }); + const handleChange = async (e) => { + setLoading(true); + const result = await updateLine({ + variables: { + partsLineId: orderLineId, + partsOrder: {cm_received: e.target.checked}, + }, + update(cache) { + cache.modify({ + id: cache.identify({ + id: partsOrderId, + __typename: "parts_orders", + }), + + fields: { + parts_order_lines(ex, {readField}) { + console.log(ex); + return ex.map((lineref) => { + if (orderLineId.id !== readField("id", lineref)) { + lineref.cm_received = e.target.checked; + } + return lineref; + }); + }, + }, + }); }, - }, }); - }, - }); - if (!!!result.errors) { - notification["success"]({ - message: t("parts_orders.successes.line_updated"), - }); - } else { - notification["error"]({ - message: t("parts_orders.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; + if (!!!result.errors) { + notification["success"]({ + message: t("parts_orders.successes.line_updated"), + }); + } else { + notification["error"]({ + message: t("parts_orders.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; - return ( - - - {loading && } - - ); + return ( + + + {loading && } + + ); } diff --git a/client/src/components/parts-order-delete-line/parts-order-delete-line.component.jsx b/client/src/components/parts-order-delete-line/parts-order-delete-line.component.jsx index 0edad9bb5..17d4f6fed 100644 --- a/client/src/components/parts-order-delete-line/parts-order-delete-line.component.jsx +++ b/client/src/components/parts-order-delete-line/parts-order-delete-line.component.jsx @@ -1,47 +1,47 @@ import React from "react"; -import { Button, Popconfirm } from "antd"; -import { DeleteFilled } from "@ant-design/icons"; -import { useTranslation } from "react-i18next"; -import { DELETE_PARTS_ORDER_LINE } from "../../graphql/parts-orders.queries"; -import { useMutation } from "@apollo/client"; +import {Button, Popconfirm} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {useTranslation} from "react-i18next"; +import {DELETE_PARTS_ORDER_LINE} from "../../graphql/parts-orders.queries"; +import {useMutation} from "@apollo/client"; export default function PartsOrderDeleteLine({ - disabled, - partsLineId, - partsOrderId, -}) { - const { t } = useTranslation(); - const [deletePartsOrderLine] = useMutation(DELETE_PARTS_ORDER_LINE); - return ( - { - //Delete the parts return.! + disabled, + partsLineId, + partsOrderId, + }) { + const {t} = useTranslation(); + const [deletePartsOrderLine] = useMutation(DELETE_PARTS_ORDER_LINE); + return ( + { + //Delete the parts return.! - await deletePartsOrderLine({ - variables: { partsOrderLineId: partsLineId }, - update(cache) { - cache.modify({ - id: cache.identify({ - __typename: "parts_orders", - id: partsOrderId, - }), - fields: { - parts_order_lines(cached, { readField }) { - return cached.filter((c) => { - return readField("id", c) !== partsLineId; - }); - }, - }, - }); - }, - }); - }} - > - - - ); + await deletePartsOrderLine({ + variables: {partsOrderLineId: partsLineId}, + update(cache) { + cache.modify({ + id: cache.identify({ + __typename: "parts_orders", + id: partsOrderId, + }), + fields: { + parts_order_lines(cached, {readField}) { + return cached.filter((c) => { + return readField("id", c) !== partsLineId; + }); + }, + }, + }); + }, + }); + }} + > + + + ); } diff --git a/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx b/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx index bd9b822f3..bb87bf91d 100644 --- a/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx +++ b/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx @@ -1,107 +1,107 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, notification, Popover } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { MUTATION_BACKORDER_PART_LINE } from "../../graphql/parts-orders.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Popover} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {MUTATION_BACKORDER_PART_LINE} from "../../graphql/parts-orders.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export function PartsOrderLineBackorderButton({ - partsOrderStatus, - partsLineId, - jobLineId, - disabled, - bodyshop, -}) { - const [visibility, setVisibility] = useState(false); - const [loading, setLoading] = useState(false); - const [backorderLine] = useMutation(MUTATION_BACKORDER_PART_LINE); - const { t } = useTranslation(); - const [form] = Form.useForm(); + partsOrderStatus, + partsLineId, + jobLineId, + disabled, + bodyshop, + }) { + const [visibility, setVisibility] = useState(false); + const [loading, setLoading] = useState(false); + const [backorderLine] = useMutation(MUTATION_BACKORDER_PART_LINE); + const {t} = useTranslation(); + const [form] = Form.useForm(); - const isAlreadyBackordered = - bodyshop.md_order_statuses.default_bo === partsOrderStatus; + const isAlreadyBackordered = + bodyshop.md_order_statuses.default_bo === partsOrderStatus; - const handleFinish = async (values) => { - setLoading(true); - logImEXEvent("job_parts_backorder"); + const handleFinish = async (values) => { + setLoading(true); + logImEXEvent("job_parts_backorder"); - const partsOrder = { - status: isAlreadyBackordered - ? bodyshop.md_order_statuses.default_received || "Received*" - : bodyshop.md_order_statuses.default_bo || "Backordered*", + const partsOrder = { + status: isAlreadyBackordered + ? bodyshop.md_order_statuses.default_received || "Received*" + : bodyshop.md_order_statuses.default_bo || "Backordered*", + }; + if (!isAlreadyBackordered) { + partsOrder.backordered_on = new Date(); + partsOrder.backordered_eta = values.eta; + } + + const result = await backorderLine({ + variables: { + jobLineId, + partsLineId, + partsOrder: partsOrder, + status: partsOrder.status, + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("parts_orders.errors.backordering", { + message: JSON.stringify(result.errors), + }), + }); + } + + setVisibility(false); + setLoading(false); }; - if (!isAlreadyBackordered) { - partsOrder.backordered_on = new Date(); - partsOrder.backordered_eta = values.eta; - } - const result = await backorderLine({ - variables: { - jobLineId, - partsLineId, - partsOrder: partsOrder, - status: partsOrder.status, - }, - }); + const handlePopover = (e) => { + if (isAlreadyBackordered) { + handleFinish(); + //Receive the part. + } else { + //Show the date selector to back order the part. + setVisibility(true); + } + }; - if (!!result.errors) { - notification["error"]({ - message: t("parts_orders.errors.backordering", { - message: JSON.stringify(result.errors), - }), - }); - } + const popContent = ( +
+
+ + + + + + +
+ ); - setVisibility(false); - setLoading(false); - }; - - const handlePopover = (e) => { - if (isAlreadyBackordered) { - handleFinish(); - //Receive the part. - } else { - //Show the date selector to back order the part. - setVisibility(true); - } - }; - - const popContent = ( -
-
- - - - - - -
- ); - - return ( - - - - ); + return ( + + + + ); } export default connect(mapStateToProps, null)(PartsOrderLineBackorderButton); diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx index e27d6ee4f..535f82290 100644 --- a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx +++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx @@ -1,499 +1,492 @@ -import { DeleteFilled, EyeFilled, SyncOutlined } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { - Button, - Card, - Checkbox, - Drawer, - Grid, - Input, - PageHeader, - Popconfirm, - Space, - Table, -} from "antd"; +import {DeleteFilled, EyeFilled, SyncOutlined} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Checkbox, Drawer, Grid, Input, Popconfirm, Space, Table,} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { DELETE_PARTS_ORDER } from "../../graphql/parts-orders.queries"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {DELETE_PARTS_ORDER} from "../../graphql/parts-orders.queries"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter } from "../../utils/DateFormatter"; -import { alphaSort } from "../../utils/sorters"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {DateFormatter} from "../../utils/DateFormatter"; +import {alphaSort} from "../../utils/sorters"; +import {TemplateList} from "../../utils/TemplateConstants"; import DataLabel from "../data-label/data-label.component"; import PartsOrderBackorderEta from "../parts-order-backorder-eta/parts-order-backorder-eta.component"; import PartsOrderCmReceived from "../parts-order-cm-received/parts-order-cm-received.component"; import PartsOrderDeleteLine from "../parts-order-delete-line/parts-order-delete-line.component"; -import PartsOrderLineBackorderButton from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component"; +import PartsOrderLineBackorderButton + from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component"; import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-modal.container"; import PrintWrapper from "../print-wrapper/print-wrapper.component"; const mapStateToProps = createStructuredSelector({ - jobRO: selectJobReadOnly, - bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), - setPartsReceiveContext: (context) => - dispatch(setModalContext({ context: context, modal: "partsReceive" })), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), + setPartsReceiveContext: (context) => + dispatch(setModalContext({context: context, modal: "partsReceive"})), }); export function PartsOrderListTableComponent({ - setBillEnterContext, - bodyshop, - jobRO, - job, - billsQuery, - handleOnRowClick, - setPartsReceiveContext, -}) { - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; + setBillEnterContext, + bodyshop, + jobRO, + job, + billsQuery, + handleOnRowClick, + setPartsReceiveContext, + }) { + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const bpoints = { - xs: "100%", - sm: "100%", - md: "100%", - lg: "75%", - xl: "75%", - xxl: "65%", - }; - const drawerPercentage = selectedBreakpoint - ? bpoints[selectedBreakpoint[0]] - : "100%"; - const responsibilityCenters = bodyshop.md_responsibility_centers; - const Templates = TemplateList("partsorder", { job }); + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "75%", + xl: "75%", + xxl: "65%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; + const responsibilityCenters = bodyshop.md_responsibility_centers; + const Templates = TemplateList("partsorder", {job}); - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - const search = queryString.parse(useLocation().search); - const selectedpartsorder = search.partsorderid; - const [searchText, setSearchText] = useState(""); + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + const search = queryString.parse(useLocation().search); + const selectedpartsorder = search.partsorderid; + const [searchText, setSearchText] = useState(""); - const [deletePartsOrder] = useMutation(DELETE_PARTS_ORDER); + const [deletePartsOrder] = useMutation(DELETE_PARTS_ORDER); - const parts_orders = billsQuery.data ? billsQuery.data.parts_orders : []; - const { refetch } = billsQuery; + const parts_orders = billsQuery.data ? billsQuery.data.parts_orders : []; + const {refetch} = billsQuery; - const recordActions = (record, showView = false) => ( - - {showView && ( - - )} - - { - //Delete the parts return.! + const recordActions = (record, showView = false) => ( + + {showView && ( + + )} + + { + //Delete the parts return.! - await deletePartsOrder({ - variables: { partsOrderId: record.id }, - update(cache) { - cache.modify({ - fields: { - parts_orders(existingPartsOrders, { readField }) { - return existingPartsOrders.filter( - (billref) => record.id !== readField("id", billref) - ); - }, - }, - }); - }, - }); - }} - > - - - + + - - - ); + cost_center: pol.jobline?.part_type + ? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid + ? pol.jobline.part_type !== "PAE" + ? pol.jobline.part_type + : null + : responsibilityCenters.defaults && + (responsibilityCenters.defaults.costs[ + pol.jobline.part_type + ] || + null) + : null, + }; + }), + }, + }, + }); + }} + > + {t("parts_orders.actions.receivebill")} + + + + ); - const columns = [ - { - title: t("vendors.fields.name"), - dataIndex: "vendorname", - key: "vendorname", - sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), - sortOrder: - state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, - render: (text, record) => {record.vendor.name}, - }, - { - title: t("parts_orders.fields.order_number"), - dataIndex: "order_number", - key: "order_number", - sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), - sortOrder: - state.sortedInfo.columnKey === "invoice_number" && - state.sortedInfo.order, - }, - { - title: t("parts_orders.fields.order_date"), - dataIndex: "order_date", - key: "order_date", - sorter: (a, b) => a.order_date - b.order_date, - sortOrder: - state.sortedInfo.columnKey === "order_date" && state.sortedInfo.order, - render: (text, record) => ( - {record.order_date} - ), - }, - { - title: t("parts_orders.fields.return"), - dataIndex: "return", - key: "return", - sorter: (a, b) => a.return - b.return, - sortOrder: - state.sortedInfo.columnKey === "return" && state.sortedInfo.order, - render: (text, record) => , - }, - { - title: t("parts_orders.fields.deliver_by"), - dataIndex: "deliver_by", - key: "deliver_by", - sorter: (a, b) => a.deliver_by - b.deliver_by, - sortOrder: - state.sortedInfo.columnKey === "deliver_by" && state.sortedInfo.order, - render: (text, record) => ( - {record.deliver_by} - ), - }, - { - title: t("parts_orders.fields.orderedby"), - dataIndex: "orderedby", - key: "orderedby", - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => recordActions(record, true), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const selectedPartsOrderRecord = parts_orders.find( - (r) => r.id === selectedpartsorder - ); - - const rowExpander = (record) => { const columns = [ - { - title: t("parts_orders.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - sortOrder: - state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, - }, - { - title: t("parts_orders.fields.quantity"), - dataIndex: "quantity", - key: "quantity", - sorter: (a, b) => a.quantity - b.quantity, - sortOrder: - state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, - }, - { - title: t("parts_orders.fields.act_price"), - dataIndex: "act_price", - key: "act_price", - sorter: (a, b) => a.act_price - b.act_price, - sortOrder: - state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, - render: (text, record) => ( - {record.act_price} - ), - }, - ...(selectedPartsOrderRecord && selectedPartsOrderRecord.return - ? [ - { - title: t("parts_orders.fields.cost"), - dataIndex: "cost", - key: "cost", - sorter: (a, b) => a.cost - b.cost, - sortOrder: - state.sortedInfo.columnKey === "cost" && state.sortedInfo.order, - render: (text, record) => ( - {record.cost} - ), - }, - ] - : []), - { - title: t("parts_orders.fields.part_type"), - dataIndex: "part_type", - key: "part_type", - render: (text, record) => - record.part_type - ? t(`joblines.fields.part_types.${record.part_type}`) - : null, - }, - { - title: t("parts_orders.fields.oem_partno"), - dataIndex: "oem_partno", - key: "oem_partno", - sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), - sortOrder: - state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, - }, - { - title: t("parts_orders.fields.line_remarks"), - dataIndex: "line_remarks", - key: "line_remarks", - }, - { - title: t("parts_orders.fields.status"), - dataIndex: "status", - key: "status", - }, - - ...(selectedPartsOrderRecord && selectedPartsOrderRecord.return - ? [ - { - title: t("parts_orders.fields.cm_received"), - dataIndex: "cm_received", - key: "cm_received", - render: (text, record) => ( - - ), - }, - ] - : []), - { - title: t("parts_orders.fields.backordered_on"), - dataIndex: "backordered_on", - key: "backordered_on", - render: (text, record) => {text}, - }, - { - title: t("parts_orders.fields.backordered_eta"), - dataIndex: "backordered_eta", - key: "backordered_eta", - render: (text, record) => ( - - ), - }, - - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - - - - ), - }, + { + title: t("vendors.fields.name"), + dataIndex: "vendorname", + key: "vendorname", + sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), + sortOrder: + state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + render: (text, record) => {record.vendor.name}, + }, + { + title: t("parts_orders.fields.order_number"), + dataIndex: "order_number", + key: "order_number", + sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), + sortOrder: + state.sortedInfo.columnKey === "invoice_number" && + state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.order_date"), + dataIndex: "order_date", + key: "order_date", + sorter: (a, b) => a.order_date - b.order_date, + sortOrder: + state.sortedInfo.columnKey === "order_date" && state.sortedInfo.order, + render: (text, record) => ( + {record.order_date} + ), + }, + { + title: t("parts_orders.fields.return"), + dataIndex: "return", + key: "return", + sorter: (a, b) => a.return - b.return, + sortOrder: + state.sortedInfo.columnKey === "return" && state.sortedInfo.order, + render: (text, record) => , + }, + { + title: t("parts_orders.fields.deliver_by"), + dataIndex: "deliver_by", + key: "deliver_by", + sorter: (a, b) => a.deliver_by - b.deliver_by, + sortOrder: + state.sortedInfo.columnKey === "deliver_by" && state.sortedInfo.order, + render: (text, record) => ( + {record.deliver_by} + ), + }, + { + title: t("parts_orders.fields.orderedby"), + dataIndex: "orderedby", + key: "orderedby", + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => recordActions(record, true), + }, ]; - return ( -
- -
- -
{record.comments}
-
- + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + const selectedPartsOrderRecord = parts_orders.find( + (r) => r.id === selectedpartsorder ); - }; - const filteredPartsOrders = parts_orders - ? searchText === "" - ? parts_orders - : parts_orders.filter( - (b) => - (b.order_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (b.vendor.name || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : []; + const rowExpander = (record) => { + const columns = [ + { + title: t("parts_orders.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.quantity"), + dataIndex: "quantity", + key: "quantity", + sorter: (a, b) => a.quantity - b.quantity, + sortOrder: + state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + sorter: (a, b) => a.act_price - b.act_price, + sortOrder: + state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, + render: (text, record) => ( + {record.act_price} + ), + }, + ...(selectedPartsOrderRecord && selectedPartsOrderRecord.return + ? [ + { + title: t("parts_orders.fields.cost"), + dataIndex: "cost", + key: "cost", + sorter: (a, b) => a.cost - b.cost, + sortOrder: + state.sortedInfo.columnKey === "cost" && state.sortedInfo.order, + render: (text, record) => ( + {record.cost} + ), + }, + ] + : []), + { + title: t("parts_orders.fields.part_type"), + dataIndex: "part_type", + key: "part_type", + render: (text, record) => + record.part_type + ? t(`joblines.fields.part_types.${record.part_type}`) + : null, + }, + { + title: t("parts_orders.fields.oem_partno"), + dataIndex: "oem_partno", + key: "oem_partno", + sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), + sortOrder: + state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.line_remarks"), + dataIndex: "line_remarks", + key: "line_remarks", + }, + { + title: t("parts_orders.fields.status"), + dataIndex: "status", + key: "status", + }, - return ( - - - { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> - - } - > - - handleOnRowClick(null)} - visible={selectedpartsorder} - closable - width={drawerPercentage} - > - {selectedPartsOrderRecord && rowExpander(selectedPartsOrderRecord)} - -
- - ); + ...(selectedPartsOrderRecord && selectedPartsOrderRecord.return + ? [ + { + title: t("parts_orders.fields.cm_received"), + dataIndex: "cm_received", + key: "cm_received", + render: (text, record) => ( + + ), + }, + ] + : []), + { + title: t("parts_orders.fields.backordered_on"), + dataIndex: "backordered_on", + key: "backordered_on", + render: (text, record) => {text}, + }, + { + title: t("parts_orders.fields.backordered_eta"), + dataIndex: "backordered_eta", + key: "backordered_eta", + render: (text, record) => ( + + ), + }, + + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + + + + ), + }, + ]; + + return ( +
+ +
+ +
{record.comments}
+
+ + ); + }; + + const filteredPartsOrders = parts_orders + ? searchText === "" + ? parts_orders + : parts_orders.filter( + (b) => + (b.order_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (b.vendor.name || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; + + return ( + + + { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> + + } + > + + handleOnRowClick(null)} + open={selectedpartsorder} + closable + width={drawerPercentage} + > + {selectedPartsOrderRecord && rowExpander(selectedPartsOrderRecord)} + +
+ + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PartsOrderListTableComponent); diff --git a/client/src/components/parts-order-modal/parts-order-modal-price-change.component.jsx b/client/src/components/parts-order-modal/parts-order-modal-price-change.component.jsx index d38240155..4c7c17e0d 100644 --- a/client/src/components/parts-order-modal/parts-order-modal-price-change.component.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal-price-change.component.jsx @@ -1,97 +1,95 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Dropdown, InputNumber, Menu, Space } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Dropdown, InputNumber, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -export default function PartsOrderModalPriceChange({ form, field }) { - const { t } = useTranslation(); - const menu = ( - { - if (key === "custom") return; - const values = form.getFieldsValue(); +import {useTranslation} from "react-i18next"; - const { parts_order_lines } = values; +export default function PartsOrderModalPriceChange({form, field}) { + const {t} = useTranslation(); + const menu = { + items: [ + { + key: "5", + label: t("parts_orders.labels.discount", {percent: "5%"}), + }, + { + key: "10", + label: t("parts_orders.labels.discount", {percent: "10%"}), + }, + { + key: "15", + label: t("parts_orders.labels.discount", {percent: "15%"}), + }, + { + key: "20", + label: t("parts_orders.labels.discount", {percent: "20%"}), + }, + { + key: "25", + label: t("parts_orders.labels.discount", {percent: "25%"}), + }, + { + key: "custom", + label: ( + e.stopPropagation()} + addonAfter="%" + onKeyUp={(e) => { + if (e.key === "Enter") { + const values = form.getFieldsValue(); + const {parts_order_lines} = values; - form.setFieldsValue({ - parts_order_lines: { - data: parts_order_lines.data.map((p, idx) => { - if (idx !== field.name) return p; - return { - ...p, - act_price: (p.act_price || 0) * ((100 - key) / 100), - }; - }), - }, - }); - }} - items={[ - { - key: "5", - label: t("parts_orders.labels.discount", { percent: "5%" }), - }, - { - key: "10", - label: t("parts_orders.labels.discount", { percent: "10%" }), - }, - { - key: "15", - label: t("parts_orders.labels.discount", { percent: "15%" }), - }, - { - key: "20", - label: t("parts_orders.labels.discount", { percent: "20%" }), - }, - { - key: "25", - label: t("parts_orders.labels.discount", { percent: "25%" }), - }, - { - key: "custom", - label: ( - e.stopPropagation()} - addonAfter="%" - onKeyUp={(e) => { - if (e.key === "Enter") { - const values = form.getFieldsValue(); - const { parts_order_lines } = values; - - form.setFieldsValue({ - parts_order_lines: { - data: parts_order_lines.data.map((p, idx) => { + form.setFieldsValue({ + parts_order_lines: { + data: parts_order_lines.data.map((p, idx) => { + if (idx !== field.name) return p; + console.log( + p, + e.target.value, + (p.act_price || 0) * + ((100 - (e.target.value || 0)) / 100) + ); + return { + ...p, + act_price: + (p.act_price || 0) * + ((100 - (e.target.value || 0)) / 100), + }; + }), + }, + }); + e.target.value = 0; + } + }} + min={0} + max={100} + /> + ), + }, + ], + onClick: ({key}) => { + if (key === "custom") return; + const values = form.getFieldsValue(); + const {parts_order_lines} = values; + form.setFieldsValue({ + parts_order_lines: { + data: parts_order_lines.data.map((p, idx) => { if (idx !== field.name) return p; - console.log( - p, - e.target.value, - (p.act_price || 0) * - ((100 - (e.target.value || 0)) / 100) - ); return { - ...p, - act_price: - (p.act_price || 0) * - ((100 - (e.target.value || 0)) / 100), + ...p, + act_price: (p.act_price || 0) * ((100 - key) / 100), }; - }), - }, - }); - e.target.value = 0; - } - }} - min={0} - max={100} - /> - ), - }, - ]} - /> - ); - return ( - - - % - - - - ); + }), + }, + }); + } + }; + + return ( + + + % + + + + ); } diff --git a/client/src/components/parts-order-modal/parts-order-modal.component.jsx b/client/src/components/parts-order-modal/parts-order-modal.component.jsx index 7ce456280..d7ffdb102 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.component.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.component.jsx @@ -1,23 +1,11 @@ -import { DeleteFilled, WarningFilled, DownOutlined } from "@ant-design/icons"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Divider, - Form, - Input, - InputNumber, - Radio, - Space, - Tag, - Select, - Menu, - Dropdown, - Checkbox, -} from "antd"; +import {DeleteFilled, DownOutlined, WarningFilled} from "@ant-design/icons"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Checkbox, Divider, Dropdown, Form, Input, InputNumber, Radio, Select, Space, Tag,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; @@ -26,329 +14,316 @@ import VendorSearchSelect from "../vendor-search-select/vendor-search-select.com import PartsOrderModalPriceChange from "./parts-order-modal-price-change.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PartsOrderModalComponent); -export function PartsOrderModalComponent({ - bodyshop, - vendorList, - sendTypeState, - isReturn, - preferredMake, - job, - form, -}) { - const [sendType, setSendType] = sendTypeState; - const { OEConnection } = useTreatments( - ["OEConnection"], - {}, - bodyshop.imexshopid - ); - const { OEConnection_PriceChange } = useTreatments( - ["OEConnection_PriceChange"], - {}, - bodyshop.imexshopid - ); - const { t } = useTranslation(); - const handleClick = ({ item, key, keyPath }) => { - form.setFieldsValue({ comments: item.props.value }); - }; +export function PartsOrderModalComponent({bodyshop, vendorList, sendTypeState, isReturn, preferredMake, job, form,}) { + const [sendType, setSendType] = sendTypeState; - const menu = ( -
- - {bodyshop.md_parts_order_comment.map((comment, idx) => ( - - {comment.label} - - ))} - -
- ); + const {treatments: {OEConnection, OEConnection_PriceChange}} = useSplitTreatments({ + attributes: {}, + names: ["OEConnection", "OEConnection_PriceChange"], + splitKey: bodyshop.imexshopid, + }); - return ( -
- - - - - - - - - - - {job && job.special_coverage_policy && ( - - - - {t("jobs.labels.specialcoveragepolicy")} - - - )} - {!isReturn && ( - - - - )} - {OEConnection.treatment === "on" && !isReturn && ( - - - - )} - - - - {t("parts_orders.labels.parts_order")} - - - {t("parts_orders.labels.sublet_order")} - - - - - - {t("parts_orders.labels.inthisorder")} - - - {(fields, { add, remove, move }) => { - return ( -
- {fields.map((field, index) => ( - -
- - { + form.setFieldsValue({comments: item.props.value}); + }; + + const menu = { + items: bodyshop.md_parts_order_comment.map((comment, idx) => ({ + key: idx, + label: comment.label, + value: comment.comment, + })), + onClick: handleClick + }; + + return ( +
+ + + + + - - - - - - - - - - - - { - // - // - // - } - - - - - - } - /> - - {isReturn && ( - - - - )} - - -
- { - remove(field.name); - }} - /> -
- -
-
+ }, + ]} + > +
- ))} -
- ); - }} - - - {t("parts_orders.fields.comments")} - - e.preventDefault()} - > - - - - - } - > - - + + + + {job && job.special_coverage_policy && ( + + + + {t("jobs.labels.specialcoveragepolicy")} + + + )} + {!isReturn && ( + + + + )} + {OEConnection.treatment === "on" && !isReturn && ( + + + + )} - - {() => { - const is_quote = form.getFieldValue("is_quote"); - if (is_quote) setSendType("oec"); - return ( - setSendType(e.target.value)} + + + + {t("parts_orders.labels.parts_order")} + + + {t("parts_orders.labels.sublet_order")} + + + + + + {t("parts_orders.labels.inthisorder")} + + + {(fields, {add, remove, move}) => { + return ( +
+ {fields.map((field, index) => ( + +
+ + + + + + + + + + + + + + { + // + // + // + } + + + + + + } + /> + + {isReturn && ( + + + + )} + + +
+ { + remove(field.name); + }} + /> +
+ +
+
+
+ ))} +
+ ); + }} +
+ + {t("parts_orders.fields.comments")} + + e.preventDefault()} + > + + + + + } > - - {t("general.labels.none")} - - - {t("parts_orders.labels.email")} - - - {t("parts_orders.labels.print")} - - {OEConnection.treatment === "on" && !isReturn && ( - {t("parts_orders.labels.oec")} - )} -
- ); - }} -
-
- ); + + + + + {() => { + const is_quote = form.getFieldValue("is_quote"); + if (is_quote) setSendType("oec"); + return ( + setSendType(e.target.value)} + > + + {t("general.labels.none")} + + + {t("parts_orders.labels.email")} + + + {t("parts_orders.labels.print")} + + {OEConnection.treatment === "on" && !isReturn && ( + {t("parts_orders.labels.oec")} + )} + + ); + }} + +
+ ); } diff --git a/client/src/components/parts-order-modal/parts-order-modal.container.jsx b/client/src/components/parts-order-modal/parts-order-modal.container.jsx index 0f30012a3..35f6db84d 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.container.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.container.jsx @@ -1,395 +1,388 @@ -import { useMutation, useQuery, useApolloClient } from "@apollo/client"; -import { Form, Modal, notification } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent, auth } from "../../firebase/firebase.utils"; -import { UPDATE_JOB_LINE_STATUS } from "../../graphql/jobs-lines.queries"; -import { - INSERT_NEW_PARTS_ORDERS, - QUERY_PARTS_ORDER_OEC, -} from "../../graphql/parts-orders.queries"; -import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import { - setModalContext, - toggleModalVisible, -} from "../../redux/modals/modals.actions"; -import { selectPartsOrder } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useApolloClient, useMutation, useQuery} from "@apollo/client"; +import {Form, Modal, notification} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB_LINE_STATUS} from "../../graphql/jobs-lines.queries"; +import {INSERT_NEW_PARTS_ORDERS, QUERY_PARTS_ORDER_OEC,} from "../../graphql/parts-orders.queries"; +import {QUERY_ALL_VENDORS_FOR_ORDER} from "../../graphql/vendors.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {setModalContext, toggleModalVisible,} from "../../redux/modals/modals.actions"; +import {selectPartsOrder} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import PartsOrderModalComponent from "./parts-order-modal.component"; import axios from "axios"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; import _ from "lodash"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, - partsOrderModal: selectPartsOrder, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + partsOrderModal: selectPartsOrder, }); const mapDispatchToProps = (dispatch) => ({ - setEmailOptions: (e) => dispatch(setEmailOptions(e)), - toggleModalVisible: () => dispatch(toggleModalVisible("partsOrder")), - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + toggleModalVisible: () => dispatch(toggleModalVisible("partsOrder")), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function PartsOrderModalContainer({ - partsOrderModal, - toggleModalVisible, - currentUser, - bodyshop, - setEmailOptions, - setBillEnterContext, - insertAuditTrail, -}) { - const { t } = useTranslation(); - const client = useApolloClient(); - const { OEConnection_PriceChange } = useTreatments( - ["OEConnection_PriceChange"], - {}, - bodyshop.imexshopid - ); - const { visible, context, actions } = partsOrderModal; - const { - jobId, - linesToOrder, - isReturn, - vendorId, - returnFromBill, - invoiceNumber, - job, - } = context; + partsOrderModal, + toggleModalVisible, + currentUser, + bodyshop, + setEmailOptions, + setBillEnterContext, + insertAuditTrail, + }) { + const {t} = useTranslation(); + const client = useApolloClient(); - const { refetch } = actions; - const [form] = Form.useForm(); - const [saving, setSaving] = useState(false); - const sendTypeState = useState("e"); - const sendType = sendTypeState[0]; - - const { loading, error, data } = useQuery(QUERY_ALL_VENDORS_FOR_ORDER, { - skip: !visible, - variables: { jobId: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS); - const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS); - const [updateJob] = useMutation(UPDATE_JOB); - - const handleFinish = async ({ - order_type, - removefrompartsqueue, - is_quote, - ...values - }) => { - logImEXEvent("parts_order_insert"); - setSaving(true); - let insertResult; - - insertResult = await insertPartOrder({ - variables: { - po: [ - { - ...values, - order_date: moment().format("YYYY-MM-DD"), - orderedby: currentUser.email, - jobid: jobId, - user_email: currentUser.email, - return: isReturn, - status: is_quote - ? bodyshop.md_order_statuses.default_quote || "Quote" - : bodyshop.md_order_statuses.default_ordered || "Ordered*", - }, - ], - }, - refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"], - }); - if (!!insertResult.errors) { - notification["error"]({ - message: t("parts_orders.errors.creating"), - description: JSON.stringify(insertResult.errors), - }); - return; - } - notification["success"]({ - message: values.isReturn - ? t("parts_orders.successes.return_created") - : t("parts_orders.successes.created"), - }); - insertAuditTrail({ - jobid: jobId, - operation: isReturn - ? AuditTrailMapping.jobspartsreturn( - insertResult.data.insert_parts_orders.returning[0].order_number - ) - : AuditTrailMapping.jobspartsorder( - insertResult.data.insert_parts_orders.returning[0].order_number - ), + const {treatments: {OEConnection_PriceChange}} = useSplitTreatments({ + attributes: {}, + names: ["OEConnection_PriceChange"], + splitKey: bodyshop.imexshopid, }); - const jobLinesResult = await updateJobLines({ - variables: { - ids: values.parts_order_lines.data - .filter((item) => item.job_line_id) - .map((item) => item.job_line_id), - status: isReturn - ? bodyshop.md_order_statuses.default_returned || "Returned*" - : is_quote - ? bodyshop.md_order_statuses.default_quote || "Quote" - : bodyshop.md_order_statuses.default_ordered || "Ordered*", - }, + const {open, context, actions} = partsOrderModal; + const { + jobId, + linesToOrder, + isReturn, + vendorId, + returnFromBill, + invoiceNumber, + job, + } = context; + + const {refetch} = actions; + const [form] = Form.useForm(); + const [saving, setSaving] = useState(false); + const sendTypeState = useState("e"); + const sendType = sendTypeState[0]; + + const {loading, error, data} = useQuery(QUERY_ALL_VENDORS_FOR_ORDER, { + skip: !open, + variables: {jobId: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - if (!isReturn && removefrompartsqueue) { - await updateJob({ - variables: { - jobId: jobId, - job: { - queued_for_parts: false, - }, - }, - }); - } + const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS); + const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS); + const [updateJob] = useMutation(UPDATE_JOB); - if (!!jobLinesResult.errors) { - notification["error"]({ - message: t("parts_orders.errors.creating"), - description: JSON.stringify(jobLinesResult.errors), - }); - } + const handleFinish = async ({ + order_type, + removefrompartsqueue, + is_quote, + ...values + }) => { + logImEXEvent("parts_order_insert"); + setSaving(true); + let insertResult; - if (values.vendorid === bodyshop.inhousevendorid) { - setBillEnterContext({ - actions: { refetch: refetch }, - context: { - disableInvNumber: true, - job: { id: jobId }, - bill: { - vendorid: bodyshop.inhousevendorid, - invoice_number: "ih", - isinhouse: true, - date: new moment(), - total: 0, - billlines: values.parts_order_lines.data.map((p) => { - return { - joblineid: p.job_line_id, - actual_price: p.act_price, - actual_cost: 0, //p.act_price, - line_desc: p.line_desc, - line_remarks: p.line_remarks, - part_type: p.part_type, - quantity: p.quantity || 1, - applicable_taxes: { - local: false, - state: false, - federal: false, - }, - }; - }), - }, - }, - }); - toggleModalVisible(); - return; - } - - if (refetch) refetch(); - - const Templates = TemplateList("partsorder", context); - - if (sendType === "e") { - const matchingVendor = data.vendors.filter( - (item) => item.id === values.vendorid - )[0]; - - let vendorEmails = - matchingVendor && - matchingVendor.email && - matchingVendor.email.split(RegExp("[;,]")); - - GenerateDocument( - { - name: isReturn - ? Templates.parts_return_slip.key - : order_type === "parts_order" - ? Templates.parts_order.key - : Templates.sublet_order.key, - variables: { - id: insertResult.data.insert_parts_orders.returning[0].id, - }, - }, - { - to: matchingVendor ? vendorEmails : null, - replyTo: bodyshop.email, - subject: isReturn - ? Templates.parts_return_slip.subject - : order_type === "parts_order" - ? Templates.parts_order.subject - : Templates.sublet_order.subject, - }, - "e", - jobId - ); - } else if (sendType === "p") { - GenerateDocument( - { - name: isReturn - ? Templates.parts_return_slip.key - : order_type === "parts_order" - ? Templates.parts_order.key - : Templates.sublet_order.key, - variables: { - id: insertResult.data.insert_parts_orders.returning[0].id, - }, - }, - {}, - "p" - ); - } else if (sendType === "oec") { - //Send to Partner OEC. - try { - const partsOrder = await client.query({ - query: QUERY_PARTS_ORDER_OEC, - variables: { - id: insertResult.data.insert_parts_orders.returning[0].id, - }, - }); - let po; - //Massage the data based on the split. Should they be able to overwrite OEC pricing? - if (OEConnection_PriceChange.treatment === "on") { - //Set the flag to include the override. - po = _.cloneDeep(partsOrder.data.parts_orders_by_pk); - po.parts_order_lines.forEach((pol) => { - pol.priceChange = true; - }); - } - - const oecResponse = await axios.post( - "http://localhost:1337/oec/", - - po || partsOrder.data.parts_orders_by_pk, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + insertResult = await insertPartOrder({ + variables: { + po: [ + { + ...values, + order_date: dayjs().format("YYYY-MM-DD"), + orderedby: currentUser.email, + jobid: jobId, + user_email: currentUser.email, + return: isReturn, + status: is_quote + ? bodyshop.md_order_statuses.default_quote || "Quote" + : bodyshop.md_order_statuses.default_ordered || "Ordered*", + }, + ], }, - } - ); - - if (oecResponse.data && oecResponse.data.success === false) { - notification.open({ - type: "error", - message: t("parts_orders.errors.oec", { - error: oecResponse.data.error, - }), - }); - } - } catch (error) { - console.log("Error OEC.", error); - notification["error"]({ - message: t("parts_orders.errors.oec", { - error: JSON.stringify(error.message), - }), + refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"], }); - setSaving(false); - return; - } - } - setSaving(false); - toggleModalVisible(); - }; - - const initialValues = { - jobid: jobId, - return: isReturn, - deliver_by: isReturn ? moment(new Date()) : null, - vendorid: vendorId, - returnfrombill: returnFromBill, - - parts_order_lines: { - data: linesToOrder - ? linesToOrder.reduce((acc, value) => { - acc.push({ - line_desc: value.line_desc, - oem_partno: value.oem_partno, - db_price: value.db_price, - act_price: value.act_price, - cost: value.cost, - quantity: value.part_qty, - job_line_id: isReturn ? value.joblineid : value.id, - part_type: value.part_type, - ...(isReturn && { cm_received: false }), + if (!!insertResult.errors) { + notification["error"]({ + message: t("parts_orders.errors.creating"), + description: JSON.stringify(insertResult.errors), }); - return acc; - }, []) - : [], - }, - }; + return; + } + notification["success"]({ + message: values.isReturn + ? t("parts_orders.successes.return_created") + : t("parts_orders.successes.created"), + }); + insertAuditTrail({ + jobid: jobId, + operation: isReturn + ? AuditTrailMapping.jobspartsreturn( + insertResult.data.insert_parts_orders.returning[0].order_number + ) + : AuditTrailMapping.jobspartsorder( + insertResult.data.insert_parts_orders.returning[0].order_number + ), + }); - useEffect(() => { - if (visible && !!linesToOrder) { - form.resetFields(); - } - }, [visible, linesToOrder, form]); + const jobLinesResult = await updateJobLines({ + variables: { + ids: values.parts_order_lines.data + .filter((item) => item.job_line_id) + .map((item) => item.job_line_id), + status: isReturn + ? bodyshop.md_order_statuses.default_returned || "Returned*" + : is_quote + ? bodyshop.md_order_statuses.default_quote || "Quote" + : bodyshop.md_order_statuses.default_ordered || "Ordered*", + }, + }); - return ( - toggleModalVisible()} - onOk={() => form.submit()} - okButtonProps={{ loading: saving }} - cancelButtonProps={{ loading: saving }} - destroyOnClose - width="75%" - forceRender - > - {error ? : null} -
- {loading ? ( - - ) : ( - - )} - -
- ); + if (!isReturn && removefrompartsqueue) { + await updateJob({ + variables: { + jobId: jobId, + job: { + queued_for_parts: false, + }, + }, + }); + } + + if (!!jobLinesResult.errors) { + notification["error"]({ + message: t("parts_orders.errors.creating"), + description: JSON.stringify(jobLinesResult.errors), + }); + } + + if (values.vendorid === bodyshop.inhousevendorid) { + setBillEnterContext({ + actions: {refetch: refetch}, + context: { + disableInvNumber: true, + job: {id: jobId}, + bill: { + vendorid: bodyshop.inhousevendorid, + invoice_number: "ih", + isinhouse: true, + date: new dayjs(), + total: 0, + billlines: values.parts_order_lines.data.map((p) => { + return { + joblineid: p.job_line_id, + actual_price: p.act_price, + actual_cost: 0, //p.act_price, + line_desc: p.line_desc, + line_remarks: p.line_remarks, + part_type: p.part_type, + quantity: p.quantity || 1, + applicable_taxes: { + local: false, + state: false, + federal: false, + }, + }; + }), + }, + }, + }); + toggleModalVisible(); + return; + } + + if (refetch) refetch(); + + const Templates = TemplateList("partsorder", context); + + if (sendType === "e") { + const matchingVendor = data.vendors.filter( + (item) => item.id === values.vendorid + )[0]; + + let vendorEmails = + matchingVendor && + matchingVendor.email && + matchingVendor.email.split(RegExp("[;,]")); + + GenerateDocument( + { + name: isReturn + ? Templates.parts_return_slip.key + : order_type === "parts_order" + ? Templates.parts_order.key + : Templates.sublet_order.key, + variables: { + id: insertResult.data.insert_parts_orders.returning[0].id, + }, + }, + { + to: matchingVendor ? vendorEmails : null, + replyTo: bodyshop.email, + subject: isReturn + ? Templates.parts_return_slip.subject + : order_type === "parts_order" + ? Templates.parts_order.subject + : Templates.sublet_order.subject, + }, + "e", + jobId + ); + } else if (sendType === "p") { + GenerateDocument( + { + name: isReturn + ? Templates.parts_return_slip.key + : order_type === "parts_order" + ? Templates.parts_order.key + : Templates.sublet_order.key, + variables: { + id: insertResult.data.insert_parts_orders.returning[0].id, + }, + }, + {}, + "p" + ); + } else if (sendType === "oec") { + //Send to Partner OEC. + try { + const partsOrder = await client.query({ + query: QUERY_PARTS_ORDER_OEC, + variables: { + id: insertResult.data.insert_parts_orders.returning[0].id, + }, + }); + let po; + //Massage the data based on the split. Should they be able to overwrite OEC pricing? + if (OEConnection_PriceChange.treatment === "on") { + //Set the flag to include the override. + po = _.cloneDeep(partsOrder.data.parts_orders_by_pk); + po.parts_order_lines.forEach((pol) => { + pol.priceChange = true; + }); + } + + const oecResponse = await axios.post( + "http://localhost:1337/oec/", + + po || partsOrder.data.parts_orders_by_pk, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + + if (oecResponse.data && oecResponse.data.success === false) { + notification.open({ + type: "error", + message: t("parts_orders.errors.oec", { + error: oecResponse.data.error, + }), + }); + } + } catch (error) { + console.log("Error OEC.", error); + notification["error"]({ + message: t("parts_orders.errors.oec", { + error: JSON.stringify(error.message), + }), + }); + setSaving(false); + return; + } + } + setSaving(false); + toggleModalVisible(); + }; + + const initialValues = { + jobid: jobId, + return: isReturn, + deliver_by: isReturn ? dayjs(new Date()) : null, + vendorid: vendorId, + returnfrombill: returnFromBill, + + parts_order_lines: { + data: linesToOrder + ? linesToOrder.reduce((acc, value) => { + acc.push({ + line_desc: value.line_desc, + oem_partno: value.oem_partno, + db_price: value.db_price, + act_price: value.act_price, + cost: value.cost, + quantity: value.part_qty, + job_line_id: isReturn ? value.joblineid : value.id, + part_type: value.part_type, + ...(isReturn && {cm_received: false}), + }); + return acc; + }, []) + : [], + }, + }; + + useEffect(() => { + if (open && !!linesToOrder) { + form.resetFields(); + } + }, [open, linesToOrder, form]); + + return ( + toggleModalVisible()} + onOk={() => form.submit()} + okButtonProps={{loading: saving}} + cancelButtonProps={{loading: saving}} + destroyOnClose + width="75%" + forceRender + > + {error ? : null} +
+ {loading ? ( + + ) : ( + + )} + +
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PartsOrderModalContainer); diff --git a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx index 2fe6ac418..5b9af6611 100644 --- a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx +++ b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx @@ -1,137 +1,137 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { Form, Input, InputNumber, Select, Typography } from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Form, Input, InputNumber, Select, Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); export default connect(mapStateToProps, null)(PartsReceiveModalComponent); -export function PartsReceiveModalComponent({ bodyshop, form }) { - const { t } = useTranslation(); +export function PartsReceiveModalComponent({bodyshop, form}) { + const {t} = useTranslation(); - return ( -
- - - - - - - {t("parts_orders.labels.inthisorder")} - - - {(fields, { add, remove, move }) => { - return ( -
- {fields.map((field, index) => ( - -
- + + + - - - - - - - - - - - - - - - - - - - - - - { - remove(field.name); - }} - /> - -
+ ))} +
- ))} -
- ); - }} -
-
- ); + + + {t("parts_orders.labels.inthisorder")} + + + {(fields, {add, remove, move}) => { + return ( +
+ {fields.map((field, index) => ( + +
+ + + + + + + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + +
+
+ ))} +
+ ); + }} +
+ + ); } diff --git a/client/src/components/parts-receive-modal/parts-receive-modal.container.jsx b/client/src/components/parts-receive-modal/parts-receive-modal.container.jsx index 9694bcf49..8f989d670 100644 --- a/client/src/components/parts-receive-modal/parts-receive-modal.container.jsx +++ b/client/src/components/parts-receive-modal/parts-receive-modal.container.jsx @@ -1,120 +1,117 @@ -import { useMutation } from "@apollo/client"; -import { Form, Modal, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { RECEIVE_PARTS_LINE } from "../../graphql/jobs-lines.queries"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectPartsReceive } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Form, Modal, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {RECEIVE_PARTS_LINE} from "../../graphql/jobs-lines.queries"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectPartsReceive} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import PartsReceiveModalComponent from "./parts-receive-modal.component"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, - partsReceiveModal: selectPartsReceive, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + partsReceiveModal: selectPartsReceive, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("partsReceive")), + toggleModalVisible: () => dispatch(toggleModalVisible("partsReceive")), }); export function PartsReceiveModalContainer({ - partsReceiveModal, - toggleModalVisible, - currentUser, - bodyshop, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const { visible, context, actions } = partsReceiveModal; - const { partsorderlines } = context; + partsReceiveModal, + toggleModalVisible, + currentUser, + bodyshop, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const {open, context, actions} = partsReceiveModal; + const {partsorderlines} = context; - const { refetch } = actions; - const [form] = Form.useForm(); + const {refetch} = actions; + const [form] = Form.useForm(); - const [receivePartsLine] = useMutation(RECEIVE_PARTS_LINE); + const [receivePartsLine] = useMutation(RECEIVE_PARTS_LINE); - const handleFinish = async (values) => { - logImEXEvent("parts_order_receive"); - setLoading(true); - const result = await Promise.all( - values.partsorderlines.map((li) => { - return receivePartsLine({ - variables: { - lineId: li.joblineid, - line: { - location: li.location, - status: - bodyshop.md_order_statuses.default_received || "Received*", - }, - orderLineId: li.id, - orderLine: { - status: - bodyshop.md_order_statuses.default_received || "Received*", - }, - }, + const handleFinish = async (values) => { + logImEXEvent("parts_order_receive"); + setLoading(true); + const result = await Promise.all( + values.partsorderlines.map((li) => { + return receivePartsLine({ + variables: { + lineId: li.joblineid, + line: { + location: li.location, + status: + bodyshop.md_order_statuses.default_received || "Received*", + }, + orderLineId: li.id, + orderLine: { + status: + bodyshop.md_order_statuses.default_received || "Received*", + }, + }, + }); + }) + ); + + result.forEach((jobLinesResult) => { + if (jobLinesResult.errors) { + notification["error"]({ + message: t("parts_orders.errors.creating"), + description: JSON.stringify(jobLinesResult.errors), + }); + } }); - }) + + notification["success"]({ + message: t("parts_orders.successes.received"), + }); + setLoading(false); + if (refetch) refetch(); + toggleModalVisible(); + }; + + const initialValues = { + partsorderlines: partsorderlines, + }; + + useEffect(() => { + if (open && !!partsorderlines) { + form.resetFields(); + } + }, [open, partsorderlines, form]); + + return ( + toggleModalVisible()} + onOk={() => form.submit()} + okButtonProps={{loading: loading}} + destroyOnClose + forceRender + width="50%" + > +
+ + +
); - - result.forEach((jobLinesResult) => { - if (jobLinesResult.errors) { - notification["error"]({ - message: t("parts_orders.errors.creating"), - description: JSON.stringify(jobLinesResult.errors), - }); - } - }); - - notification["success"]({ - message: t("parts_orders.successes.received"), - }); - setLoading(false); - if (refetch) refetch(); - toggleModalVisible(); - }; - - const initialValues = { - partsorderlines: partsorderlines, - }; - - useEffect(() => { - if (visible && !!partsorderlines) { - form.resetFields(); - } - }, [visible, partsorderlines, form]); - - return ( - toggleModalVisible()} - onOk={() => form.submit()} - okButtonProps={{ loading: loading }} - destroyOnClose - forceRender - width="50%" - > -
- - -
- ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PartsReceiveModalContainer); diff --git a/client/src/components/parts-status-pie/parts-status-pie.component.jsx b/client/src/components/parts-status-pie/parts-status-pie.component.jsx index a67b8bd9c..d2200a8af 100644 --- a/client/src/components/parts-status-pie/parts-status-pie.component.jsx +++ b/client/src/components/parts-status-pie/parts-status-pie.component.jsx @@ -1,91 +1,93 @@ -import React, { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; -import { Cell, Pie, PieChart, ResponsiveContainer } from "recharts"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useTranslation } from "react-i18next"; +import React, {useCallback, useMemo} from "react"; +import {connect} from "react-redux"; +import {Cell, Pie, PieChart, ResponsiveContainer} from "recharts"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function PartsStatusPie({ bodyshop, joblines_status }) { - const { t } = useTranslation(); - const pieColor = useCallback( - (status) => { - if (status === bodyshop.md_order_statuses.default_ordered) - return "lightgreen"; - if (status === bodyshop.md_order_statuses.default_bo) return "crimson"; +export function PartsStatusPie({bodyshop, joblines_status}) { + const {t} = useTranslation(); + const pieColor = useCallback( + (status) => { + if (status === bodyshop.md_order_statuses.default_ordered) + return "lightgreen"; + if (status === bodyshop.md_order_statuses.default_bo) return "crimson"; - if (status === bodyshop.md_order_statuses.default_canceled) - return "dodgerblue"; + if (status === bodyshop.md_order_statuses.default_canceled) + return "dodgerblue"; - if (status === bodyshop.md_order_statuses.default_returned) - return "powderblue"; - if (status === bodyshop.md_order_statuses.default_received) - return "seagreen"; + if (status === bodyshop.md_order_statuses.default_returned) + return "powderblue"; + if (status === bodyshop.md_order_statuses.default_received) + return "seagreen"; - return "slategray"; - }, - [ - bodyshop.md_order_statuses.default_ordered, - bodyshop.md_order_statuses.default_bo, - bodyshop.md_order_statuses.default_canceled, - bodyshop.md_order_statuses.default_returned, - bodyshop.md_order_statuses.default_received, - ] - ); + return "slategray"; + }, + [ + bodyshop.md_order_statuses.default_ordered, + bodyshop.md_order_statuses.default_bo, + bodyshop.md_order_statuses.default_canceled, + bodyshop.md_order_statuses.default_returned, + bodyshop.md_order_statuses.default_received, + ] + ); - const Calculatedata = useCallback( - (data) => { - if (data && data.length > 0) { - const statusMapping = {}; - data.map((i) => { - if (!statusMapping[i.status]) - statusMapping[i.status] = { - name: i.status || t("joblines.labels.nostatus"), - value: 0, - color: pieColor(i.status), - }; - statusMapping[i.status].value = - statusMapping[i.status].value + i.count; - return null; - }); - return Object.keys(statusMapping).map((key) => { - return statusMapping[key]; - }); - } else { - return []; - } - }, - [pieColor, t] - ); + const Calculatedata = useCallback( + (data) => { + if (data && data.length > 0) { + const statusMapping = {}; + data.map((i) => { + if (!statusMapping[i.status]) + statusMapping[i.status] = { + name: i.status || t("joblines.labels.nostatus"), + value: 0, + color: pieColor(i.status), + }; + statusMapping[i.status].value = + statusMapping[i.status].value + i.count; + return null; + }); + return Object.keys(statusMapping).map((key) => { + return statusMapping[key]; + }); + } else { + return []; + } + }, + [pieColor, t] + ); - const memoizedData = useMemo( - () => Calculatedata(joblines_status), - [joblines_status, Calculatedata] - ); + const memoizedData = useMemo( + () => Calculatedata(joblines_status), + [joblines_status, Calculatedata] + ); - return ( -
- - - `${entry.name} - ${entry.value}`} - labelLine - > - {memoizedData.map((entry, index) => ( - - ))} - - - -
- ); + return ( +
+ + + `${entry.name} - ${entry.value}`} + labelLine + > + {memoizedData.map((entry, index) => ( + + ))} + + + +
+ ); } + export default connect(mapStateToProps, null)(PartsStatusPie); diff --git a/client/src/components/payable-export-all-button/payable-export-all-button.component.jsx b/client/src/components/payable-export-all-button/payable-export-all-button.component.jsx index c448e4f4a..59874e0d6 100644 --- a/client/src/components/payable-export-all-button/payable-export-all-button.component.jsx +++ b/client/src/components/payable-export-all-button/payable-export-all-button.component.jsx @@ -1,240 +1,237 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; import axios from "axios"; import _ from "lodash"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { auth, logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { UPDATE_BILLS } from "../../graphql/bills.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {UPDATE_BILLS} from "../../graphql/bills.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); function updateBillCache(items) { - client.cache.modify({ - id: "ROOT_QUERY", - fields: { - bills(existingJobs = []) { - return existingJobs.filter( - (billRef) => billRef.__ref.includes(items) === false - ); - }, - }, - }); + client.cache.modify({ + id: "ROOT_QUERY", + fields: { + bills(existingJobs = []) { + return existingJobs.filter( + (billRef) => billRef.__ref.includes(items) === false + ); + }, + }, + }); } export function PayableExportAll({ - bodyshop, - currentUser, - billids, - disabled, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const [updateBill] = useMutation(UPDATE_BILLS); - const [loading, setLoading] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + bodyshop, + currentUser, + billids, + disabled, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const [updateBill] = useMutation(UPDATE_BILLS); + const [loading, setLoading] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const handleQbxml = async () => { - logImEXEvent("accounting_payables_export_all"); - let PartnerResponse; + const handleQbxml = async () => { + logImEXEvent("accounting_payables_export_all"); + let PartnerResponse; - setLoading(true); - if (!!loadingCallback) loadingCallback(true); - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { - PartnerResponse = await axios.post(`/qbo/payables`, { - bills: billids, - elgen: true, - }); - } else { - let QbXmlResponse; - try { - QbXmlResponse = await axios.post( - "/accounting/qbxml/payables", - { bills: billids }, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } + setLoading(true); + if (!!loadingCallback) loadingCallback(true); + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { + PartnerResponse = await axios.post(`/qbo/payables`, { + bills: billids, + elgen: true, + }); + } else { + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payables", + {bills: billids}, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("bills.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("bills.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const groupedData = _.groupBy( + PartnerResponse.data, + bodyshop.accountingconfig.qbo ? "billid" : "id" ); - } catch (error) { - console.log("Error getting QBXML from Server.", error); - notification["error"]({ - message: t("bills.errors.exporting", { - error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), - }), - }); - if (loadingCallback) loadingCallback(false); - setLoading(false); - return; - } - try { - PartnerResponse = await axios.post( - "http://localhost:1337/qb/", - QbXmlResponse.data - ); - } catch (error) { - console.log("Error connecting to quickbooks or partner.", error); - notification["error"]({ - message: t("bills.errors.exporting-partner"), + const proms = []; + Object.keys(groupedData).forEach((key) => { + proms.push( + (async () => { + const failedTransactions = groupedData[key].filter((r) => !r.success); + const successfulTransactions = groupedData[key].filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("bills.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + billid: key, + successful: false, + message: JSON.stringify( + failedTransactions.map((ft) => ft.errorMessage) + ), + useremail: currentUser.email, + }, + ], + }, + }); + } + } else { + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + billid: key, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); + + const billUpdateResponse = await updateBill({ + variables: { + billIdList: successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && + bodyshop.accountingconfig.qbo + ? "billid" + : "id" + ] + ), + bill: { + exported: true, + exported_at: new Date(), + }, + }, + }); + if (!!!billUpdateResponse.errors) { + notification.open({ + type: "success", + key: "billsuccessexport", + message: t("bills.successes.exported"), + }); + updateBillCache( + billUpdateResponse.data.update_bills.returning.map( + (bill) => bill.id + ) + ); + } else { + notification["error"]({ + message: t("bills.errors.exporting", { + error: JSON.stringify(billUpdateResponse.errors), + }), + }); + } + } + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { + notification.open({ + type: "success", + key: "billsuccessexport", + message: t("bills.successes.exported"), + }); + updateBillCache([ + ...new Set( + successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && + bodyshop.accountingconfig.qbo + ? "billid" + : "id" + ] + ) + ), + ]); + } + } + })() + ); }); + + await Promise.all(proms); + if (!!completedCallback) completedCallback([]); if (!!loadingCallback) loadingCallback(false); setLoading(false); - return; - } - } + }; - console.log("handleQbxml -> PartnerResponse", PartnerResponse); - const groupedData = _.groupBy( - PartnerResponse.data, - bodyshop.accountingconfig.qbo ? "billid" : "id" - ); + if (bodyshop.pbs_serialnumber) + return ( + + + + ); - const proms = []; - Object.keys(groupedData).forEach((key) => { - proms.push( - (async () => { - const failedTransactions = groupedData[key].filter((r) => !r.success); - const successfulTransactions = groupedData[key].filter( - (r) => r.success - ); - if (failedTransactions.length > 0) { - //Uh oh. At least one was no good. - failedTransactions.map((ft) => - notification["error"]({ - message: t("bills.errors.exporting", { - error: ft.errorMessage || "", - }), - }) - ); - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - billid: key, - successful: false, - message: JSON.stringify( - failedTransactions.map((ft) => ft.errorMessage) - ), - useremail: currentUser.email, - }, - ], - }, - }); - } - } else { - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - billid: key, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); - - const billUpdateResponse = await updateBill({ - variables: { - billIdList: successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && - bodyshop.accountingconfig.qbo - ? "billid" - : "id" - ] - ), - bill: { - exported: true, - exported_at: new Date(), - }, - }, - }); - if (!!!billUpdateResponse.errors) { - notification.open({ - type: "success", - key: "billsuccessexport", - message: t("bills.successes.exported"), - }); - updateBillCache( - billUpdateResponse.data.update_bills.returning.map( - (bill) => bill.id - ) - ); - } else { - notification["error"]({ - message: t("bills.errors.exporting", { - error: JSON.stringify(billUpdateResponse.errors), - }), - }); - } - } - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { - notification.open({ - type: "success", - key: "billsuccessexport", - message: t("bills.successes.exported"), - }); - updateBillCache([ - ...new Set( - successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && - bodyshop.accountingconfig.qbo - ? "billid" - : "id" - ] - ) - ), - ]); - } - } - })() - ); - }); - - await Promise.all(proms); - if (!!completedCallback) completedCallback([]); - if (!!loadingCallback) loadingCallback(false); - setLoading(false); - }; - - if (bodyshop.pbs_serialnumber) return ( - - - + ); - - return ( - - ); } export default connect(mapStateToProps, null)(PayableExportAll); diff --git a/client/src/components/payable-export-button/payable-export-button.component.jsx b/client/src/components/payable-export-button/payable-export-button.component.jsx index c2970b8d8..d73aac160 100644 --- a/client/src/components/payable-export-button/payable-export-button.component.jsx +++ b/client/src/components/payable-export-button/payable-export-button.component.jsx @@ -1,233 +1,230 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { auth, logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { UPDATE_BILLS } from "../../graphql/bills.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {UPDATE_BILLS} from "../../graphql/bills.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); function updateBillCache(items) { - client.cache.modify({ - id: "ROOT_QUERY", - fields: { - bills(existingJobs = []) { - return existingJobs.filter( - (billRef) => billRef.__ref.includes(items) === false - ); - }, - }, - }); + client.cache.modify({ + id: "ROOT_QUERY", + fields: { + bills(existingJobs = []) { + return existingJobs.filter( + (billRef) => billRef.__ref.includes(items) === false + ); + }, + }, + }); } export function PayableExportButton({ - bodyshop, - currentUser, - billId, - disabled, - loadingCallback, - setSelectedBills, - refetch, -}) { - const { t } = useTranslation(); - const [updateBill] = useMutation(UPDATE_BILLS); - const [loading, setLoading] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + bodyshop, + currentUser, + billId, + disabled, + loadingCallback, + setSelectedBills, + refetch, + }) { + const {t} = useTranslation(); + const [updateBill] = useMutation(UPDATE_BILLS); + const [loading, setLoading] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const handleQbxml = async () => { - logImEXEvent("accounting_export_payable"); + const handleQbxml = async () => { + logImEXEvent("accounting_export_payable"); - setLoading(true); - if (!!loadingCallback) loadingCallback(true); + setLoading(true); + if (!!loadingCallback) loadingCallback(true); - //Check if it's a QBO Setup. - let PartnerResponse; - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { - PartnerResponse = await axios.post(`/qbo/payables`, { - bills: [billId], - elgen: true, - }); - } else { - //Default is QBD + //Check if it's a QBO Setup. + let PartnerResponse; + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { + PartnerResponse = await axios.post(`/qbo/payables`, { + bills: [billId], + elgen: true, + }); + } else { + //Default is QBD - let QbXmlResponse; - try { - QbXmlResponse = await axios.post( - "/accounting/qbxml/payables", - { bills: [billId] }, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payables", + {bills: [billId]}, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("bills.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("bills.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success ); - } catch (error) { - console.log("Error getting QBXML from Server.", error); - notification["error"]({ - message: t("bills.errors.exporting", { - error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), - }), - }); - if (loadingCallback) loadingCallback(false); - setLoading(false); - return; - } + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("bills.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + billid: billId, + successful: false, + message: JSON.stringify( + failedTransactions.map((ft) => ft.errorMessage) + ), + useremail: currentUser.email, + }, + ], + }, + }); + } + } + if (successfulTransactions.length > 0) { + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + billid: billId, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); + const billUpdateResponse = await updateBill({ + variables: { + billIdList: successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && bodyshop.accountingconfig.qbo + ? "billid" + : "id" + ] + ), + bill: { + exported: true, + exported_at: new Date(), + }, + }, + }); + if (!!!billUpdateResponse.errors) { + notification.open({ + type: "success", + key: "billsuccessexport", + message: t("bills.successes.exported"), + }); + updateBillCache( + billUpdateResponse.data.update_bills.returning.map( + (bill) => bill.id + ) + ); + } else { + notification["error"]({ + message: t("bills.errors.exporting", { + error: JSON.stringify(billUpdateResponse.error), + }), + }); + } + } + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { + notification.open({ + type: "success", + key: "billsuccessexport", + message: t("bills.successes.exported"), + }); + updateBillCache([ + ...new Set( + successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && bodyshop.accountingconfig.qbo + ? "billid" + : "id" + ] + ) + ), + ]); + } + + if (setSelectedBills) { + setSelectedBills((selectedBills) => { + return selectedBills.filter((i) => i !== billId); + }); + } + } - try { - PartnerResponse = await axios.post( - "http://localhost:1337/qb/", - QbXmlResponse.data - ); - } catch (error) { - console.log("Error connecting to quickbooks or partner.", error); - notification["error"]({ - message: t("bills.errors.exporting-partner"), - }); if (!!loadingCallback) loadingCallback(false); setLoading(false); - return; - } - } + }; - console.log("handleQbxml -> PartnerResponse", PartnerResponse); - const failedTransactions = PartnerResponse.data.filter((r) => !r.success); - const successfulTransactions = PartnerResponse.data.filter( - (r) => r.success - ); - if (failedTransactions.length > 0) { - //Uh oh. At least one was no good. - failedTransactions.map((ft) => - notification["error"]({ - message: t("bills.errors.exporting", { - error: ft.errorMessage || "", - }), - }) - ); - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - billid: billId, - successful: false, - message: JSON.stringify( - failedTransactions.map((ft) => ft.errorMessage) - ), - useremail: currentUser.email, - }, - ], - }, - }); - } - } - if (successfulTransactions.length > 0) { - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - billid: billId, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); - const billUpdateResponse = await updateBill({ - variables: { - billIdList: successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && bodyshop.accountingconfig.qbo - ? "billid" - : "id" - ] - ), - bill: { - exported: true, - exported_at: new Date(), - }, - }, - }); - if (!!!billUpdateResponse.errors) { - notification.open({ - type: "success", - key: "billsuccessexport", - message: t("bills.successes.exported"), - }); - updateBillCache( - billUpdateResponse.data.update_bills.returning.map( - (bill) => bill.id - ) - ); - } else { - notification["error"]({ - message: t("bills.errors.exporting", { - error: JSON.stringify(billUpdateResponse.error), - }), - }); - } - } - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { - notification.open({ - type: "success", - key: "billsuccessexport", - message: t("bills.successes.exported"), - }); - updateBillCache([ - ...new Set( - successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && bodyshop.accountingconfig.qbo - ? "billid" - : "id" - ] - ) - ), - ]); - } + if (bodyshop.pbs_serialnumber) + return ( + + + + ); - if (setSelectedBills) { - setSelectedBills((selectedBills) => { - return selectedBills.filter((i) => i !== billId); - }); - } - } - - if (!!loadingCallback) loadingCallback(false); - setLoading(false); - }; - - if (bodyshop.pbs_serialnumber) return ( - - - + ); - - return ( - - ); } export default connect(mapStateToProps, null)(PayableExportButton); diff --git a/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx b/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx index 4058d042c..e1a1975de 100644 --- a/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx +++ b/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx @@ -1,108 +1,106 @@ -import { gql, useMutation } from "@apollo/client"; -import { Button, notification, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {gql, useMutation} from "@apollo/client"; +import {Button, notification, Popconfirm} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(BillMarkSelectedExported); export function BillMarkSelectedExported({ - bodyshop, - currentUser, - billids, - disabled, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [visible, setVisible] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const [updateBill] = useMutation(gql` - mutation UPDATE_BILL($billIds: [uuid!]!) { - update_bills(where: { id: { _in: $billIds } }, _set: { exported: true }) { - returning { - id - exported - exported_at + bodyshop, + currentUser, + billids, + disabled, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + const [updateBill] = useMutation(gql` + mutation UPDATE_BILL($billIds: [uuid!]!) { + update_bills(where: { id: { _in: $billIds } }, _set: { exported: true }) { + returning { + id + exported + exported_at + } + } } - } - } - `); + `); - const handleUpdate = async () => { - setLoading(true); - loadingCallback(true); - const result = await updateBill({ - variables: { billIds: billids }, - update(cache) {}, - }); + const handleUpdate = async () => { + setLoading(true); + loadingCallback(true); + const result = await updateBill({ + variables: {billIds: billids}, + update(cache) { + }, + }); - await insertExportLog({ - variables: { - logs: billids.map((id) => { - return { - bodyshopid: bodyshop.id, - billid: id, - successful: true, - message: JSON.stringify([t("general.labels.markedexported")]), - useremail: currentUser.email, - }; - }), - }, - }); + await insertExportLog({ + variables: { + logs: billids.map((id) => { + return { + bodyshopid: bodyshop.id, + billid: id, + successful: true, + message: JSON.stringify([t("general.labels.markedexported")]), + useremail: currentUser.email, + }; + }), + }, + }); - if (!result.errors) { - notification["success"]({ - message: t("bills.successes.markexported"), - }); - } else { - notification["error"]({ - message: t("bills.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - loadingCallback(false); - completedCallback && completedCallback([]); - setLoading(false); - refetch && refetch(); - setVisible(false); - }; + if (!result.errors) { + notification["success"]({ + message: t("bills.successes.markexported"), + }); + } else { + notification["error"]({ + message: t("bills.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + loadingCallback(false); + completedCallback && completedCallback([]); + setLoading(false); + refetch && refetch(); + setOpen(false); + }; - return ( - setVisible(false)} - onConfirm={handleUpdate} - disabled={disabled} - > - - - ); + return ( + setOpen(false)} + onConfirm={handleUpdate} + disabled={disabled} + > + + + ); } diff --git a/client/src/components/payment-expanded-row/payment-expanded-row.component.jsx b/client/src/components/payment-expanded-row/payment-expanded-row.component.jsx index a150eee78..700eb4018 100644 --- a/client/src/components/payment-expanded-row/payment-expanded-row.component.jsx +++ b/client/src/components/payment-expanded-row/payment-expanded-row.component.jsx @@ -1,186 +1,180 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { - Button, - Descriptions, - InputNumber, - Modal, - Space, - notification, -} from "antd"; +import {useMutation, useQuery} from "@apollo/client"; +import {Button, Descriptions, InputNumber, Modal, notification, Space,} from "antd"; import axios from "axios"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import { - GET_REFUNDABLE_AMOUNT_BY_JOBID, - INSERT_PAYMENT_RESPONSE, - QUERY_PAYMENT_RESPONSE_BY_PAYMENT_ID, + GET_REFUNDABLE_AMOUNT_BY_JOBID, + INSERT_PAYMENT_RESPONSE, + QUERY_PAYMENT_RESPONSE_BY_PAYMENT_ID, } from "../../graphql/payment_response.queries"; -import { INSERT_NEW_PAYMENT } from "../../graphql/payments.queries"; +import {INSERT_NEW_PAYMENT} from "../../graphql/payments.queries"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; -const { confirm } = Modal; +const {confirm} = Modal; const openNotificationWithIcon = (type, t) => { - notification[type]({ - message: t("job_payments.notifications.error.title"), - description: t("job_payments.notifications.error.description"), - }); + notification[type]({ + message: t("job_payments.notifications.error.title"), + description: t("job_payments.notifications.error.description"), + }); }; -const PaymentExpandedRowComponent = ({ record, bodyshop }) => { - const [refundAmount, setRefundAmount] = useState(0); - const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); - const [insertPaymentResponse] = useMutation(INSERT_PAYMENT_RESPONSE); - const { t } = useTranslation(); +const PaymentExpandedRowComponent = ({record, bodyshop}) => { + const [refundAmount, setRefundAmount] = useState(0); + const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); + const [insertPaymentResponse] = useMutation(INSERT_PAYMENT_RESPONSE); + const {t} = useTranslation(); - const { loading, error, data } = useQuery( - QUERY_PAYMENT_RESPONSE_BY_PAYMENT_ID, - { - variables: { - paymentid: record.id, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }, - } - ); - - const { data: refundable_amount, refetch } = useQuery( - GET_REFUNDABLE_AMOUNT_BY_JOBID, - { - variables: { - jobid: record.jobid, - }, - } - ); - - const insertPayments = async (payment_response, refund_response) => { - await insertPayment({ - variables: { - paymentInput: { - amount: -refund_response.data.amount, - transactionid: payment_response.response.receiptelements.transid, - payer: record.payer, - type: "Refund", - jobid: payment_response.jobid, - date: moment(Date.now()), - }, - }, - update(cache, { data }) { - cache.modify({ - id: cache.identify({ - id: payment_response.jobid, - __typename: "jobs", - }), - fields: { - payments(payments) { - return [...data.insert_payments.returning, ...payments]; + const {loading, error, data} = useQuery( + QUERY_PAYMENT_RESPONSE_BY_PAYMENT_ID, + { + variables: { + paymentid: record.id, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }, - }, - }); - }, - }); - - await insertPaymentResponse({ - variables: { - paymentResponse: { - amount: -refund_response.data.amount, - bodyshopid: payment_response.bodyshopid, - paymentid: payment_response.paymentid, - jobid: payment_response.jobid, - declinereason: "Refund", - ext_paymentid: payment_response.ext_paymentid, - successful: true, - response: refund_response.data, - }, - }, - }); - }; - - const showConfirm = (payment_response) => { - confirm({ - title: "Do you want to refund payment?", - content: - "The payment will be refunded. Click OK to confirm and Cancel to dismiss.", - async onOk() { - const refundResponse = await axios.post("/intellipay/payment_refund", { - bodyshop, - amount: refundAmount, - paymentid: payment_response.ext_paymentid, - }); - - if (refundResponse.data.status < 0) { - openNotificationWithIcon("error", t); - return; } + ); - insertPayments(payment_response, refundResponse); + const {data: refundable_amount, refetch} = useQuery( + GET_REFUNDABLE_AMOUNT_BY_JOBID, + { + variables: { + jobid: record.jobid, + }, + } + ); - // refetch refundable amount - refetch(); - }, - onCancel() {}, - }); - }; + const insertPayments = async (payment_response, refund_response) => { + await insertPayment({ + variables: { + paymentInput: { + amount: -refund_response.data.amount, + transactionid: payment_response.response.receiptelements.transid, + payer: record.payer, + type: "Refund", + jobid: payment_response.jobid, + date: dayjs(Date.now()), + }, + }, + update(cache, {data}) { + cache.modify({ + id: cache.identify({ + id: payment_response.jobid, + __typename: "jobs", + }), + fields: { + payments(payments) { + return [...data.insert_payments.returning, ...payments]; + }, + }, + }); + }, + }); - if (loading) return null; + await insertPaymentResponse({ + variables: { + paymentResponse: { + amount: -refund_response.data.amount, + bodyshopid: payment_response.bodyshopid, + paymentid: payment_response.paymentid, + jobid: payment_response.jobid, + declinereason: "Refund", + ext_paymentid: payment_response.ext_paymentid, + successful: true, + response: refund_response.data, + }, + }, + }); + }; - if (error) return

Error loading data. Please Reload

; + const showConfirm = (payment_response) => { + confirm({ + title: "Do you want to refund payment?", + content: + "The payment will be refunded. Click OK to confirm and Cancel to dismiss.", + async onOk() { + const refundResponse = await axios.post("/intellipay/payment_refund", { + bodyshop, + amount: refundAmount, + paymentid: payment_response.ext_paymentid, + }); - const payment_response = data.payment_response[0]; - const max_refundable_amount = - refundable_amount?.payment_response_aggregate.aggregate.sum.amount; + if (refundResponse.data.status < 0) { + openNotificationWithIcon("error", t); + return; + } - return ( -
- - - {record.payer} - - - {payment_response?.response?.nameOnCard ?? ""} - - - {record.amount} - - - {{record.created_at}} - - - {record.transactionid} - - - {payment_response?.response?.paymentreferenceid ?? ""} - - - {record.type} - - - {record.paymentnum} - - {payment_response && ( - - - + insertPayments(payment_response, refundResponse); - - - - )} - -
- ); + // refetch refundable amount + refetch(); + }, + onCancel() { + }, + }); + }; + + if (loading) return null; + + if (error) return

Error loading data. Please Reload

; + + const payment_response = data.payment_response[0]; + const max_refundable_amount = + refundable_amount?.payment_response_aggregate.aggregate.sum.amount; + + return ( +
+ + + {record.payer} + + + {payment_response?.response?.nameOnCard ?? ""} + + + {record.amount} + + + {{record.created_at}} + + + {record.transactionid} + + + {payment_response?.response?.paymentreferenceid ?? ""} + + + {record.type} + + + {record.paymentnum} + + {payment_response && ( + + + + + + + + )} + +
+ ); }; export default PaymentExpandedRowComponent; diff --git a/client/src/components/payment-export-button/payment-export-button.component.jsx b/client/src/components/payment-export-button/payment-export-button.component.jsx index 931254b92..164af14f8 100644 --- a/client/src/components/payment-export-button/payment-export-button.component.jsx +++ b/client/src/components/payment-export-button/payment-export-button.component.jsx @@ -1,224 +1,221 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { auth, logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { UPDATE_PAYMENTS } from "../../graphql/payments.queries"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {auth, logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {UPDATE_PAYMENTS} from "../../graphql/payments.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); function updatePaymentCache(items) { - client.cache.modify({ - id: "ROOT_QUERY", - fields: { - payments(existingJobs = []) { - return existingJobs.filter( - (paymentRef) => paymentRef.__ref.includes(items) === false - ); - }, - }, - }); + client.cache.modify({ + id: "ROOT_QUERY", + fields: { + payments(existingJobs = []) { + return existingJobs.filter( + (paymentRef) => paymentRef.__ref.includes(items) === false + ); + }, + }, + }); } export function PaymentExportButton({ - bodyshop, - currentUser, - paymentId, - disabled, - loadingCallback, - setSelectedPayments, - refetch, -}) { - const { t } = useTranslation(); - const [updatePayment] = useMutation(UPDATE_PAYMENTS); - const [loading, setLoading] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + bodyshop, + currentUser, + paymentId, + disabled, + loadingCallback, + setSelectedPayments, + refetch, + }) { + const {t} = useTranslation(); + const [updatePayment] = useMutation(UPDATE_PAYMENTS); + const [loading, setLoading] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const handleQbxml = async () => { - logImEXEvent("accounting_payment_export"); - setLoading(true); - //Check if it's a QBO Setup. - let PartnerResponse; - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { - PartnerResponse = await axios.post(`/qbo/payments`, { - payments: [paymentId], - elgen: true, - }); - } else { - //Default is QBD + const handleQbxml = async () => { + logImEXEvent("accounting_payment_export"); + setLoading(true); + //Check if it's a QBO Setup. + let PartnerResponse; + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { + PartnerResponse = await axios.post(`/qbo/payments`, { + payments: [paymentId], + elgen: true, + }); + } else { + //Default is QBD - if (!!loadingCallback) loadingCallback(true); + if (!!loadingCallback) loadingCallback(true); - let QbXmlResponse; - try { - QbXmlResponse = await axios.post( - "/accounting/qbxml/payments", - { payments: [paymentId] }, - { - headers: { - Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, - }, - } + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payments", + {payments: [paymentId]}, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken()}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("payments.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("payments.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success ); - console.log("handle -> XML", QbXmlResponse); - } catch (error) { - console.log("Error getting QBXML from Server.", error); - notification["error"]({ - message: t("payments.errors.exporting", { - error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), - }), - }); - if (loadingCallback) loadingCallback(false); - setLoading(false); - return; - } + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("payments.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + paymentid: paymentId, + successful: false, + message: JSON.stringify( + failedTransactions.map((ft) => ft.errorMessage) + ), + useremail: currentUser.email, + }, + ], + }, + }); + } + } else { + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + paymentid: paymentId, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); - try { - PartnerResponse = await axios.post( - "http://localhost:1337/qb/", - QbXmlResponse.data - ); - } catch (error) { - console.log("Error connecting to quickbooks or partner.", error); - notification["error"]({ - message: t("payments.errors.exporting-partner"), - }); + const paymentUpdateResponse = await updatePayment({ + variables: { + paymentIdList: successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && bodyshop.accountingconfig.qbo + ? "paymentid" + : "id" + ] + ), + payment: { + exportedat: new Date(), + }, + }, + }); + if (!!!paymentUpdateResponse.errors) { + notification.open({ + type: "success", + key: "paymentsuccessexport", + message: t("payments.successes.exported"), + }); + updatePaymentCache( + paymentUpdateResponse.data.update_payments.returning.map( + (payment) => payment.id + ) + ); + } else { + notification["error"]({ + message: t("payments.errors.exporting", { + error: JSON.stringify(paymentUpdateResponse.error), + }), + }); + } + } + + if (setSelectedPayments) { + setSelectedPayments((selectedBills) => { + return selectedBills.filter((i) => i !== paymentId); + }); + } + } + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { + notification.open({ + type: "success", + key: "paymentsuccessexport", + message: t("payments.successes.exported"), + }); + updatePaymentCache([ + ...new Set( + successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && bodyshop.accountingconfig.qbo + ? "paymentid" + : "id" + ] + ) + ), + ]); + } if (!!loadingCallback) loadingCallback(false); setLoading(false); - return; - } - } + }; - console.log("handleQbxml -> PartnerResponse", PartnerResponse); - const failedTransactions = PartnerResponse.data.filter((r) => !r.success); - const successfulTransactions = PartnerResponse.data.filter( - (r) => r.success + return ( + ); - if (failedTransactions.length > 0) { - //Uh oh. At least one was no good. - failedTransactions.map((ft) => - notification["error"]({ - message: t("payments.errors.exporting", { - error: ft.errorMessage || "", - }), - }) - ); - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - paymentid: paymentId, - successful: false, - message: JSON.stringify( - failedTransactions.map((ft) => ft.errorMessage) - ), - useremail: currentUser.email, - }, - ], - }, - }); - } - } else { - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - paymentid: paymentId, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); - - const paymentUpdateResponse = await updatePayment({ - variables: { - paymentIdList: successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && bodyshop.accountingconfig.qbo - ? "paymentid" - : "id" - ] - ), - payment: { - exportedat: new Date(), - }, - }, - }); - if (!!!paymentUpdateResponse.errors) { - notification.open({ - type: "success", - key: "paymentsuccessexport", - message: t("payments.successes.exported"), - }); - updatePaymentCache( - paymentUpdateResponse.data.update_payments.returning.map( - (payment) => payment.id - ) - ); - } else { - notification["error"]({ - message: t("payments.errors.exporting", { - error: JSON.stringify(paymentUpdateResponse.error), - }), - }); - } - } - - if (setSelectedPayments) { - setSelectedPayments((selectedBills) => { - return selectedBills.filter((i) => i !== paymentId); - }); - } - } - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { - notification.open({ - type: "success", - key: "paymentsuccessexport", - message: t("payments.successes.exported"), - }); - updatePaymentCache([ - ...new Set( - successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && bodyshop.accountingconfig.qbo - ? "paymentid" - : "id" - ] - ) - ), - ]); - } - if (!!loadingCallback) loadingCallback(false); - setLoading(false); - }; - - return ( - - ); } export default connect(mapStateToProps, null)(PaymentExportButton); diff --git a/client/src/components/payment-form/payment-form.component.jsx b/client/src/components/payment-form/payment-form.component.jsx index 1c3c5f42d..6cee80bb5 100644 --- a/client/src/components/payment-form/payment-form.component.jsx +++ b/client/src/components/payment-form/payment-form.component.jsx @@ -1,10 +1,10 @@ -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Form, Input, Radio, Select } from "antd"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Form, Input, Radio, Select} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import DatePickerFormItem from "../form-date-picker/form-date-picker.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import JobSearchSelect from "../job-search-select/job-search-select.component"; @@ -12,150 +12,149 @@ import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import PaymentFormTotalPayments from "./payment-form.totalpayments.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function PaymentFormComponent({ - form, - bodyshop, - disabled, -}) { - const { Qb_Multi_Ar } = useTreatments( - ["Qb_Multi_Ar"], - {}, - bodyshop && bodyshop.imexshopid - ); +export function PaymentFormComponent({form, bodyshop, disabled,}) { - const { t } = useTranslation(); + const {treatments: {Qb_Multi_Ar}} = useSplitTreatments({ + attributes: {}, + names: ["Qb_Multi_Ar"], + splitKey: bodyshop && bodyshop.imexshopid, + }); - return ( -
- - - - - cur.jobid && prev.jobid !== cur.jobid} - > - {() => { - return ( - - ); - }} - - - - - - - - - - - - - - - - + const {t} = useTranslation(); - - - - + return ( +
+ + + + + cur.jobid && prev.jobid !== cur.jobid} + > + {() => { + return ( + + ); + }} + + - - - - - - - - {t("general.labels.none")} - {t("general.labels.email")} - {t("general.labels.print")} - - - -
- ); + + + + + + + + + + + + + + + + + + + + + + + + + + + + {t("general.labels.none")} + {t("general.labels.email")} + {t("general.labels.print")} + + + +
+ ); } + export default connect(mapStateToProps, null)(PaymentFormComponent); diff --git a/client/src/components/payment-form/payment-form.totalpayments.component.jsx b/client/src/components/payment-form/payment-form.totalpayments.component.jsx index 463a09e70..f44bcb665 100644 --- a/client/src/components/payment-form/payment-form.totalpayments.component.jsx +++ b/client/src/components/payment-form/payment-form.totalpayments.component.jsx @@ -1,52 +1,52 @@ -import { useQuery } from "@apollo/client"; -import { Statistic } from "antd"; +import {useQuery} from "@apollo/client"; +import {Statistic} from "antd"; import Dinero from "dinero.js"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { QUERY_JOB_PAYMENT_TOTALS } from "../../graphql/payments.queries"; +import {useTranslation} from "react-i18next"; +import {QUERY_JOB_PAYMENT_TOTALS} from "../../graphql/payments.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -export default function PaymentFormTotalPayments({ jobid }) { - const { t } = useTranslation(); +export default function PaymentFormTotalPayments({jobid}) { + const {t} = useTranslation(); - const { loading, error, data } = useQuery(QUERY_JOB_PAYMENT_TOTALS, { - variables: { id: jobid }, - skip: !jobid, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data} = useQuery(QUERY_JOB_PAYMENT_TOTALS, { + variables: {id: jobid}, + skip: !jobid, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - if (!data) return <>; - const totalPayments = data.jobs_by_pk.payments.reduce((acc, val) => { - return acc.add( - Dinero({ amount: Math.round(((val && val.amount) || 0) * 100) }) + if (!data) return <>; + const totalPayments = data.jobs_by_pk.payments.reduce((acc, val) => { + return acc.add( + Dinero({amount: Math.round(((val && val.amount) || 0) * 100)}) + ); + }, Dinero()); + + const balance = + data.jobs_by_pk.job_totals && + Dinero(data.jobs_by_pk.job_totals.totals.total_repairs).subtract( + totalPayments + ); + + return ( +
+ + {balance && ( + + )} + {!balance &&
{t("jobs.errors.nofinancial")}
} +
); - }, Dinero()); - - const balance = - data.jobs_by_pk.job_totals && - Dinero(data.jobs_by_pk.job_totals.totals.total_repairs).subtract( - totalPayments - ); - - return ( -
- - {balance && ( - - )} - {!balance &&
{t("jobs.errors.nofinancial")}
} -
- ); } diff --git a/client/src/components/payment-mark-export-button/payment-mark-export-button-component.jsx b/client/src/components/payment-mark-export-button/payment-mark-export-button-component.jsx index be6c80356..daf97b504 100644 --- a/client/src/components/payment-mark-export-button/payment-mark-export-button-component.jsx +++ b/client/src/components/payment-mark-export-button/payment-mark-export-button-component.jsx @@ -1,100 +1,100 @@ import React from "react"; -import { Button, notification } from "antd"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { connect } from "react-redux"; -import { UPDATE_PAYMENT } from "../../graphql/payments.queries"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; -import { createStructuredSelector } from "reselect"; +import {Button, notification} from "antd"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {connect} from "react-redux"; +import {UPDATE_PAYMENT} from "../../graphql/payments.queries"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; +import {createStructuredSelector} from "reselect"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "payment" })), + setPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "payment"})), }); const PaymentMarkForExportButton = ({ - bodyshop, - payment, - refetch, - setPaymentContext, - currentUser, -}) => { - const { t } = useTranslation(); - const [insertExportLog, { loading: exportLogLoading }] = - useMutation(INSERT_EXPORT_LOG); - const [updatePayment, { loading: updatePaymentLoading }] = - useMutation(UPDATE_PAYMENT); + bodyshop, + payment, + refetch, + setPaymentContext, + currentUser, + }) => { + const {t} = useTranslation(); + const [insertExportLog, {loading: exportLogLoading}] = + useMutation(INSERT_EXPORT_LOG); + const [updatePayment, {loading: updatePaymentLoading}] = + useMutation(UPDATE_PAYMENT); - const handleClick = async () => { - const today = new Date(); + const handleClick = async () => { + const today = new Date(); - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - paymentid: payment.id, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + paymentid: payment.id, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); - const paymentUpdateResponse = await updatePayment({ - variables: { - paymentId: payment.id, - payment: { - exportedat: today, - }, - }, - }); + const paymentUpdateResponse = await updatePayment({ + variables: { + paymentId: payment.id, + payment: { + exportedat: today, + }, + }, + }); - if (!!!paymentUpdateResponse.errors) { - notification.open({ - type: "success", - key: "paymentsuccessmarkforexport", - message: t("payments.successes.markexported"), - }); + if (!!!paymentUpdateResponse.errors) { + notification.open({ + type: "success", + key: "paymentsuccessmarkforexport", + message: t("payments.successes.markexported"), + }); - if (refetch) refetch(); + if (refetch) refetch(); - setPaymentContext({ - actions: { - refetch, - }, - context: { - ...payment, - exportedat: today, - }, - }); - } else { - notification["error"]({ - message: t("payments.errors.exporting", { - error: JSON.stringify(paymentUpdateResponse.error), - }), - }); - } - }; + setPaymentContext({ + actions: { + refetch, + }, + context: { + ...payment, + exportedat: today, + }, + }); + } else { + notification["error"]({ + message: t("payments.errors.exporting", { + error: JSON.stringify(paymentUpdateResponse.error), + }), + }); + } + }; - return ( - - ); + return ( + + ); }; export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PaymentMarkForExportButton); diff --git a/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx b/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx index 8b8fbc4ee..d103bf803 100644 --- a/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx +++ b/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx @@ -1,111 +1,109 @@ -import { gql, useMutation } from "@apollo/client"; -import { Button, notification, Popconfirm } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {gql, useMutation} from "@apollo/client"; +import {Button, notification, Popconfirm} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PaymentMarkSelectedExported); export function PaymentMarkSelectedExported({ - bodyshop, - currentUser, - paymentIds, - disabled, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [visible, setVisible] = useState(false); + bodyshop, + currentUser, + paymentIds, + disabled, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const [updatePayments] = useMutation(gql` - mutation UPDATE_PAYMENTS($paymentIds: [uuid!]!, $exportedat: timestamptz!) { - update_payments( - where: { id: { _in: $paymentIds } } - _set: { exportedat: $exportedat } - ) { - returning { - id - exportedat + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + const [updatePayments] = useMutation(gql` + mutation UPDATE_PAYMENTS($paymentIds: [uuid!]!, $exportedat: timestamptz!) { + update_payments( + where: { id: { _in: $paymentIds } } + _set: { exportedat: $exportedat } + ) { + returning { + id + exportedat + } + } } - } - } - `); + `); - const handleUpdate = async () => { - setLoading(true); - loadingCallback(true); - const result = await updatePayments({ - variables: { paymentIds: paymentIds, exportedat: new Date() }, - update(cache) {}, - }); + const handleUpdate = async () => { + setLoading(true); + loadingCallback(true); + const result = await updatePayments({ + variables: {paymentIds: paymentIds, exportedat: new Date()}, + update(cache) { + }, + }); - await insertExportLog({ - variables: { - logs: paymentIds.map((id) => { - return { - bodyshopid: bodyshop.id, - paymentid: id, - successful: true, - message: JSON.stringify([t("general.labels.markedexported")]), - useremail: currentUser.email, - }; - }), - }, - }); + await insertExportLog({ + variables: { + logs: paymentIds.map((id) => { + return { + bodyshopid: bodyshop.id, + paymentid: id, + successful: true, + message: JSON.stringify([t("general.labels.markedexported")]), + useremail: currentUser.email, + }; + }), + }, + }); - if (!result.errors) { - notification["success"]({ - message: t("payments.successes.markexported"), - }); - } else { - notification["error"]({ - message: t("bills.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - loadingCallback(false); - completedCallback && completedCallback([]); - setLoading(false); - refetch && refetch(); - setVisible(false); - }; + if (!result.errors) { + notification["success"]({ + message: t("payments.successes.markexported"), + }); + } else { + notification["error"]({ + message: t("bills.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + loadingCallback(false); + completedCallback && completedCallback([]); + setLoading(false); + refetch && refetch(); + setOpen(false); + }; - return ( - setVisible(false)} - onConfirm={handleUpdate} - disabled={disabled} - > - - - ); + return ( + setOpen(false)} + onConfirm={handleUpdate} + disabled={disabled} + > + + + ); } diff --git a/client/src/components/payment-modal/payment-modal.container.jsx b/client/src/components/payment-modal/payment-modal.container.jsx index 650a4857c..1f04687af 100644 --- a/client/src/components/payment-modal/payment-modal.container.jsx +++ b/client/src/components/payment-modal/payment-modal.container.jsx @@ -1,209 +1,203 @@ -import { useMutation } from "@apollo/client"; +import {useMutation} from "@apollo/client"; -import { Button, Form, Modal, notification, Space } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - INSERT_NEW_PAYMENT, - UPDATE_PAYMENT, -} from "../../graphql/payments.queries"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectPayment } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {Button, Form, Modal, notification, Space} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_NEW_PAYMENT, UPDATE_PAYMENT,} from "../../graphql/payments.queries"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectPayment} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import PaymentForm from "../payment-form/payment-form.component"; import PaymentReexportButton from "../payment-reexport-button/payment-reexport-button.component"; import PaymentMarkForExportButton from "../payment-mark-export-button/payment-mark-export-button-component"; const mapStateToProps = createStructuredSelector({ - paymentModal: selectPayment, - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + paymentModal: selectPayment, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setEmailOptions: (e) => dispatch(setEmailOptions(e)), - toggleModalVisible: () => dispatch(toggleModalVisible("payment")), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + toggleModalVisible: () => dispatch(toggleModalVisible("payment")), }); function PaymentModalContainer({ - paymentModal, - toggleModalVisible, - bodyshop, - currentUser, - setEmailOptions, -}) { - const [form] = Form.useForm(); - const [enterAgain, setEnterAgain] = useState(false); - const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); - const [updatePayment] = useMutation(UPDATE_PAYMENT); + paymentModal, + toggleModalVisible, + bodyshop, + currentUser, + setEmailOptions, + }) { + const [form] = Form.useForm(); + const [enterAgain, setEnterAgain] = useState(false); + const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); + const [updatePayment] = useMutation(UPDATE_PAYMENT); - const { t } = useTranslation(); - const { context, actions, visible } = paymentModal; + const {t} = useTranslation(); + const {context, actions, open} = paymentModal; - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(false); - const handleFinish = async (values) => { - const { useStripe, sendby, ...paymentObj } = values; + const handleFinish = async (values) => { + const {useStripe, sendby, ...paymentObj} = values; - setLoading(true); - let updatedPayment; //Moved up from if statement for greater scope. - try { - if (!context || (context && !context.id)) { - const newPayment = await insertPayment({ - variables: { - paymentInput: { - ...paymentObj, - }, - }, - }); + setLoading(true); + let updatedPayment; //Moved up from if statement for greater scope. + try { + if (!context || (context && !context.id)) { + const newPayment = await insertPayment({ + variables: { + paymentInput: { + ...paymentObj, + }, + }, + }); - if (!!!newPayment.errors) { - notification["success"]({ message: t("payments.successes.payment") }); - } else { - notification["error"]({ message: t("payments.errors.payment") }); + if (!!!newPayment.errors) { + notification["success"]({message: t("payments.successes.payment")}); + } else { + notification["error"]({message: t("payments.errors.payment")}); + } + const Templates = TemplateList("payment"); + if (sendby !== "none") { + GenerateDocument( + { + name: Templates.payment_receipt.key, + variables: { + id: newPayment.data.insert_payments.returning[0].id, + }, + }, + { + // to: [appData.email], + replyTo: bodyshop.email, + subject: Templates.payment_receipt.subject, + }, + sendby === "email" ? "e" : "p", + paymentObj.jobid + ); + } + } else { + updatedPayment = await updatePayment({ + variables: { + paymentId: context.id, + payment: paymentObj, + }, + }); + + if (!!!updatedPayment.errors) { + notification["success"]({message: t("payments.successes.payment")}); + } else { + notification["error"]({message: t("payments.errors.payment")}); + } + } + + if (actions.refetch) + actions.refetch( + updatedPayment && updatedPayment.data.update_payments.returning[0] + ); + + if (enterAgain) { + const prev = form.getFieldsValue(["date"]); + + form.resetFields(); + form.setFieldsValue(prev); + } else { + toggleModalVisible(); + } + setEnterAgain(false); + } catch (error) { + console.log("error", error); + } finally { + setEnterAgain(false); + setLoading(false); } - const Templates = TemplateList("payment"); - if (sendby !== "none") { - GenerateDocument( - { - name: Templates.payment_receipt.key, - variables: { - id: newPayment.data.insert_payments.returning[0].id, - }, - }, - { - // to: [appData.email], - replyTo: bodyshop.email, - subject: Templates.payment_receipt.subject, - }, - sendby === "email" ? "e" : "p", - paymentObj.jobid - ); - } - } else { - updatedPayment = await updatePayment({ - variables: { - paymentId: context.id, - payment: paymentObj, - }, - }); + }; - if (!!!updatedPayment.errors) { - notification["success"]({ message: t("payments.successes.payment") }); - } else { - notification["error"]({ message: t("payments.errors.payment") }); - } - } - - if (actions.refetch) - actions.refetch( - updatedPayment && updatedPayment.data.update_payments.returning[0] - ); - - if (enterAgain) { - const prev = form.getFieldsValue(["date"]); - - form.resetFields(); - form.setFieldsValue(prev); - } else { + const handleCancel = () => { toggleModalVisible(); - } - setEnterAgain(false); - } catch (error) { - console.log("error", error); - } finally { - setEnterAgain(false); - setLoading(false); - } - }; + }; - const handleCancel = () => { - toggleModalVisible(); - }; + useEffect(() => { + if (open) { + form.resetFields(); + form.resetFields(); + form.setFieldsValue(context); + } + }, [open, form, context]); - useEffect(() => { - if (visible) { - form.resetFields(); - form.resetFields(); - form.setFieldsValue(context); - } - }, [visible, form, context]); + useEffect(() => { + if (enterAgain) form.submit(); + }, [enterAgain, form]); - useEffect(() => { - if (enterAgain) form.submit(); - }, [enterAgain, form]); - - return ( - form.submit()} - width="50%" - onCancel={handleCancel} - okButtonProps={{ - loading: loading, - }} - afterClose={() => form.resetFields()} - footer={ - + return ( + form.submit()} + width="50%" + onCancel={handleCancel} + okButtonProps={{ + loading: loading, + }} + afterClose={() => form.resetFields()} + footer={ + - {paymentModal.context && paymentModal.context.id ? null : ( - - )} + {paymentModal.context && paymentModal.context.id ? null : ( + + )} - } - > - {!context || (context && !context.id) ? null : ( - - - - - )} + } + > + {!context || (context && !context.id) ? null : ( + + + + + )} -
- - -
- ); +
+ + +
+ ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PaymentModalContainer); diff --git a/client/src/components/payment-reexport-button/payment-reexport-button.component.jsx b/client/src/components/payment-reexport-button/payment-reexport-button.component.jsx index a3adb5422..e61d7cada 100644 --- a/client/src/components/payment-reexport-button/payment-reexport-button.component.jsx +++ b/client/src/components/payment-reexport-button/payment-reexport-button.component.jsx @@ -1,66 +1,66 @@ import React from "react"; -import { Button, notification } from "antd"; -import { useTranslation } from "react-i18next"; -import { UPDATE_PAYMENT } from "../../graphql/payments.queries"; -import { useMutation } from "@apollo/client"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { connect } from "react-redux"; +import {Button, notification} from "antd"; +import {useTranslation} from "react-i18next"; +import {UPDATE_PAYMENT} from "../../graphql/payments.queries"; +import {useMutation} from "@apollo/client"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {connect} from "react-redux"; const mapDispatchToProps = (dispatch) => ({ - setPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "payment" })), + setPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "payment"})), }); -const PaymentReexportButton = ({ payment, refetch, setPaymentContext }) => { - const { t } = useTranslation(); - const [updatePayment, { loading }] = useMutation(UPDATE_PAYMENT); +const PaymentReexportButton = ({payment, refetch, setPaymentContext}) => { + const {t} = useTranslation(); + const [updatePayment, {loading}] = useMutation(UPDATE_PAYMENT); - const handleClick = async () => { - const paymentUpdateResponse = await updatePayment({ - variables: { - paymentId: payment.id, - payment: { - exportedat: null, - }, - }, - }); + const handleClick = async () => { + const paymentUpdateResponse = await updatePayment({ + variables: { + paymentId: payment.id, + payment: { + exportedat: null, + }, + }, + }); - if (!!!paymentUpdateResponse.errors) { - notification.open({ - type: "success", - key: "paymentsuccessexport", - message: t("payments.successes.markreexported"), - }); + if (!!!paymentUpdateResponse.errors) { + notification.open({ + type: "success", + key: "paymentsuccessexport", + message: t("payments.successes.markreexported"), + }); - if (refetch) refetch(); + if (refetch) refetch(); - setPaymentContext({ - actions: { - refetch, - }, - context: { - ...payment, - exportedat: null, - }, - }); - } else { - notification["error"]({ - message: t("payments.errors.exporting", { - error: JSON.stringify(paymentUpdateResponse.error), - }), - }); - } - }; + setPaymentContext({ + actions: { + refetch, + }, + context: { + ...payment, + exportedat: null, + }, + }); + } else { + notification["error"]({ + message: t("payments.errors.exporting", { + error: JSON.stringify(paymentUpdateResponse.error), + }), + }); + } + }; - return ( - - ); + return ( + + ); }; export default connect(null, mapDispatchToProps)(PaymentReexportButton); diff --git a/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx b/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx index 0b2e6cd7b..c80c1c1db 100644 --- a/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx +++ b/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx @@ -1,219 +1,217 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; import axios from "axios"; import _ from "lodash"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; -import { UPDATE_PAYMENTS } from "../../graphql/payments.queries"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_EXPORT_LOG} from "../../graphql/accounting.queries"; +import {UPDATE_PAYMENTS} from "../../graphql/payments.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); function updatePaymentCache(items) { - client.cache.modify({ - id: "ROOT_QUERY", - fields: { - payments(existingJobs = []) { - return existingJobs.filter( - (paymentRef) => paymentRef.__ref.includes(items) === false - ); - }, - }, - }); + client.cache.modify({ + id: "ROOT_QUERY", + fields: { + payments(existingJobs = []) { + return existingJobs.filter( + (paymentRef) => paymentRef.__ref.includes(items) === false + ); + }, + }, + }); } export function PaymentsExportAllButton({ - bodyshop, - currentUser, - paymentIds, - disabled, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const [updatePayments] = useMutation(UPDATE_PAYMENTS); - const [loading, setLoading] = useState(false); - const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + bodyshop, + currentUser, + paymentIds, + disabled, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const [updatePayments] = useMutation(UPDATE_PAYMENTS); + const [loading, setLoading] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); - const handleQbxml = async () => { - setLoading(true); - if (!!loadingCallback) loadingCallback(true); - let PartnerResponse; - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { - PartnerResponse = await axios.post(`/qbo/payments`, { - payments: paymentIds, - elgen: true, - }); - } else { - let QbXmlResponse; - try { - QbXmlResponse = await axios.post("/accounting/qbxml/payments", { - payments: paymentIds, - }); - } catch (error) { - console.log("Error getting QBXML from Server.", error); - notification["error"]({ - message: t("payments.errors.exporting", { - error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), - }), - }); - if (loadingCallback) loadingCallback(false); - setLoading(false); - return; - } + const handleQbxml = async () => { + setLoading(true); + if (!!loadingCallback) loadingCallback(true); + let PartnerResponse; + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) { + PartnerResponse = await axios.post(`/qbo/payments`, { + payments: paymentIds, + elgen: true, + }); + } else { + let QbXmlResponse; + try { + QbXmlResponse = await axios.post("/accounting/qbxml/payments", { + payments: paymentIds, + }); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("payments.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } - try { - PartnerResponse = await axios.post( - "http://localhost:1337/qb/", - QbXmlResponse.data + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("payments.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + } + + const groupedData = _.groupBy( + PartnerResponse.data, + bodyshop.accountingconfig.qbo ? "paymentid" : "id" ); - } catch (error) { - console.log("Error connecting to quickbooks or partner.", error); - notification["error"]({ - message: t("payments.errors.exporting-partner"), + const proms = []; + Object.keys(groupedData).forEach((key) => { + proms.push( + (async () => { + const failedTransactions = groupedData[key].filter((r) => !r.success); + const successfulTransactions = groupedData[key].filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("payments.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + paymentid: key, + successful: false, + message: JSON.stringify( + failedTransactions.map((ft) => ft.errorMessage) + ), + useremail: currentUser.email, + }, + ], + }, + }); + } + } else { + if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { + //QBO Logs are handled server side. + + await insertExportLog({ + variables: { + logs: [ + { + bodyshopid: bodyshop.id, + paymentid: key, + successful: true, + useremail: currentUser.email, + }, + ], + }, + }); + const paymentUpdateResponse = await updatePayments({ + variables: { + paymentIdList: successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && + bodyshop.accountingconfig.qbo + ? "paymentid" + : "id" + ] + ), + payment: { + exportedat: new Date(), + }, + }, + }); + if (!!!paymentUpdateResponse.errors) { + notification.open({ + type: "success", + key: "paymentsuccessexport", + message: t("payments.successes.exported"), + }); + updatePaymentCache( + paymentUpdateResponse.data.update_payments.returning.map( + (payment) => payment.id + ) + ); + } else { + notification["error"]({ + message: t("payments.errors.exporting", { + error: JSON.stringify(paymentUpdateResponse.error), + }), + }); + } + } + if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { + notification.open({ + type: "success", + key: "paymentsuccessexport", + message: t("payments.successes.exported"), + }); + updatePaymentCache([ + ...new Set( + successfulTransactions.map( + (st) => + st[ + bodyshop.accountingconfig && + bodyshop.accountingconfig.qbo + ? "paymentid" + : "id" + ] + ) + ), + ]); + } + } + })() + ); }); + await Promise.all(proms); + if (!!completedCallback) completedCallback([]); if (!!loadingCallback) loadingCallback(false); setLoading(false); - return; - } - } + }; - const groupedData = _.groupBy( - PartnerResponse.data, - bodyshop.accountingconfig.qbo ? "paymentid" : "id" + return ( + ); - const proms = []; - Object.keys(groupedData).forEach((key) => { - proms.push( - (async () => { - const failedTransactions = groupedData[key].filter((r) => !r.success); - const successfulTransactions = groupedData[key].filter( - (r) => r.success - ); - if (failedTransactions.length > 0) { - //Uh oh. At least one was no good. - failedTransactions.map((ft) => - notification["error"]({ - message: t("payments.errors.exporting", { - error: ft.errorMessage || "", - }), - }) - ); - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - paymentid: key, - successful: false, - message: JSON.stringify( - failedTransactions.map((ft) => ft.errorMessage) - ), - useremail: currentUser.email, - }, - ], - }, - }); - } - } else { - if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) { - //QBO Logs are handled server side. - - await insertExportLog({ - variables: { - logs: [ - { - bodyshopid: bodyshop.id, - paymentid: key, - successful: true, - useremail: currentUser.email, - }, - ], - }, - }); - const paymentUpdateResponse = await updatePayments({ - variables: { - paymentIdList: successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && - bodyshop.accountingconfig.qbo - ? "paymentid" - : "id" - ] - ), - payment: { - exportedat: new Date(), - }, - }, - }); - if (!!!paymentUpdateResponse.errors) { - notification.open({ - type: "success", - key: "paymentsuccessexport", - message: t("payments.successes.exported"), - }); - updatePaymentCache( - paymentUpdateResponse.data.update_payments.returning.map( - (payment) => payment.id - ) - ); - } else { - notification["error"]({ - message: t("payments.errors.exporting", { - error: JSON.stringify(paymentUpdateResponse.error), - }), - }); - } - } - if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) { - notification.open({ - type: "success", - key: "paymentsuccessexport", - message: t("payments.successes.exported"), - }); - updatePaymentCache([ - ...new Set( - successfulTransactions.map( - (st) => - st[ - bodyshop.accountingconfig && - bodyshop.accountingconfig.qbo - ? "paymentid" - : "id" - ] - ) - ), - ]); - } - } - })() - ); - }); - await Promise.all(proms); - if (!!completedCallback) completedCallback([]); - if (!!loadingCallback) loadingCallback(false); - setLoading(false); - }; - - return ( - - ); } export default connect(mapStateToProps, null)(PaymentsExportAllButton); diff --git a/client/src/components/payments-generate-link/payments-generate-link.component.jsx b/client/src/components/payments-generate-link/payments-generate-link.component.jsx index 93d6aa500..2496b10b0 100644 --- a/client/src/components/payments-generate-link/payments-generate-link.component.jsx +++ b/client/src/components/payments-generate-link/payments-generate-link.component.jsx @@ -1,156 +1,154 @@ -import { CopyFilled } from "@ant-design/icons"; -import { Button, Form, Popover, Space, message } from "antd"; +import {CopyFilled} from "@ant-design/icons"; +import {Button, Form, message, Popover, Space} from "antd"; import axios from "axios"; import Dinero from "dinero.js"; -import { parsePhoneNumber } from "libphonenumber-js"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - openChatByPhone, - setMessage, -} from "../../redux/messaging/messaging.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {parsePhoneNumber} from "libphonenumber-js"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {openChatByPhone, setMessage,} from "../../redux/messaging/messaging.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormItemComponent from "../form-items-formatted/currency-form-item.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), - setMessage: (text) => dispatch(setMessage(text)), + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), + setMessage: (text) => dispatch(setMessage(text)), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PaymentsGenerateLink); export function PaymentsGenerateLink({ - bodyshop, - callback, - job, - openChatByPhone, - setMessage, -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); + bodyshop, + callback, + job, + openChatByPhone, + setMessage, + }) { + const {t} = useTranslation(); + const [form] = Form.useForm(); - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [paymentLink, setPaymentLink] = useState(null); + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); + const [paymentLink, setPaymentLink] = useState(null); - const handleFinish = async ({ amount }) => { - setLoading(true); + const handleFinish = async ({amount}) => { + setLoading(true); - const p = parsePhoneNumber(job.ownr_ph1, "CA"); - setLoading(true); - const response = await axios.post("/intellipay/generate_payment_url", { - bodyshop, - amount: amount, - account: job.ro_number, - invoice: job.id, - }); - setLoading(false); - setPaymentLink(response.data.shorUrl); + const p = parsePhoneNumber(job.ownr_ph1, "CA"); + setLoading(true); + const response = await axios.post("/intellipay/generate_payment_url", { + bodyshop, + amount: amount, + account: job.ro_number, + invoice: job.id, + }); + setLoading(false); + setPaymentLink(response.data.shorUrl); - openChatByPhone({ - phone_num: p.formatInternational(), - jobid: job.id, - }); - setMessage( - t("payments.labels.smspaymentreminder", { - shopname: bodyshop.shopname, - amount: amount, - payment_link: response.data.shorUrl, - }) + openChatByPhone({ + phone_num: p.formatInternational(), + jobid: job.id, + }); + setMessage( + t("payments.labels.smspaymentreminder", { + shopname: bodyshop.shopname, + amount: amount, + payment_link: response.data.shorUrl, + }) + ); + + //Add in confirmation & errors. + if (callback) callback(); + + // setOpen(false); + setLoading(false); + }; + + const popContent = ( +
+
+ + + + {paymentLink && ( + + { + navigator.clipboard.writeText(paymentLink); + message.success(t("general.actions.copied")); + }} + > +
{ + //Copy the link. + }} + > + {paymentLink} +
+ {" "} + +
+ +
+ )} + + + + + +
); - //Add in confirmation & errors. - if (callback) callback(); - - // setVisible(false); - setLoading(false); - }; - - const popContent = ( -
-
- - - - {paymentLink && ( - - { - navigator.clipboard.writeText(paymentLink); - message.success(t("general.actions.copied")); - }} - > -
{ - //Copy the link. - }} - > - {paymentLink} -
{" "} - -
- -
- )} - - - - - -
- ); - - return ( - - - - ); + + ); } diff --git a/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx index 86ad50cb8..9403f66fa 100644 --- a/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx +++ b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx @@ -1,308 +1,308 @@ -import { EditFilled, SyncOutlined } from "@ant-design/icons"; -import { useApolloClient } from "@apollo/client"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {EditFilled, SyncOutlined} from "@ant-design/icons"; +import {useApolloClient} from "@apollo/client"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import axios from "axios"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_PAYMENT_BY_ID } from "../../graphql/payments.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_PAYMENT_BY_ID} from "../../graphql/payments.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { alphaSort } from "../../utils/sorters"; +import {DateFormatter, DateTimeFormatter} from "../../utils/DateFormatter"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {alphaSort} from "../../utils/sorters"; import CaBcEtfTableModalContainer from "../ca-bc-etf-table-modal/ca-bc-etf-table-modal.container"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setPaymentContext: (context) => - dispatch(setModalContext({ context: context, modal: "payment" })), - setCaBcEtfTableContext: (context) => - dispatch( - setModalContext({ context: context, modal: "ca_bc_eftTableConvert" }) - ), + setPaymentContext: (context) => + dispatch(setModalContext({context: context, modal: "payment"})), + setCaBcEtfTableContext: (context) => + dispatch( + setModalContext({context: context, modal: "ca_bc_eftTableConvert"}) + ), }); export function PaymentsListPaginated({ - setPaymentContext, - setCaBcEtfTableContext, - refetch, - loading, - payments, - total, - bodyshop, -}) { - const search = queryString.parse(useLocation().search); - const [openSearchResults, setOpenSearchResults] = useState([]); - const [searchLoading, setSearchLoading] = useState(false); - const { page, sortcolumn, sortorder } = search; - const client = useApolloClient(); - const history = useHistory(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const Templates = TemplateList("payment"); - const { t } = useTranslation(); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - // sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), - // sortOrder: sortcolumn === "ro_number" && sortorder, - render: (text, record) => { - return record.job ? ( - - {record.job.ro_number || t("general.labels.na")} - - ) : ( - {t("general.labels.na")} - ); - }, - }, - { - title: t("payments.fields.paymentnum"), - dataIndex: "paymentnum", - key: "paymentnum", - sorter: (a, b) => alphaSort(a.paymentnum, b.paymentnum), - sortOrder: sortcolumn === "paymentnum" && sortorder, - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - // sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), - // sortOrder: sortcolumn === "owner" && sortorder, - render: (text, record) => { - return record.job?.owner ? ( - - - - ) : ( - - + setPaymentContext, + setCaBcEtfTableContext, + refetch, + loading, + payments, + total, + bodyshop, + }) { + const search = queryString.parse(useLocation().search); + const [openSearchResults, setOpenSearchResults] = useState([]); + const [searchLoading, setSearchLoading] = useState(false); + const {page, sortcolumn, sortorder} = search; + const client = useApolloClient(); + const history = useNavigate(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); + const Templates = TemplateList("payment"); + const {t} = useTranslation(); + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + // sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + // sortOrder: sortcolumn === "ro_number" && sortorder, + render: (text, record) => { + return record.job ? ( + + {record.job.ro_number || t("general.labels.na")} + + ) : ( + {t("general.labels.na")} + ); + }, + }, + { + title: t("payments.fields.paymentnum"), + dataIndex: "paymentnum", + key: "paymentnum", + sorter: (a, b) => alphaSort(a.paymentnum, b.paymentnum), + sortOrder: sortcolumn === "paymentnum" && sortorder, + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + // sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), + // sortOrder: sortcolumn === "owner" && sortorder, + render: (text, record) => { + return record.job?.owner ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("payments.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => alphaSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("payments.fields.amount"), - dataIndex: "amount", - key: "amount", - render: (text, record) => ( - {record.amount} - ), - }, - { - title: t("payments.fields.memo"), - dataIndex: "memo", - key: "memo", - }, - { - title: t("payments.fields.payer"), - dataIndex: "payer", - key: "payer", - }, - { - title: t("payments.fields.type"), - dataIndex: "type", - key: "type", - }, - { - title: t("payments.fields.transactionid"), - dataIndex: "transactionid", - key: "transactionid", - }, - { - title: t("payments.fields.created_at"), - dataIndex: "created_at", - key: "created_at", - render: (text, record) => ( - {record.created_at} - ), - }, - { - title: t("payments.fields.exportedat"), - dataIndex: "exportedat", - key: "exportedat", - render: (text, record) => ( - {record.exportedat} - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - - - - ), - }, - ]; + setPaymentContext({ + actions: { + refetch: apolloResults + ? (updatedRecord) => { + setOpenSearchResults((results) => + results.map((result) => { + if (result.id !== record.id) { + return result; + } + return updatedRecord; + }) + ); + } + : refetch, + }, + context: apolloResults ? apolloResults : record, + }); + }} + > + + + + + ), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - search.sortcolumn = sorter.columnKey; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history({search: queryString.stringify(search)}); + }; - useEffect(() => { - if (search.search && search.search.trim() !== "") { - searchPayments(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - async function searchPayments(value) { - try { - setSearchLoading(true); - const searchData = await axios.post("/search", { - search: value || search.search, - index: "payments", - }); - setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); - } catch (error) { - console.log("Error while fetching search results", error); - } finally { - setSearchLoading(false); - } - } - - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - - - )} - {bodyshop.region_config === "CA_BC" && ( - <> - - - - )} - - { - search.search = value; - history.push({ search: queryString.stringify(search) }); - searchPayments(value); - }} - loading={loading || searchLoading} - enterButton - /> - - } - > -
{ + if (search.search && search.search.trim() !== "") { + searchPayments(); } - columns={columns} - rowKey="id" - dataSource={search?.search ? openSearchResults : payments} - onChange={handleTableChange} - /> - - ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function searchPayments(value) { + try { + setSearchLoading(true); + const searchData = await axios.post("/search", { + search: value || search.search, + index: "payments", + }); + setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); + } catch (error) { + console.log("Error while fetching search results", error); + } finally { + setSearchLoading(false); + } + } + + return ( + + {search.search && ( + <> + + {t("general.labels.searchresults", {search: search.search})} + + + + )} + {bodyshop.region_config === "CA_BC" && ( + <> + + + + )} + + { + search.search = value; + history({search: queryString.stringify(search)}); + searchPayments(value); + }} + loading={loading || searchLoading} + enterButton + /> + + } + > +
+ + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PaymentsListPaginated); diff --git a/client/src/components/phonebook-form/phonebook-form.component.jsx b/client/src/components/phonebook-form/phonebook-form.component.jsx index e40096ce9..4df793c0a 100644 --- a/client/src/components/phonebook-form/phonebook-form.component.jsx +++ b/client/src/components/phonebook-form/phonebook-form.component.jsx @@ -1,184 +1,182 @@ -import { Button, Form, Input, PageHeader, Space } from "antd"; +import {Button, Form, Input, Space} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import PhoneFormItem, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import PhoneFormItem, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectAuthLevel, - selectBodyshop, -} from "../../redux/user/user.selectors"; +import {HasRbacAccess} from "../rbac-wrapper/rbac-wrapper.component"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectAuthLevel, selectBodyshop,} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - authLevel: selectAuthLevel, - bodyshop: selectBodyshop, + authLevel: selectAuthLevel, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PhonebookFormComponent); export function PhonebookFormComponent({ - authLevel, - bodyshop, - form, - formLoading, - handleDelete, -}) { - const { t } = useTranslation(); + authLevel, + bodyshop, + form, + formLoading, + handleDelete, + }) { + const {t} = useTranslation(); - const { getFieldValue } = form; + const {getFieldValue} = form; - const hasNoAccess = !HasRbacAccess({ - bodyshop, - authLevel, - action: "phonebook:edit", - }); + const hasNoAccess = !HasRbacAccess({ + bodyshop, + authLevel, + action: "phonebook:edit", + }); - return ( -
- - - - - } - /> - - - - - - - - - ({ - validator(rule, value) { - const { firstname, lastname, company } = getFieldsValue([ - "firstname", - "lastname", - "company", - ]); - - if ( - (firstname && firstname.trim() !== "") || - (lastname && lastname.trim() !== "") || - (company && company.trim() !== "") - ) { - return Promise.resolve(); + return ( +
+ + + + } - return Promise.reject(t("phonebook.labels.onenamerequired")); - }, - }), - ]} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PhoneItemFormatterValidation(getFieldValue, "phone1"), - ]} - > - - - - PhoneItemFormatterValidation(getFieldValue, "phone2"), - ]} - > - - - - PhoneItemFormatterValidation(getFieldValue, "fax"), - ]} - > - - - -
- ); + /> + + + + + + + + + ({ + validator(rule, value) { + const {firstname, lastname, company} = getFieldsValue([ + "firstname", + "lastname", + "company", + ]); + + if ( + (firstname && firstname.trim() !== "") || + (lastname && lastname.trim() !== "") || + (company && company.trim() !== "") + ) { + return Promise.resolve(); + } + return Promise.reject(t("phonebook.labels.onenamerequired")); + }, + }), + ]} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PhoneItemFormatterValidation(getFieldValue, "phone1"), + ]} + > + + + + PhoneItemFormatterValidation(getFieldValue, "phone2"), + ]} + > + + + + PhoneItemFormatterValidation(getFieldValue, "fax"), + ]} + > + + + +
+ ); } diff --git a/client/src/components/phonebook-form/phonebook-form.container.jsx b/client/src/components/phonebook-form/phonebook-form.container.jsx index ea99c30b9..b0af13d3c 100644 --- a/client/src/components/phonebook-form/phonebook-form.container.jsx +++ b/client/src/components/phonebook-form/phonebook-form.container.jsx @@ -1,154 +1,155 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Form, notification } from "antd"; +import {useMutation, useQuery} from "@apollo/client"; +import {Form, notification} from "antd"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import { - DELETE_PHONEBOOK, - INSERT_NEW_PHONEBOOK, - QUERY_PHONEBOOK_BY_ID, - UPDATE_PHONEBOOK, + DELETE_PHONEBOOK, + INSERT_NEW_PHONEBOOK, + QUERY_PHONEBOOK_BY_ID, + UPDATE_PHONEBOOK, } from "../../graphql/phonebook.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import PhonebookFormComponent from "./phonebook-form.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -function PhonebookFormContainer({ refetch, bodyshop }) { - const history = useHistory(); - const search = queryString.parse(useLocation().search); - const { phonebookentry } = search; - const [formLoading, setFormLoading] = useState(false); - const [form] = Form.useForm(); - const { t } = useTranslation(); - const { loading, error, data } = useQuery(QUERY_PHONEBOOK_BY_ID, { - variables: { id: phonebookentry }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: !!!phonebookentry || phonebookentry === "new", - }); - - const [updatePhonebook] = useMutation(UPDATE_PHONEBOOK); - const [insertPhonebook] = useMutation(INSERT_NEW_PHONEBOOK); - const [deletePhonebook] = useMutation(DELETE_PHONEBOOK); - - const handleDelete = async () => { - setFormLoading(true); - const result = await deletePhonebook({ - variables: { id: phonebookentry }, - refetchQueries: ["QUERY_PHONEBOOK_PAGINATED"], +function PhonebookFormContainer({refetch, bodyshop}) { + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const {phonebookentry} = search; + const [formLoading, setFormLoading] = useState(false); + const [form] = Form.useForm(); + const {t} = useTranslation(); + const {loading, error, data} = useQuery(QUERY_PHONEBOOK_BY_ID, { + variables: {id: phonebookentry}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !!!phonebookentry || phonebookentry === "new", }); - if (!result.errors) { - notification["success"]({ - message: t("phonebook.successes.deleted"), - }); - delete search.phonebookentry; - history.push({ search: queryString.stringify(search) }); - if (refetch) - refetch().then((r) => { - form.resetFields(); - }); - } else { - notification["error"]({ - message: t("phonebook.errors.deleting", { - message: JSON.stringify(result.errors), - }), - }); - } + const [updatePhonebook] = useMutation(UPDATE_PHONEBOOK); + const [insertPhonebook] = useMutation(INSERT_NEW_PHONEBOOK); + const [deletePhonebook] = useMutation(DELETE_PHONEBOOK); - setFormLoading(false); - }; - - const handleFinish = async (values) => { - setFormLoading(true); - if (phonebookentry && phonebookentry !== "new") { - //It's a phonebook to update. - const result = await updatePhonebook({ - variables: { id: phonebookentry, phonebook: values }, - refetchQueries: ["QUERY_PHONEBOOK_PAGINATED"], - }); - - if (!result.errors) { - notification["success"]({ - message: t("phonebook.successes.saved"), + const handleDelete = async () => { + setFormLoading(true); + const result = await deletePhonebook({ + variables: {id: phonebookentry}, + refetchQueries: ["QUERY_PHONEBOOK_PAGINATED"], }); - if (refetch) await refetch(); - form.setFieldsValue(data.phonebook_by_pk); - form.resetFields(); + if (!result.errors) { + notification["success"]({ + message: t("phonebook.successes.deleted"), + }); + delete search.phonebookentry; + history({search: queryString.stringify(search)}); + if (refetch) + refetch().then((r) => { + form.resetFields(); + }); + } else { + notification["error"]({ + message: t("phonebook.errors.deleting", { + message: JSON.stringify(result.errors), + }), + }); + } setFormLoading(false); - } else { - notification["error"]({ - message: t("phonebook.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); + }; - setFormLoading(false); - } - } else { - //It's a new phonebook to insert. - const result = await insertPhonebook({ - variables: { - phonebook_entry: [{ ...values, bodyshopid: bodyshop.id }], - }, - refetchQueries: ["QUERY_PHONEBOOK_PAGINATED"], - }); + const handleFinish = async (values) => { + setFormLoading(true); + if (phonebookentry && phonebookentry !== "new") { + //It's a phonebook to update. + const result = await updatePhonebook({ + variables: {id: phonebookentry, phonebook: values}, + refetchQueries: ["QUERY_PHONEBOOK_PAGINATED"], + }); - if (!result.errors) { - notification["success"]({ - message: t("phonebook.successes.saved"), - }); + if (!result.errors) { + notification["success"]({ + message: t("phonebook.successes.saved"), + }); - if (refetch) await refetch(); - form.resetFields(); - form.resetFields(); - delete search.phonebookentry; - history.push({ search: queryString.stringify(search) }); - setFormLoading(false); - } else { - notification["error"]({ - message: t("phonebook.errors.saving"), - }); - setFormLoading(false); - } - } - }; + if (refetch) await refetch(); + form.setFieldsValue(data.phonebook_by_pk); + form.resetFields(); - useEffect(() => { - if (data || phonebookentry === "new") form.resetFields(); - }, [data, form, phonebookentry]); + setFormLoading(false); + } else { + notification["error"]({ + message: t("phonebook.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); - if (loading) return ; - if (error) return ; + setFormLoading(false); + } + } else { + //It's a new phonebook to insert. + const result = await insertPhonebook({ + variables: { + phonebook_entry: [{...values, bodyshopid: bodyshop.id}], + }, + refetchQueries: ["QUERY_PHONEBOOK_PAGINATED"], + }); - return ( -
- {phonebookentry ? ( - - ) : ( - t("phonebook.labels.noneselected") - )} - - ); + if (!result.errors) { + notification["success"]({ + message: t("phonebook.successes.saved"), + }); + + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); + delete search.phonebookentry; + history({search: queryString.stringify(search)}); + setFormLoading(false); + } else { + notification["error"]({ + message: t("phonebook.errors.saving"), + }); + setFormLoading(false); + } + } + }; + + useEffect(() => { + if (data || phonebookentry === "new") form.resetFields(); + }, [data, form, phonebookentry]); + + if (loading) return ; + if (error) return ; + + return ( +
+ {phonebookentry ? ( + + ) : ( + t("phonebook.labels.noneselected") + )} + + ); } + export default connect(mapStateToProps, null)(PhonebookFormContainer); diff --git a/client/src/components/print-center-item/print-center-item.component.jsx b/client/src/components/print-center-item/print-center-item.component.jsx index 48bc92291..134f2d81e 100644 --- a/client/src/components/print-center-item/print-center-item.component.jsx +++ b/client/src/components/print-center-item/print-center-item.component.jsx @@ -1,76 +1,78 @@ -import { MailOutlined, PrinterOutlined } from "@ant-design/icons"; -import { Space, Spin } from "antd"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import { selectPrintCenter } from "../../redux/modals/modals.selectors"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; +import {MailOutlined, PrinterOutlined} from "@ant-design/icons"; +import {Space, Spin} from "antd"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {selectPrintCenter} from "../../redux/modals/modals.selectors"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; + const mapStateToProps = createStructuredSelector({ - printCenterModal: selectPrintCenter, - bodyshop: selectBodyshop, - technician: selectTechnician, + printCenterModal: selectPrintCenter, + bodyshop: selectBodyshop, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - setEmailOptions: (e) => dispatch(setEmailOptions(e)), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), }); export function PrintCenterItemComponent({ - printCenterModal, - setEmailOptions, - item, - id, - bodyshop, - disabled, - technician, -}) { - const [loading, setLoading] = useState(false); - const { context } = printCenterModal; - const renderToNewWindow = async () => { - setLoading(true); - await GenerateDocument( - { - name: item.key, - variables: { id: id }, - }, - {}, - "p" - ); - setLoading(false); - }; + printCenterModal, + setEmailOptions, + item, + id, + bodyshop, + disabled, + technician, + }) { + const [loading, setLoading] = useState(false); + const {context} = printCenterModal; + const renderToNewWindow = async () => { + setLoading(true); + await GenerateDocument( + { + name: item.key, + variables: {id: id}, + }, + {}, + "p" + ); + setLoading(false); + }; - if (disabled) return
  • {item.title}
  • ; - return ( -
  • - - {item.title} - - {!technician ? ( - { - GenerateDocument( - { - name: item.key, - variables: { id: id }, - }, - { - to: context.job && context.job.ownr_ea, - subject: item.subject, - }, - "e", - id - ); - }} - /> - ) : null} - {loading && } - -
  • - ); + if (disabled) return
  • {item.title}
  • ; + return ( +
  • + + {item.title} + + {!technician ? ( + { + GenerateDocument( + { + name: item.key, + variables: {id: id}, + }, + { + to: context.job && context.job.ownr_ea, + subject: item.subject, + }, + "e", + id + ); + }} + /> + ) : null} + {loading && } + +
  • + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PrintCenterItemComponent); diff --git a/client/src/components/print-center-jobs-labels/print-center-jobs-labels.component.jsx b/client/src/components/print-center-jobs-labels/print-center-jobs-labels.component.jsx index 5bd0f15e5..9ccb08027 100644 --- a/client/src/components/print-center-jobs-labels/print-center-jobs-labels.component.jsx +++ b/client/src/components/print-center-jobs-labels/print-center-jobs-labels.component.jsx @@ -1,132 +1,124 @@ -import { - Button, - Card, - Form, - InputNumber, - notification, - Popover, - Radio, -} from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {Button, Card, Form, InputNumber, notification, Popover, Radio,} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PrintCenterJobsLabels); -export function PrintCenterJobsLabels({ bodyshop, jobId }) { - const [isModalVisible, setIsModalVisible] = useState(false); - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const [form] = Form.useForm(); +export function PrintCenterJobsLabels({bodyshop, jobId}) { + const [isModalVisible, setIsModalVisible] = useState(false); + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const [form] = Form.useForm(); - const handleOk = (e) => { - e.stopPropagation(); - form.submit(); - }; + const handleOk = (e) => { + e.stopPropagation(); + form.submit(); + }; - const handleCancel = () => { - setIsModalVisible(false); - setLoading(false); - }; - const handleFinish = async ({ template, ...values }) => { - const { sendtype, ...restVals } = values; - setLoading(true); - try { - await GenerateDocument( - { - name: TemplateList("job_special")[template].key, - variables: { id: jobId }, - context: restVals, - }, - {}, - "p", - jobId - ); - setIsModalVisible(false); - } catch (error) { - notification.open({ type: "error", message: JSON.stringify(error) }); - } finally { - setLoading(false); - } + const handleCancel = () => { + setIsModalVisible(false); + setLoading(false); + }; + const handleFinish = async ({template, ...values}) => { + const {sendtype, ...restVals} = values; + setLoading(true); + try { + await GenerateDocument( + { + name: TemplateList("job_special")[template].key, + variables: {id: jobId}, + context: restVals, + }, + {}, + "p", + jobId + ); + setIsModalVisible(false); + } catch (error) { + notification.open({type: "error", message: JSON.stringify(error)}); + } finally { + setLoading(false); + } - form.resetFields(); - }; + form.resetFields(); + }; - const content = ( - -
    - - - - {t("printcenter.jobs.parts_label_multiple")} - - - {t("printcenter.jobs.folder_label_multiple")} - - - - - - - - - - - - -
    - ); - return ( - - - - ); + const content = ( + +
    + + + + {t("printcenter.jobs.parts_label_multiple")} + + + {t("printcenter.jobs.folder_label_multiple")} + + + + + + + + + + + + +
    + ); + return ( + + + + ); } diff --git a/client/src/components/print-center-jobs/print-center-jobs.component.jsx b/client/src/components/print-center-jobs/print-center-jobs.component.jsx index 96169a7d5..2616051eb 100644 --- a/client/src/components/print-center-jobs/print-center-jobs.component.jsx +++ b/client/src/components/print-center-jobs/print-center-jobs.component.jsx @@ -1,141 +1,144 @@ -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Card, Col, Input, Row, Space, Typography } from "antd"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Card, Col, Input, Row, Space, Typography} from "antd"; import _ from "lodash"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectPrintCenter } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { TemplateList } from "../../utils/TemplateConstants"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectPrintCenter} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {TemplateList} from "../../utils/TemplateConstants"; import Jobd3RdPartyModal from "../job-3rd-party-modal/job-3rd-party-modal.component"; import PrintCenterItem from "../print-center-item/print-center-item.component"; import PrintCenterJobsLabels from "../print-center-jobs-labels/print-center-jobs-labels.component"; import PrintCenterSpeedPrint from "../print-center-speed-print/print-center-speed-print.component"; + const mapStateToProps = createStructuredSelector({ - printCenterModal: selectPrintCenter, - bodyshop: selectBodyshop, + printCenterModal: selectPrintCenter, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); -export function PrintCenterJobsComponent({ printCenterModal, bodyshop }) { - const [search, setSearch] = useState(""); - const { id: jobId, job } = printCenterModal.context; - const tempList = TemplateList("job", {}); - const { t } = useTranslation(); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); +export function PrintCenterJobsComponent({printCenterModal, bodyshop}) { + const [search, setSearch] = useState(""); + const {id: jobId, job} = printCenterModal.context; + const tempList = TemplateList("job", {}); + const {t} = useTranslation(); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); - const Templates = - bodyshop.cdk_dealerid === null && bodyshop.pbs_serialnumber === null - ? Object.keys(tempList) - .map((key) => { - return tempList[key]; - }) - .filter( - (temp) => - (!temp.regions || - (temp.regions && temp.regions[bodyshop.region_config]) || - (temp.regions && - bodyshop.region_config.includes(Object.keys(temp.regions)) === - true)) && - (!temp.dms || temp.dms === false) - ) - : Object.keys(tempList) - .map((key) => { - return tempList[key]; - }) - .filter( - (temp) => - !temp.regions || - (temp.regions && temp.regions[bodyshop.region_config]) || - (temp.regions && - bodyshop.region_config.includes(Object.keys(temp.regions)) === - true) - ); - const JobsReportsList = - Enhanced_Payroll.treatment === "on" - ? Object.keys(Templates) - .map((key) => { - return Templates[key]; - }) - .filter( - (temp) => - temp.enhanced_payroll === undefined || - temp.enhanced_payroll === true - ) - : Object.keys(Templates) - .map((key) => { - return Templates[key]; - }) - .filter( - (temp) => - temp.enhanced_payroll === undefined || - temp.enhanced_payroll === false - ); - const filteredJobsReportsList = - search !== "" - ? JobsReportsList.filter((r) => - r.title.toLowerCase().includes(search.toLowerCase()) - ) - : JobsReportsList; - //Group it, create cards, and then filter out. + const Templates = + bodyshop.cdk_dealerid === null && bodyshop.pbs_serialnumber === null + ? Object.keys(tempList) + .map((key) => { + return tempList[key]; + }) + .filter( + (temp) => + (!temp.regions || + (temp.regions && temp.regions[bodyshop.region_config]) || + (temp.regions && + bodyshop.region_config.includes(Object.keys(temp.regions)) === + true)) && + (!temp.dms || temp.dms === false) + ) + : Object.keys(tempList) + .map((key) => { + return tempList[key]; + }) + .filter( + (temp) => + !temp.regions || + (temp.regions && temp.regions[bodyshop.region_config]) || + (temp.regions && + bodyshop.region_config.includes(Object.keys(temp.regions)) === + true) + ); + const JobsReportsList = + Enhanced_Payroll.treatment === "on" + ? Object.keys(Templates) + .map((key) => { + return Templates[key]; + }) + .filter( + (temp) => + temp.enhanced_payroll === undefined || + temp.enhanced_payroll === true + ) + : Object.keys(Templates) + .map((key) => { + return Templates[key]; + }) + .filter( + (temp) => + temp.enhanced_payroll === undefined || + temp.enhanced_payroll === false + ); + const filteredJobsReportsList = + search !== "" + ? JobsReportsList.filter((r) => + r.title.toLowerCase().includes(search.toLowerCase()) + ) + : JobsReportsList; - const grouped = _.groupBy(filteredJobsReportsList, "group"); + //Group it, create cards, and then filter out. - return ( -
    - -
    - - - - - - - setSearch(e.target.value)} - value={search} - /> - - } - > + const grouped = _.groupBy(filteredJobsReportsList, "group"); + + return ( +
    - {Object.keys(grouped).map((key) => ( -
    - - - {t(`printcenter.labels.groups.${key}`)} - -
      - {grouped[key].map((item) => ( - - ))} -
    -
    + + + + + + + + setSearch(e.target.value)} + value={search} + /> + + } + > + + {Object.keys(grouped).map((key) => ( + + + + {t(`printcenter.labels.groups.${key}`)} + +
      + {grouped[key].map((item) => ( + + ))} +
    +
    + + ))} + + - ))} - - - - - ); + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PrintCenterJobsComponent); diff --git a/client/src/components/print-center-modal/print-center-modal.component.jsx b/client/src/components/print-center-modal/print-center-modal.component.jsx index 926a0f7fc..d1be2a518 100644 --- a/client/src/components/print-center-modal/print-center-modal.component.jsx +++ b/client/src/components/print-center-modal/print-center-modal.component.jsx @@ -1,23 +1,23 @@ import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import PrintCenterJobs from "../print-center-jobs/print-center-jobs.component"; -export default function PrintCenterModalComponent({ context }) { - const { t } = useTranslation(); - const { type } = context; +export default function PrintCenterModalComponent({context}) { + const {t} = useTranslation(); + const {type} = context; - let ModalContent; + let ModalContent; - switch (type) { - case "job": - ModalContent = PrintCenterJobs; - break; - default: - break; - } - return ( -
    - {ModalContent ? : t("printcenter.errors.nocontexttype")} -
    - ); + switch (type) { + case "job": + ModalContent = PrintCenterJobs; + break; + default: + break; + } + return ( +
    + {ModalContent ? : t("printcenter.errors.nocontexttype")} +
    + ); } diff --git a/client/src/components/print-center-modal/print-center-modal.container.jsx b/client/src/components/print-center-modal/print-center-modal.container.jsx index 37dba6614..e99eb87e9 100644 --- a/client/src/components/print-center-modal/print-center-modal.container.jsx +++ b/client/src/components/print-center-modal/print-center-modal.container.jsx @@ -1,48 +1,48 @@ -import { Modal } from "antd"; +import {Modal} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectPrintCenter } from "../../redux/modals/modals.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectPrintCenter} from "../../redux/modals/modals.selectors"; import PrintCenterModalComponent from "./print-center-modal.component"; import "./print-center-modal.styles.scss"; const mapStateToProps = createStructuredSelector({ - printCenterModal: selectPrintCenter, + printCenterModal: selectPrintCenter, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("printCenter")), + toggleModalVisible: () => dispatch(toggleModalVisible("printCenter")), }); export function PrintCenterModalContainer({ - printCenterModal, - toggleModalVisible, -}) { - const { t } = useTranslation(); + printCenterModal, + toggleModalVisible, + }) { + const {t} = useTranslation(); - const { visible, context } = printCenterModal; - //const { type } = context; - // const { refetch } = actions; + const {open, context} = printCenterModal; + //const { type } = context; + // const { refetch } = actions; - return ( - toggleModalVisible()} - onCancel={() => toggleModalVisible()} - cancelButtonProps={{ style: { display: "none" } }} - okText={t("general.actions.close")} - width="90%" - title={t("printcenter.labels.title")} - destroyOnClose - > - - - ); + return ( + toggleModalVisible()} + onCancel={() => toggleModalVisible()} + cancelButtonProps={{style: {display: "none"}}} + okText={t("general.actions.close")} + width="90%" + title={t("printcenter.labels.title")} + destroyOnClose + > + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PrintCenterModalContainer); diff --git a/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx b/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx index e2f6eadac..e78596d59 100644 --- a/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx +++ b/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx @@ -1,87 +1,89 @@ -import { Button, List, PageHeader } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { GenerateDocuments } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {Button, List} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {GenerateDocuments} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, //currentUser: selectCurrentUser + bodyshop: selectBodyshop, //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function PrintCenterSpeedPrint({ bodyshop, jobId }) { - const [loading, setLoading] = useState(false); - const { speedprint } = bodyshop; - const { t } = useTranslation(); +export function PrintCenterSpeedPrint({bodyshop, jobId}) { + const [loading, setLoading] = useState(false); + const {speedprint} = bodyshop; + const {t} = useTranslation(); - const renderAllTemplates = async (templateKeys) => { - logImEXEvent("speed_print_render_all_templates"); - setLoading(true); - await GenerateDocuments( - templateKeys.map((key) => { - return { name: key, variables: { id: jobId } }; - }) - ); - setLoading(false); - }; + const renderAllTemplates = async (templateKeys) => { + logImEXEvent("speed_print_render_all_templates"); + setLoading(true); + await GenerateDocuments( + templateKeys.map((key) => { + return {name: key, variables: {id: jobId}}; + }) + ); + setLoading(false); + }; - return ( -
    - + return ( +
    + - ( - renderAllTemplates(sp.templates)} - > - Print All - , - ]} - > - ( + renderAllTemplates(sp.templates)} + > + Print All + , + ]} + > + + + )} /> - - )} - /> -
    - ); +
    + ); } const renderTemplateList = (templates) => { - const TemplateListGenerated = TemplateList(); - return ( - + const TemplateListGenerated = TemplateList(); + return ( + {templates.map((template, idx) => { - if (idx === templates.length - 1) - return ( - (TemplateListGenerated[template] && - TemplateListGenerated[template].title) || - "" - ); - return `${ - (TemplateListGenerated[template] && - TemplateListGenerated[template].title) || - "" - }, `; + if (idx === templates.length - 1) + return ( + (TemplateListGenerated[template] && + TemplateListGenerated[template].title) || + "" + ); + return `${ + (TemplateListGenerated[template] && + TemplateListGenerated[template].title) || + "" + }, `; })} - ); + ); }; export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(PrintCenterSpeedPrint); diff --git a/client/src/components/print-wrapper/print-wrapper.component.jsx b/client/src/components/print-wrapper/print-wrapper.component.jsx index 0b088adca..fe1edbd55 100644 --- a/client/src/components/print-wrapper/print-wrapper.component.jsx +++ b/client/src/components/print-wrapper/print-wrapper.component.jsx @@ -1,40 +1,40 @@ -import { MailFilled, PrinterFilled } from "@ant-design/icons"; -import { Space, Spin } from "antd"; -import React, { useState } from "react"; -import { GenerateDocument } from "../../utils/RenderTemplate"; +import {MailFilled, PrinterFilled} from "@ant-design/icons"; +import {Space, Spin} from "antd"; +import React, {useState} from "react"; +import {GenerateDocument} from "../../utils/RenderTemplate"; export default function PrintWrapperComponent({ - templateObject, - messageObject = {}, - children, - id, - emailOnly = false, - disabled, -}) { - const [loading, setLoading] = useState(false); - const handlePrint = async (type) => { - if (disabled) return; - setLoading(true); - await GenerateDocument(templateObject, messageObject, type, id); - setLoading(false); - }; + templateObject, + messageObject = {}, + children, + id, + emailOnly = false, + disabled, + }) { + const [loading, setLoading] = useState(false); + const handlePrint = async (type) => { + if (disabled) return; + setLoading(true); + await GenerateDocument(templateObject, messageObject, type, id); + setLoading(false); + }; - return ( - - {children || null} - {!emailOnly && ( - handlePrint("p")} - style={{ cursor: disabled ? "not-allowed" : null }} - /> - )} - handlePrint("e")} - style={{ cursor: disabled ? "not-allowed" : null }} - /> - {loading && } - - ); + return ( + + {children || null} + {!emailOnly && ( + handlePrint("p")} + style={{cursor: disabled ? "not-allowed" : null}} + /> + )} + handlePrint("e")} + style={{cursor: disabled ? "not-allowed" : null}} + /> + {loading && } + + ); } diff --git a/client/src/components/production-board-filters/production-board-filters.component.jsx b/client/src/components/production-board-filters/production-board-filters.component.jsx index 6fac184fc..c32034030 100644 --- a/client/src/components/production-board-filters/production-board-filters.component.jsx +++ b/client/src/components/production-board-filters/production-board-filters.component.jsx @@ -1,50 +1,51 @@ -import { Input, Space, Spin } from "antd"; +import {Input, Space, Spin} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionBoardFilters); export function ProductionBoardFilters({ - bodyshop, - filter, - setFilter, - loading, -}) { - const { t } = useTranslation(); + bodyshop, + filter, + setFilter, + loading, + }) { + const {t} = useTranslation(); - return ( + return ( - {loading && } - { - setFilter({ ...filter, search: e.target.value }); - }} - /> - e.active)} - value={filter.employeeId} - placeholder={t("production.labels.employeesearch")} - onChange={(emp) => setFilter({ ...filter, employeeId: emp })} - allowClear - /> + {loading && } + { + setFilter({...filter, search: e.target.value}); + }} + /> + e.active)} + value={filter.employeeId} + placeholder={t("production.labels.employeesearch")} + onChange={(emp) => setFilter({...filter, employeeId: emp})} + allowClear + /> - ); + ); } diff --git a/client/src/components/production-board-kanban-card/production-board-card.styles.scss b/client/src/components/production-board-kanban-card/production-board-card.styles.scss index 4b70517a4..ce7f5fe49 100644 --- a/client/src/components/production-board-kanban-card/production-board-card.styles.scss +++ b/client/src/components/production-board-kanban-card/production-board-card.styles.scss @@ -1,8 +1,10 @@ .imex-kanban-card { padding: 0px !important; + .ant-card-body { padding: 0.8rem; } + .ant-card-head { padding: 0rem 0.8rem; } diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx index d7b763939..28cea894d 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx @@ -1,51 +1,51 @@ -import { Col, List, Space, Typography } from "antd"; +import {Col, List, Space, Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; -const CardColorLegend = ({ bodyshop }) => { - const { t } = useTranslation(); - const data = bodyshop.ssbuckets.map((bucket) => { - let color = { r: 255, g: 255, b: 255 }; +const CardColorLegend = ({bodyshop}) => { + const {t} = useTranslation(); + const data = bodyshop.ssbuckets.map((bucket) => { + let color = {r: 255, g: 255, b: 255}; - if (bucket.color) { - color = bucket.color; + if (bucket.color) { + color = bucket.color; - if (bucket.color.rgb) { - color = bucket.color.rgb; - } - } + if (bucket.color.rgb) { + color = bucket.color.rgb; + } + } - return { - label: bucket.label, - color, - }; - }); + return { + label: bucket.label, + color, + }; + }); - return ( - - {t("production.labels.legend")} - ( - - -
    + {t("production.labels.legend")} +
    -
    {item.label}
    -
    -
    - )} - /> - - ); + dataSource={data} + renderItem={(item) => ( + + +
    +
    {item.label}
    +
    +
    + )} + /> + + ); }; export default CardColorLegend; diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx index dca5d3a70..b3cb2ff54 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -1,196 +1,191 @@ -import { - CalendarOutlined, - EyeFilled, - DownloadOutlined, - PauseCircleOutlined, - BranchesOutlined, -} from "@ant-design/icons"; -import { Card, Col, Row, Space, Tooltip } from "antd"; +import {BranchesOutlined, CalendarOutlined, DownloadOutlined, EyeFilled, PauseCircleOutlined,} from "@ant-design/icons"; +import {Card, Col, Row, Space, Tooltip} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; 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"; import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component"; import "./production-board-card.styles.scss"; -import moment from "moment"; +import dayjs from "../../utils/day"; 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 bucket = ssbuckets.filter( - (bucket) => - bucket.gte <= totalHrs && (!!bucket.lt ? bucket.lt > totalHrs : true) - )[0]; + const bucket = ssbuckets.filter( + (bucket) => + bucket.gte <= totalHrs && (!!bucket.lt ? bucket.lt > totalHrs : true) + )[0]; - let color = { r: 255, g: 255, b: 255 }; + let color = {r: 255, g: 255, b: 255}; - if (bucket && bucket.color) { - color = bucket.color; + if (bucket && bucket.color) { + color = bucket.color; - if (bucket.color.rgb) { - color = bucket.color.rgb; + if (bucket.color.rgb) { + color = bucket.color.rgb; + } } - } - return color; + return color; }; function getContrastYIQ(bgColor) { - const yiq = (bgColor.r * 299 + bgColor.g * 587 + bgColor.b * 114) / 1000; + const yiq = (bgColor.r * 299 + bgColor.g * 587 + bgColor.b * 114) / 1000; - return yiq >= 128 ? "black" : "white"; + return yiq >= 128 ? "black" : "white"; } export default function ProductionBoardCard( - technician, - card, - bodyshop, - cardSettings + technician, + card, + bodyshop, + cardSettings ) { - const { t } = useTranslation(); + const {t} = useTranslation(); - let employee_body, employee_prep, employee_refinish, employee_csr; - if (card.employee_body) { - employee_body = bodyshop.employees.find((e) => e.id === card.employee_body); - } - if (card.employee_prep) { - employee_prep = bodyshop.employees.find((e) => e.id === card.employee_prep); - } - if (card.employee_refinish) { - employee_refinish = bodyshop.employees.find( - (e) => e.id === card.employee_refinish - ); - } - if (card.employee_csr) { - employee_csr = bodyshop.employees.find((e) => e.id === card.employee_csr); - } - // if (card.employee_csr) { - // employee_csr = bodyshop.employees.find((e) => e.id === card.employee_csr); - // } + let employee_body, employee_prep, employee_refinish, employee_csr; + if (card.employee_body) { + employee_body = bodyshop.employees.find((e) => e.id === card.employee_body); + } + if (card.employee_prep) { + employee_prep = bodyshop.employees.find((e) => e.id === card.employee_prep); + } + if (card.employee_refinish) { + employee_refinish = bodyshop.employees.find( + (e) => e.id === card.employee_refinish + ); + } + if (card.employee_csr) { + employee_csr = bodyshop.employees.find((e) => e.id === card.employee_csr); + } + // if (card.employee_csr) { + // employee_csr = bodyshop.employees.find((e) => e.id === card.employee_csr); + // } - const pastDueAlert = - !!card.scheduled_completion && - ((moment().isSameOrAfter(moment(card.scheduled_completion), "day") && - "production-completion-past") || - (moment() - .add(1, "day") - .isSame(moment(card.scheduled_completion), "day") && - "production-completion-soon")); + const pastDueAlert = + !!card.scheduled_completion && + ((dayjs().isSameOrAfter(dayjs(card.scheduled_completion), "day") && + "production-completion-past") || + (dayjs() + .add(1, "day") + .isSame(dayjs(card.scheduled_completion), "day") && + "production-completion-soon")); - const totalHrs = - card.labhrs.aggregate.sum.mod_lb_hrs + card.larhrs.aggregate.sum.mod_lb_hrs; - const bgColor = cardColor(bodyshop.ssbuckets, totalHrs); + const totalHrs = + card.labhrs.aggregate.sum.mod_lb_hrs + card.larhrs.aggregate.sum.mod_lb_hrs; + const bgColor = cardColor(bodyshop.ssbuckets, totalHrs); - return ( - - - {card.suspended && ( - - )} - {card.iouparent && ( - - - - )} - + return ( + + + {card.suspended && ( + + )} + {card.iouparent && ( + + + + )} + {card.ro_number || t("general.labels.na")} - - } - extra={ - - - - } - > - - {cardSettings && cardSettings.ownr_nm && ( -
    - {cardSettings && cardSettings.compact ? ( -
    {`${card.ownr_ln || ""} ${ - card.ownr_co_nm || "" - }`}
    - ) : ( -
    - -
    - )} - - )} - -
    {`${card.v_model_yr || ""} ${ - card.v_make_desc || "" - } ${card.v_model_desc || ""}`}
    - - {cardSettings && cardSettings.ins_co_nm && card.ins_co_nm && ( - -
    {card.ins_co_nm || ""}
    - - )} - {cardSettings && cardSettings.clm_no && card.clm_no && ( - -
    {card.clm_no || ""}
    - - )} - - {cardSettings && cardSettings.employeeassignments && ( - + + } + extra={ + + + + } + > - {`B: ${ - employee_body - ? `${employee_body.first_name.substr( - 0, - 3 - )} ${employee_body.last_name.charAt(0)}` - : "" - } ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}h`} - {`P: ${ - employee_prep - ? `${employee_prep.first_name.substr( - 0, - 3 - )} ${employee_prep.last_name.charAt(0)}` - : "" - }`} - {`R: ${ - employee_refinish - ? `${employee_refinish.first_name.substr( - 0, - 3 - )} ${employee_refinish.last_name.charAt(0)}` - : "" - } ${card.larhrs.aggregate.sum.mod_lb_hrs || "?"}h`} - {`C: ${ - employee_csr - ? `${employee_csr.first_name} ${employee_csr.last_name}` - : "" - }`} - - - )} - {/* {cardSettings && cardSettings.laborhrs && ( + {cardSettings && cardSettings.ownr_nm && ( + + {cardSettings && cardSettings.compact ? ( +
    {`${card.ownr_ln || ""} ${ + card.ownr_co_nm || "" + }`}
    + ) : ( +
    + +
    + )} + + )} + +
    {`${card.v_model_yr || ""} ${ + card.v_make_desc || "" + } ${card.v_model_desc || ""}`}
    + + {cardSettings && cardSettings.ins_co_nm && card.ins_co_nm && ( + +
    {card.ins_co_nm || ""}
    + + )} + {cardSettings && cardSettings.clm_no && card.clm_no && ( + +
    {card.clm_no || ""}
    + + )} + + {cardSettings && cardSettings.employeeassignments && ( + + + {`B: ${ + employee_body + ? `${employee_body.first_name.substr( + 0, + 3 + )} ${employee_body.last_name.charAt(0)}` + : "" + } ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}h`} + {`P: ${ + employee_prep + ? `${employee_prep.first_name.substr( + 0, + 3 + )} ${employee_prep.last_name.charAt(0)}` + : "" + }`} + {`R: ${ + employee_refinish + ? `${employee_refinish.first_name.substr( + 0, + 3 + )} ${employee_refinish.last_name.charAt(0)}` + : "" + } ${card.larhrs.aggregate.sum.mod_lb_hrs || "?"}h`} + {`C: ${ + employee_csr + ? `${employee_csr.first_name} ${employee_csr.last_name}` + : "" + }`} + + + )} + {/* {cardSettings && cardSettings.laborhrs && ( {`B: ${ @@ -202,53 +197,53 @@ export default function ProductionBoardCard( )} */} - {cardSettings && cardSettings.actual_in && card.actual_in && ( - - - - - {card.actual_in} - - - - )} - {cardSettings && - cardSettings.scheduled_completion && - card.scheduled_completion && ( - - - - - {card.scheduled_completion} - - - - )} - {cardSettings && cardSettings.ats && card.alt_transport && ( - -
    {card.alt_transport || ""}
    - - )} - {cardSettings && cardSettings.sublets && ( - - - - )} - {cardSettings && cardSettings.production_note && ( - - {cardSettings && cardSettings.production_note && ( - - )} - - )} - {cardSettings && cardSettings.partsstatus && ( - - - - )} - - - ); + {cardSettings && cardSettings.actual_in && card.actual_in && ( + + + + + {card.actual_in} + + + + )} + {cardSettings && + cardSettings.scheduled_completion && + card.scheduled_completion && ( + + + + + {card.scheduled_completion} + + + + )} + {cardSettings && cardSettings.ats && card.alt_transport && ( + +
    {card.alt_transport || ""}
    + + )} + {cardSettings && cardSettings.sublets && ( + + + + )} + {cardSettings && cardSettings.production_note && ( + + {cardSettings && cardSettings.production_note && ( + + )} + + )} + {cardSettings && cardSettings.partsstatus && ( + + + + )} + + + ); } diff --git a/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx index 6a58af07b..b7a09cdaa 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx @@ -1,182 +1,173 @@ -import { useMutation } from "@apollo/client"; -import { - Button, - Card, - Col, - Form, - notification, - Popover, - Row, - Switch, -} from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_KANBAN_SETTINGS } from "../../graphql/user.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Col, Form, notification, Popover, Row, Switch,} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_KANBAN_SETTINGS} from "../../graphql/user.queries"; export default function ProductionBoardKanbanCardSettings({ - associationSettings, -}) { - const [form] = Form.useForm(); - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const [updateKbSettings] = useMutation(UPDATE_KANBAN_SETTINGS); + associationSettings, + }) { + const [form] = Form.useForm(); + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); + const [updateKbSettings] = useMutation(UPDATE_KANBAN_SETTINGS); - useEffect(() => { - form.setFieldsValue( - associationSettings && associationSettings.kanban_settings - ); - }, [form, associationSettings, visible]); + useEffect(() => { + form.setFieldsValue( + associationSettings && associationSettings.kanban_settings + ); + }, [form, associationSettings, open]); - const { t } = useTranslation(); + const {t} = useTranslation(); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateKbSettings({ - variables: { - id: associationSettings && associationSettings.id, - ks: values, - }, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("production.errors.settings", { - error: JSON.stringify(result.errors), - }), - }); - } - setVisible(false); - setLoading(false); - }; + const handleFinish = async (values) => { + setLoading(true); + const result = await updateKbSettings({ + variables: { + id: associationSettings && associationSettings.id, + ks: values, + }, + }); + if (result.errors) { + notification.open({ + type: "error", + message: t("production.errors.settings", { + error: JSON.stringify(result.errors), + }), + }); + } + setOpen(false); + setLoading(false); + }; - const overlay = ( -
    - -
    - -
    - - - - - - - - - - - - - {/* + + + + + + + + + + + + + + + + + {/* */} - - - - - - - - - - - - - - - - - - - - - {/* + + + + + + + + + + + + + + + + + + + + {/* */} - - - - - - - - - - - - - - - - ); - return ( - - - - ); + + + + + + + + + + + + + + + + ); + return ( + + + + ); } diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index b1061f973..1a232bd40 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -1,18 +1,19 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { useApolloClient } from "@apollo/client"; -import Board, { moveCard } from "@asseinfo/react-kanban"; -import { Button, Grid, notification, PageHeader, Space, Statistic } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Sticky, StickyContainer } from "react-sticky"; -import { createStructuredSelector } from "reselect"; +import {SyncOutlined} from "@ant-design/icons"; +import {useApolloClient} from "@apollo/client"; +import Board, {moveCard} from "@asseinfo/react-kanban"; +import {Button, Grid, notification, Space, Statistic} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Sticky, StickyContainer} from "react-sticky"; +import {createStructuredSelector} from "reselect"; import styled from "styled-components"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { generate_UPDATE_JOB_KANBAN } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {generate_UPDATE_JOB_KANBAN} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import IndefiniteLoading from "../indefinite-loading/indefinite-loading.component"; import ProductionBoardFilters from "../production-board-filters/production-board-filters.component"; @@ -22,294 +23,296 @@ import ProductionBoardKanbanCardSettings from "./production-board-kanban.card-se //import "@asseinfo/react-kanban/dist/styles.css"; import CardColorLegend from "../production-board-kanban-card/production-board-kanban-card-color-legend.component"; import "./production-board-kanban.styles.scss"; -import { createBoardData } from "./production-board-kanban.utils.js"; +import {createBoardData} from "./production-board-kanban.utils.js"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function ProductionBoardKanbanComponent({ - data, - bodyshop, - refetch, - technician, - insertAuditTrail, - associationSettings, -}) { - const [boardLanes, setBoardLanes] = useState({ - columns: [{ id: "Loading...", title: "Loading...", cards: [] }], - }); - - const [filter, setFilter] = useState({ search: "", employeeId: null }); - - const [isMoving, setIsMoving] = useState(false); - - const { t } = useTranslation(); - useEffect(() => { - const boardData = createBoardData( - [ - ...bodyshop.md_ro_statuses.production_statuses, - ...(bodyshop.md_ro_statuses.additional_board_statuses || []), - ], - data, - filter - ); - - boardData.columns = boardData.columns.map((d) => { - return { ...d, title: `${d.title} (${d.cards.length})` }; - }); - setBoardLanes(boardData); - setIsMoving(false); - }, [data, setBoardLanes, setIsMoving, bodyshop.md_ro_statuses, filter]); - - const client = useApolloClient(); - - const handleDragEnd = async (card, source, destination) => { - logImEXEvent("kanban_drag_end"); - - setIsMoving(true); - setBoardLanes(moveCard(boardLanes, source, destination)); - const sameColumnTransfer = source.fromColumnId === destination.toColumnId; - const sourceColumn = boardLanes.columns.find( - (x) => x.id === source.fromColumnId - ); - const destinationColumn = boardLanes.columns.find( - (x) => x.id === destination.toColumnId - ); - - const movedCardWillBeFirst = destination.toPosition === 0; - - const movedCardWillBeLast = - destinationColumn.cards.length - destination.toPosition < 1; - - const lastCardInDestinationColumn = - destinationColumn.cards[destinationColumn.cards.length - 1]; - - const oldChildCard = sourceColumn.cards[source.fromPosition + 1]; - - const newChildCard = movedCardWillBeLast - ? null - : destinationColumn.cards[ - sameColumnTransfer - ? source.fromPosition - destination.toPosition > 0 - ? destination.toPosition - : destination.toPosition + 1 - : destination.toPosition - ]; - - const oldChildCardNewParent = oldChildCard ? card.kanbanparent : null; - - let movedCardNewKanbanParent; - if (movedCardWillBeFirst) { - //console.log("==> New Card is first."); - movedCardNewKanbanParent = "-1"; - } else if (movedCardWillBeLast) { - // console.log("==> New Card is last."); - movedCardNewKanbanParent = lastCardInDestinationColumn.id; - } else if (!!newChildCard) { - // console.log("==> New Card is somewhere in the middle"); - movedCardNewKanbanParent = newChildCard.kanbanparent; - } else { - throw new Error("==> !!!!!!Couldn't find a parent.!!!! <=="); - } - const newChildCardNewParent = newChildCard ? card.id : null; - const update = await client.mutate({ - mutation: generate_UPDATE_JOB_KANBAN( - oldChildCard ? oldChildCard.id : null, - oldChildCardNewParent, - card.id, - movedCardNewKanbanParent, - destination.toColumnId, - newChildCard ? newChildCard.id : null, - newChildCardNewParent - ), - // TODO: optimisticResponse - }); - insertAuditTrail({ - jobid: card.id, - operation: AuditTrailMapping.jobstatuschange(destination.toColumnId), + data, + bodyshop, + refetch, + technician, + insertAuditTrail, + associationSettings, + }) { + const [boardLanes, setBoardLanes] = useState({ + columns: [{id: "Loading...", title: "Loading...", cards: []}], }); - if (update.errors) { - notification["error"]({ - message: t("production.errors.boardupdate", { - message: JSON.stringify(update.errors), - }), - }); - } - }; + const [filter, setFilter] = useState({search: "", employeeId: null}); - const totalHrs = data - .reduce( - (acc, val) => - acc + - (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0) + - (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), - 0 - ) - .toFixed(1); + const [isMoving, setIsMoving] = useState(false); + + const {t} = useTranslation(); + useEffect(() => { + const boardData = createBoardData( + [ + ...bodyshop.md_ro_statuses.production_statuses, + ...(bodyshop.md_ro_statuses.additional_board_statuses || []), + ], + data, + filter + ); + + boardData.columns = boardData.columns.map((d) => { + return {...d, title: `${d.title} (${d.cards.length})`}; + }); + setBoardLanes(boardData); + setIsMoving(false); + }, [data, setBoardLanes, setIsMoving, bodyshop.md_ro_statuses, filter]); + + const client = useApolloClient(); + + const handleDragEnd = async (card, source, destination) => { + logImEXEvent("kanban_drag_end"); + + setIsMoving(true); + setBoardLanes(moveCard(boardLanes, source, destination)); + const sameColumnTransfer = source.fromColumnId === destination.toColumnId; + const sourceColumn = boardLanes.columns.find( + (x) => x.id === source.fromColumnId + ); + const destinationColumn = boardLanes.columns.find( + (x) => x.id === destination.toColumnId + ); + + const movedCardWillBeFirst = destination.toPosition === 0; + + const movedCardWillBeLast = + destinationColumn.cards.length - destination.toPosition < 1; + + const lastCardInDestinationColumn = + destinationColumn.cards[destinationColumn.cards.length - 1]; + + const oldChildCard = sourceColumn.cards[source.fromPosition + 1]; + + const newChildCard = movedCardWillBeLast + ? null + : destinationColumn.cards[ + sameColumnTransfer + ? source.fromPosition - destination.toPosition > 0 + ? destination.toPosition + : destination.toPosition + 1 + : destination.toPosition + ]; + + const oldChildCardNewParent = oldChildCard ? card.kanbanparent : null; + + let movedCardNewKanbanParent; + if (movedCardWillBeFirst) { + //console.log("==> New Card is first."); + movedCardNewKanbanParent = "-1"; + } else if (movedCardWillBeLast) { + // console.log("==> New Card is last."); + movedCardNewKanbanParent = lastCardInDestinationColumn.id; + } else if (!!newChildCard) { + // console.log("==> New Card is somewhere in the middle"); + movedCardNewKanbanParent = newChildCard.kanbanparent; + } else { + throw new Error("==> !!!!!!Couldn't find a parent.!!!! <=="); + } + const newChildCardNewParent = newChildCard ? card.id : null; + const update = await client.mutate({ + mutation: generate_UPDATE_JOB_KANBAN( + oldChildCard ? oldChildCard.id : null, + oldChildCardNewParent, + card.id, + movedCardNewKanbanParent, + destination.toColumnId, + newChildCard ? newChildCard.id : null, + newChildCardNewParent + ), + // TODO: optimisticResponse + }); + insertAuditTrail({ + jobid: card.id, + operation: AuditTrailMapping.jobstatuschange(destination.toColumnId), + }); + + if (update.errors) { + notification["error"]({ + message: t("production.errors.boardupdate", { + message: JSON.stringify(update.errors), + }), + }); + } + }; + + const totalHrs = data + .reduce( + (acc, val) => + acc + + (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0) + + (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), + 0 + ) + .toFixed(1); const totalLAB = data - .reduce( - (acc, val) => acc + (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0), - 0 - ) - .toFixed(1); - const totalLAR = data - .reduce( - (acc, val) => acc + (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), - 0 - ) - .toFixed(1); - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; + .reduce( + (acc, val) => acc + (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0), + 0 + ) + .toFixed(1); + const totalLAR = data + .reduce( + (acc, val) => acc + (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), + 0 + ) + .toFixed(1); + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const standardSizes = { - xs: "250", - sm: "250", - md: "250", - lg: "250", - xl: "250", - xxl: "250", - }; - const compactSizes = { - xs: "150", - sm: "150", - md: "150", - lg: "150", - xl: "155", - xxl: "155", - }; + const standardSizes = { + xs: "250", + sm: "250", + md: "250", + lg: "250", + xl: "250", + xxl: "250", + }; + const compactSizes = { + xs: "150", + sm: "150", + md: "150", + lg: "150", + xl: "155", + xxl: "155", + }; - const width = selectedBreakpoint - ? associationSettings && - associationSettings.kanban_settings && - associationSettings.kanban_settings.compact - ? compactSizes[selectedBreakpoint[0]] - : standardSizes[selectedBreakpoint[0]] - : "250"; + const width = selectedBreakpoint + ? associationSettings && + associationSettings.kanban_settings && + associationSettings.kanban_settings.compact + ? compactSizes[selectedBreakpoint[0]] + : standardSizes[selectedBreakpoint[0]] + : "250"; - const stickyHeader = { - renderColumnHeader: ({ title }) => ( - - {({ - style, + const stickyHeader = { + renderColumnHeader: ({title}) => ( + + {({ + style, - // the following are also available but unused in this example - isSticky, - wasSticky, - distanceFromTop, - distanceFromBottom, - calculatedHeight, - }) => ( -
    - {title} -
    - )} -
    - ), - }; + // the following are also available but unused in this example + isSticky, + wasSticky, + distanceFromTop, + distanceFromBottom, + calculatedHeight, + }) => ( +
    + {title} +
    + )} +
    + ), + }; - const cardSettings = - associationSettings && - associationSettings.kanban_settings && - Object.keys(associationSettings.kanban_settings).length > 0 - ? associationSettings.kanban_settings - : { - ats: true, - clm_no: true, - compact: false, - ownr_nm: true, - sublets: true, - ins_co_nm: true, - production_note: true, - employeeassignments: true, - scheduled_completion: true, - stickyheader: false, - cardcolor: false, - }; + const cardSettings = + associationSettings && + associationSettings.kanban_settings && + Object.keys(associationSettings.kanban_settings).length > 0 + ? associationSettings.kanban_settings + : { + ats: true, + clm_no: true, + compact: false, + ownr_nm: true, + sublets: true, + ins_co_nm: true, + production_note: true, + employeeassignments: true, + scheduled_completion: true, + stickyheader: false, + cardcolor: false, + }; - return ( - - + return ( + + - - + + + + + + } + extra={ + + + + + + } /> - - - - - } - extra={ - - - - - - } - /> - {cardSettings.cardcolor && ( - - )} + {cardSettings.cardcolor && ( + + )} - - - - ProductionBoardCard(technician, card, bodyshop, cardSettings) - } - onCardDragEnd={handleDragEnd} - /> - - - ); + + + + ProductionBoardCard(technician, card, bodyshop, cardSettings) + } + onCardDragEnd={handleDragEnd} + /> + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionBoardKanbanComponent); const Container = styled.div` - .react-kanban-card-skeleton, - .react-kanban-card, - .react-kanban-card-adder-form { - box-sizing: border-box; - max-width: ${(props) => props.width}px; - min-width: ${(props) => props.width}px; - } + .react-kanban-card-skeleton, + .react-kanban-card, + .react-kanban-card-adder-form { + box-sizing: border-box; + max-width: ${(props) => props.width}px; + min-width: ${(props) => props.width}px; + } `; diff --git a/client/src/components/production-board-kanban/production-board-kanban.container.jsx b/client/src/components/production-board-kanban/production-board-kanban.container.jsx index 3a9f4f692..10ce9825b 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.container.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.container.jsx @@ -1,99 +1,98 @@ -import { useApolloClient, useQuery, useSubscription } from "@apollo/client"; +import {useApolloClient, useQuery, useSubscription} from "@apollo/client"; import _ from "lodash"; -import React, { useEffect, useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect, useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import { - QUERY_EXACT_JOBS_IN_PRODUCTION, - QUERY_EXACT_JOB_IN_PRODUCTION, - QUERY_JOBS_IN_PRODUCTION, - SUBSCRIPTION_JOBS_IN_PRODUCTION, + QUERY_EXACT_JOB_IN_PRODUCTION, + QUERY_EXACT_JOBS_IN_PRODUCTION, + QUERY_JOBS_IN_PRODUCTION, + SUBSCRIPTION_JOBS_IN_PRODUCTION, } from "../../graphql/jobs.queries"; -import { QUERY_KANBAN_SETTINGS } from "../../graphql/user.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {QUERY_KANBAN_SETTINGS} from "../../graphql/user.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import ProductionBoardKanbanComponent from "./production-board-kanban.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); -export function ProductionBoardKanbanContainer({ bodyshop, currentUser }) { - const { refetch, loading, data } = useQuery(QUERY_JOBS_IN_PRODUCTION, { - pollInterval: 3600000, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const client = useApolloClient(); - const [joblist, setJoblist] = useState([]); - const { data: updatedJobs } = useSubscription( - SUBSCRIPTION_JOBS_IN_PRODUCTION - ); - useEffect(() => { - if (!(data && data.jobs)) return; - setJoblist( - data.jobs.map((j) => { - return { id: j.id, updated_at: j.updated_at }; - }) - ); - }, [data]); - - useEffect(() => { - if (!updatedJobs || joblist.length === 0) return; - - const jobDiff = _.differenceWith( - joblist, - updatedJobs.jobs, - (a, b) => a.id === b.id && a.updated_at === b.updated_at +export function ProductionBoardKanbanContainer({bodyshop, currentUser}) { + const {refetch, loading, data} = useQuery(QUERY_JOBS_IN_PRODUCTION, { + pollInterval: 3600000, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const client = useApolloClient(); + const [joblist, setJoblist] = useState([]); + const {data: updatedJobs} = useSubscription( + SUBSCRIPTION_JOBS_IN_PRODUCTION ); - jobDiff.forEach((job) => { - getUpdatedJobData(job.id); - }); - if (jobDiff.length > 1) { - getUpdatedJobsData(jobDiff.map((j) => j.id)); - } else if (jobDiff.length === 1) { - jobDiff.forEach((job) => { - getUpdatedJobData(job.id); - }); - } + useEffect(() => { + if (!(data && data.jobs)) return; + setJoblist( + data.jobs.map((j) => { + return {id: j.id, updated_at: j.updated_at}; + }) + ); + }, [data]); - setJoblist(updatedJobs.jobs); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [updatedJobs]); + useEffect(() => { + if (!updatedJobs || joblist.length === 0) return; - const getUpdatedJobData = async (jobId) => { - client.query({ - query: QUERY_EXACT_JOB_IN_PRODUCTION, - variables: { id: jobId }, - }); - }; - const getUpdatedJobsData = async (jobIds) => { - client.query({ - query: QUERY_EXACT_JOBS_IN_PRODUCTION, - variables: { ids: jobIds }, - }); - }; + const jobDiff = _.differenceWith( + joblist, + updatedJobs.jobs, + (a, b) => a.id === b.id && a.updated_at === b.updated_at + ); - const { loading: associationSettingsLoading, data: associationSettings } = - useQuery(QUERY_KANBAN_SETTINGS, { - variables: { email: currentUser.email }, - }); + jobDiff.forEach((job) => { + getUpdatedJobData(job.id); + }); + if (jobDiff.length > 1) { + getUpdatedJobsData(jobDiff.map((j) => j.id)); + } else if (jobDiff.length === 1) { + jobDiff.forEach((job) => { + getUpdatedJobData(job.id); + }); + } - return ( - - ); + setJoblist(updatedJobs.jobs); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [updatedJobs]); + + const getUpdatedJobData = async (jobId) => { + client.query({ + query: QUERY_EXACT_JOB_IN_PRODUCTION, + variables: {id: jobId}, + }); + }; + const getUpdatedJobsData = async (jobIds) => { + client.query({ + query: QUERY_EXACT_JOBS_IN_PRODUCTION, + variables: {ids: jobIds}, + }); + }; + + const {loading: associationSettingsLoading, data: associationSettings} = + useQuery(QUERY_KANBAN_SETTINGS, { + variables: {email: currentUser.email}, + }); + + return ( + + ); } + export default connect(mapStateToProps, null)(ProductionBoardKanbanContainer); diff --git a/client/src/components/production-board-kanban/production-board-kanban.styles.scss b/client/src/components/production-board-kanban/production-board-kanban.styles.scss index b705994bf..efc678052 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.styles.scss +++ b/client/src/components/production-board-kanban/production-board-kanban.styles.scss @@ -1,12 +1,14 @@ .react-kanban-board { padding: 5px; } + .react-kanban-card { border-radius: 3px; background-color: #fff; padding: 4px; margin-bottom: 7px; } + // .react-kanban-card-skeleton, // .react-kanban-card, // .react-kanban-card-adder-form { @@ -18,9 +20,11 @@ .react-kanban-card--dragging { box-shadow: 2px 2px grey; } + .react-kanban-card__description { padding-top: 10px; } + .react-kanban-card__title { border-bottom: 1px solid #eee; padding-bottom: 5px; @@ -28,26 +32,31 @@ display: flex; justify-content: space-between; } + .react-kanban-column { padding: 10px; border-radius: 2px; background-color: #eee; margin: 5px; } + .react-kanban-column input:focus { outline: none; } + .react-kanban-card-adder-form { border-radius: 3px; background-color: #fff; padding: 10px; margin-bottom: 7px; } + .react-kanban-card-adder-form input { border: 0px; font-family: inherit; font-size: inherit; } + .react-kanban-card-adder-button { width: 100%; margin-top: 5px; @@ -60,9 +69,11 @@ margin-bottom: 10px; font-weight: bold; } + .react-kanban-card-adder-button:hover { background-color: #ccc; } + .react-kanban-card-adder-form__title { font-weight: bold; border-bottom: 1px solid #eee; @@ -73,16 +84,20 @@ width: 100%; padding: 0px; } + .react-kanban-card-adder-form__title:focus { outline: none; } + .react-kanban-card-adder-form__description { width: 100%; margin-top: 10px; } + .react-kanban-card-adder-form__description:focus { outline: none; } + .react-kanban-card-adder-form__button { background-color: #eee; border: none; @@ -91,33 +106,40 @@ margin-top: 5px; border-radius: 3px; } + .react-kanban-card-adder-form__button:hover { transition: 0.3s; cursor: pointer; background-color: #ccc; } + .react-kanban-column-header { padding-bottom: 10px; font-weight: bold; } + .react-kanban-column-header input:focus { outline: none; } + .react-kanban-column-header__button { color: #333333; background-color: #ffffff; border-color: #cccccc; } + .react-kanban-column-header__button:hover, .react-kanban-column-header__button:focus, .react-kanban-column-header__button:active { background-color: #e6e6e6; } + .react-kanban-column-adder-button { border: 2px dashed #eee; height: 132px; margin: 5px; } + .react-kanban-column-adder-button:hover { cursor: pointer; } diff --git a/client/src/components/production-board-kanban/production-board-kanban.utils.js b/client/src/components/production-board-kanban/production-board-kanban.utils.js index 4ed1a45d5..59cb6225d 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.utils.js +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -1,105 +1,105 @@ -import _ from "lodash/"; +import {groupBy} from "lodash"; const sortByParentId = (arr) => { - // return arr.reduce((accumulator, currentValue) => { - // //Find the parent item. - // let item = accumulator.find((x) => x.id === currentValue.kanbanparent); - // //Get index of praent item - // let index = accumulator.indexOf(item); + // return arr.reduce((accumulator, currentValue) => { + // //Find the parent item. + // let item = accumulator.find((x) => x.id === currentValue.kanbanparent); + // //Get index of parent item + // let index = accumulator.indexOf(item); - // index = index !== -1 ? index + 1 : 0; - // accumulator.splice(index, 0, currentValue); - // return accumulator; - // }, []); + // index = index !== -1 ? index + 1 : 0; + // accumulator.splice(index, 0, currentValue); + // return accumulator; + // }, []); - var parentId = "-1"; - var sortedList = []; - var byParentsIdsList = _.groupBy(arr, "kanbanparent"); // Create a new array with objects indexed by parentId - //console.log("sortByParentId -> byParentsIdsList", byParentsIdsList); + let parentId = "-1"; + const sortedList = []; + const byParentsIdsList = groupBy(arr, "kanbanparent"); // Create a new array with objects indexed by parentId + //console.log("sortByParentId -> byParentsIdsList", byParentsIdsList); - while (byParentsIdsList[parentId]) { - sortedList.push(byParentsIdsList[parentId][0]); - parentId = byParentsIdsList[parentId][0].id; - } + while (byParentsIdsList[parentId]) { + sortedList.push(byParentsIdsList[parentId][0]); + parentId = byParentsIdsList[parentId][0].id; + } - if (byParentsIdsList["null"]) - byParentsIdsList["null"].map((i) => sortedList.push(i)); + if (byParentsIdsList["null"]) + byParentsIdsList["null"].map((i) => sortedList.push(i)); - //Validate that the 2 arrays are of the same length and no children are missing. - if (arr.length !== sortedList.length) { - arr.map((origItem) => { - if (!!!sortedList.find((s) => s.id === origItem.id)) { - sortedList.push(origItem); - console.log("DATA CONSISTENCY ERROR: ", origItem.ro_number); - } - return 1; - }); - } + //Validate that the 2 arrays are of the same length and no children are missing. + if (arr.length !== sortedList.length) { + arr.map((origItem) => { + if (!!!sortedList.find((s) => s.id === origItem.id)) { + sortedList.push(origItem); + console.log("DATA CONSISTENCY ERROR: ", origItem.ro_number); + } + return 1; + }); + } - return sortedList; + return sortedList; }; export const createBoardData = (AllStatuses, Jobs, filter) => { - const { search, employeeId } = filter; - console.log("==========GENERATING BOARD DATA============="); - const boardLanes = { - columns: AllStatuses.map((s) => { - return { - id: s, - title: s, - cards: [], - }; - }), - }; + const {search, employeeId} = filter; + const boardLanes = { + columns: AllStatuses.map((s) => { + return { + id: s, + title: s, + cards: [], + }; + }), + }; - const filteredJobs = - (search === "" || !search) && !employeeId - ? Jobs - : Jobs.filter((j) => { - let include = false; - if (search && search !== "") { - include = CheckSearch(search, j); - } + const filteredJobs = + (search === "" || !search) && !employeeId + ? Jobs + : Jobs.filter((j) => { + let include = false; + if (search && search !== "") { + include = CheckSearch(search, j); + } - if (!!employeeId) { - include = - include || - j.employee_body === employeeId || - j.employee_prep === employeeId || - j.employee_csr === employeeId || - j.employee_refinish === employeeId; - } + if (!!employeeId) { + include = + include || + j.employee_body === employeeId || + j.employee_prep === employeeId || + j.employee_csr === employeeId || + j.employee_refinish === employeeId; + } - return include; - }); + return include; + }); - const DataGroupedByStatus = _.groupBy(filteredJobs, (d) => d.status); + const DataGroupedByStatus = groupBy(filteredJobs, (d) => d.status); - Object.keys(DataGroupedByStatus).map((statusGroupKey) => { - try { - boardLanes.columns.find((l) => l.id === statusGroupKey).cards = - sortByParentId(DataGroupedByStatus[statusGroupKey]); - } catch (error) { - console.log("Error while creating board card", error); - } - return null; - }); + Object.keys(DataGroupedByStatus).map((statusGroupKey) => { + try { + const needle = boardLanes.columns.find((l) => l.id === statusGroupKey); + if (!needle?.cards) return null; + needle.cards = sortByParentId(DataGroupedByStatus[statusGroupKey]); + } catch (error) { + console.log("Error while creating board card", error); + } + return null; + }); - return boardLanes; + return boardLanes; }; const CheckSearch = (search, job) => { - return ( - (job.ro_number || "").toLowerCase().includes(search.toLowerCase()) || - (job.ownr_fn || "").toLowerCase().includes(search.toLowerCase()) || - (job.ownr_co_nm || "").toLowerCase().includes(search.toLowerCase()) || - (job.ownr_ln || "").toLowerCase().includes(search.toLowerCase()) || - (job.status || "").toLowerCase().includes(search.toLowerCase()) || - (job.v_make_desc || "").toLowerCase().includes(search.toLowerCase()) || - (job.v_model_desc || "").toLowerCase().includes(search.toLowerCase()) || - (job.clm_no || "").toLowerCase().includes(search.toLowerCase()) || - (job.plate_no || "").toLowerCase().includes(search.toLowerCase()) - ); + return ( + (job.ro_number || "").toLowerCase().includes(search.toLowerCase()) || + (job.ownr_fn || "").toLowerCase().includes(search.toLowerCase()) || + (job.ownr_co_nm || "").toLowerCase().includes(search.toLowerCase()) || + (job.ownr_ln || "").toLowerCase().includes(search.toLowerCase()) || + (job.status || "").toLowerCase().includes(search.toLowerCase()) || + (job.v_make_desc || "").toLowerCase().includes(search.toLowerCase()) || + (job.v_model_desc || "").toLowerCase().includes(search.toLowerCase()) || + (job.clm_no || "").toLowerCase().includes(search.toLowerCase()) || + (job.plate_no || "").toLowerCase().includes(search.toLowerCase()) + ); }; // export const updateBoardOnMove = (board, card, source, destination) => { diff --git a/client/src/components/production-list-columns/production-list-columns.add.component.jsx b/client/src/components/production-list-columns/production-list-columns.add.component.jsx index c79e9db7f..c6336f6f5 100644 --- a/client/src/components/production-list-columns/production-list-columns.add.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.add.component.jsx @@ -1,78 +1,78 @@ -import { Button, Dropdown, Menu } from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {Button, Dropdown} from "antd"; import dataSource from "./production-list-columns.data"; +import {useTranslation} from "react-i18next"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - technician: selectTechnician, - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + technician: selectTechnician, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionColumnsComponent); export function ProductionColumnsComponent({ - columnState, - technician, - bodyshop, - data, - tableState, -}) { - const [columns, setColumns] = columnState; - const { t } = useTranslation(); + columnState, + technician, + bodyshop, + data, + tableState, + }) { + const [columns, setColumns] = columnState; + const {t} = useTranslation(); - const handleAdd = (e) => { - setColumns([ - ...columns, - ...dataSource({ - bodyshop, + const handleAdd = (e) => { + setColumns([ + ...columns, + ...dataSource({ + bodyshop, + technician, + state: tableState, + data, + activeStatuses: bodyshop.md_ro_statuses.active_statuses, + }).filter((i) => i.key === e.key), + ]); + }; + + const columnKeys = columns.map((i) => i.key); + const cols = dataSource({ technician, + data, state: tableState, - data: data, activeStatuses: bodyshop.md_ro_statuses.active_statuses, - }).filter((i) => i.key === e.key), - ]); - }; + }); - const columnKeys = columns.map((i) => i.key); - const cols = dataSource({ - technician, - state: tableState, - activeStatuses: bodyshop.md_ro_statuses.active_statuses, - data: data, - }); - const menu = ( - - {cols - .filter((i) => !columnKeys.includes(i.key)) - .map((item) => ( - - {item.title} - - ))} - - ); - return ( -
    - - - -
    - ); + const menu = { + items: cols + .filter((i) => !columnKeys.includes(i.key)) + .map((item) => ({ + key: item.key, + label: item.title, + style: {breakInside: "avoid"}, + })), + style: { + columnCount: Math.max(Math.floor(cols.length / 10), 1), + }, + onClick: handleAdd, + }; + + return ( +
    + + + +
    + ); } // ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); -export function ProductionListColumnAlert({ record, insertAuditTrail }) { - const { t } = useTranslation(); +export function ProductionListColumnAlert({record, insertAuditTrail}) { + const {t} = useTranslation(); - const [updateAlert] = useMutation(UPDATE_JOB); + const [updateAlert] = useMutation(UPDATE_JOB); - const handleAlertToggle = (e) => { - logImEXEvent("production_toggle_alert"); - //e.stopPropagation(); - updateAlert({ - variables: { - jobId: record.id, - job: { - production_vars: { - ...record.production_vars, - alert: - !!record.production_vars && !!record.production_vars.alert - ? !record.production_vars.alert - : true, - }, - }, - }, - }); - insertAuditTrail({ - jobid: record.id, - operation: AuditTrailMapping.alertToggle( - !!record.production_vars && !!record.production_vars.alert - ? !record.production_vars.alert - : true - ), - }).then(() => { - if (record.refetch) record.refetch(); - }); - }; + const handleAlertToggle = (e) => { + logImEXEvent("production_toggle_alert"); + //e.stopPropagation(); + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + alert: + !!record.production_vars && !!record.production_vars.alert + ? !record.production_vars.alert + : true, + }, + }, + }, + }); + insertAuditTrail({ + jobid: record.id, + operation: AuditTrailMapping.alertToggle( + !!record.production_vars && !!record.production_vars.alert + ? !record.production_vars.alert + : true + ), + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; - return ( - - - {record.production_vars && record.production_vars.alert - ? t("production.labels.alertoff") - : t("production.labels.alerton")} - - - } - trigger={["contextMenu"]} - > -
    - {record.production_vars && record.production_vars.alert ? ( - - ) : null} -
    -
    - ); + const menu = { + items: [ + { + key: "toggleAlert", + label: record.production_vars && record.production_vars.alert + ? t("production.labels.alertoff") + : t("production.labels.alerton"), + onClick: handleAlertToggle, + }, + ] + }; + + return ( + +
    + {record.production_vars && record.production_vars.alert ? ( + + ) : null} +
    +
    + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListColumnAlert); diff --git a/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx b/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx index 4b5a34c70..dcebf1001 100644 --- a/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx @@ -1,60 +1,61 @@ -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu } from "antd"; +import {useMutation} from "@apollo/client"; +import {Dropdown} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -export default function ProductionListColumnBodyPriority({ record }) { - const { t } = useTranslation(); +export default function ProductionListColumnBodyPriority({record}) { + const {t} = useTranslation(); - const [updateAlert] = useMutation(UPDATE_JOB); + const [updateAlert] = useMutation(UPDATE_JOB); - const handleSetBodyPriority = (e) => { - logImEXEvent("production_set_body_priority"); - // e.stopPropagation(); - const { key } = e; - updateAlert({ - variables: { - jobId: record.id, - job: { - production_vars: { - ...record.production_vars, - bodypriority: key === "clearBodyPriority" ? null : key, - }, - }, - }, - }).then(() => { - if (record.refetch) record.refetch(); - }); - }; + const handleSetBodyPriority = (e) => { + logImEXEvent("production_set_body_priority"); + // e.stopPropagation(); + const {key} = e; + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + bodypriority: key === "clearBodyPriority" ? null : key, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; - return ( - - - {t("production.actions.bodypriority-clear")} - - - {new Array(15).fill().map((value, index) => ( - -
    - {index + 1} -
    -
    - ))} -
    - - } - trigger={["click"]} - > -
    - {record.production_vars && record.production_vars.bodypriority} -
    -
    - ); + const menu = { + items: [ + { + key: "clearBodyPriority", + label: t("production.actions.bodypriority-clear"), + }, + { + key: "set", + label: t("production.actions.bodypriority-set"), + children: new Array(15).fill().map((value, index) => ({ + key: index + 1, + label: ( +
    + {index + 1} +
    + ), + })), + }, + ], + onClick: handleSetBodyPriority + }; + + return ( + +
    + {record.production_vars && record.production_vars.bodypriority} +
    +
    + ); } diff --git a/client/src/components/production-list-columns/production-list-columns.comment.component.jsx b/client/src/components/production-list-columns/production-list-columns.comment.component.jsx index d66f72c75..c86f4735c 100644 --- a/client/src/components/production-list-columns/production-list-columns.comment.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.comment.component.jsx @@ -1,80 +1,81 @@ import Icon from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, Input, Popover, Tooltip } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { FaRegStickyNote } from "react-icons/fa"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -export default function ProductionListColumnComment({ record }) { - const { t } = useTranslation(); +import {useMutation} from "@apollo/client"; +import {Button, Input, Popover, Tooltip} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {FaRegStickyNote} from "react-icons/fa"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; - const [note, setNote] = useState(record.comment || ""); +export default function ProductionListColumnComment({record}) { + const {t} = useTranslation(); - const [visible, setVisible] = useState(false); + const [note, setNote] = useState(record.comment || ""); - const [updateAlert] = useMutation(UPDATE_JOB); + const [open, setOpen] = useState(false); - const handleSaveNote = (e) => { - e.stopPropagation(); - setVisible(false); - updateAlert({ - variables: { - jobId: record.id, - job: { - comment: note, - }, - }, - }).then(() => { - if (record.refetch) record.refetch(); - }); - }; + const [updateAlert] = useMutation(UPDATE_JOB); - const handleChange = (e) => { - e.stopPropagation(); - setNote(e.target.value); - }; + const handleSaveNote = (e) => { + e.stopPropagation(); + setOpen(false); + updateAlert({ + variables: { + jobId: record.id, + job: { + comment: note, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; - const handleVisibleChange = (flag) => { - setVisible(flag); - if (flag) setNote(record.comment || ""); - }; + const handleChange = (e) => { + e.stopPropagation(); + setNote(e.target.value); + }; - return ( - - -
    - -
    - - } - trigger={["click"]} - > -
    - - {record.comment || " "} -
    -
    - ); + const handleOpenChange = (flag) => { + setOpen(flag); + if (flag) setNote(record.comment || ""); + }; + + return ( + + +
    + +
    + + } + trigger={["click"]} + > +
    + + {record.comment || " "} +
    +
    + ); } diff --git a/client/src/components/production-list-columns/production-list-columns.data.js b/client/src/components/production-list-columns/production-list-columns.data.js index 8b38e5287..590d3b112 100644 --- a/client/src/components/production-list-columns/production-list-columns.data.js +++ b/client/src/components/production-list-columns/production-list-columns.data.js @@ -1,13 +1,13 @@ -import { BranchesOutlined, PauseCircleOutlined } from "@ant-design/icons"; -import { Space, Tooltip } from "antd"; +import {BranchesOutlined, PauseCircleOutlined} from "@ant-design/icons"; +import {Space, Tooltip} from "antd"; import i18n from "i18next"; -import moment from "moment"; -import { Link } from "react-router-dom"; +import dayjs from "../../utils/day"; +import {Link} from "react-router-dom"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { TimeFormatter } from "../../utils/DateFormatter"; +import {TimeFormatter} from "../../utils/DateFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort, dateSort, statusSort } from "../../utils/sorters"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort, dateSort, statusSort} from "../../utils/sorters"; import JobAltTransportChange from "../job-at-change/job-at-change.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; @@ -25,618 +25,630 @@ import ProductionListColumnNote from "./production-list-columns.productionnote.c import ProductionListColumnCategory from "./production-list-columns.status.category"; import ProductionListColumnStatus from "./production-list-columns.status.component"; import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component"; -import { store } from "../../redux/store"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import {store} from "../../redux/store"; +import {setModalContext} from "../../redux/modals/modals.actions"; -const r = ({ technician, state, activeStatuses, data, bodyshop }) => { - return [ - { - title: i18n.t("jobs.actions.viewdetail"), - dataIndex: "viewdetail", - key: "viewdetail", - ellipsis: true, - render: (text, record) => ( - - {i18n.t("general.labels.view")} - - ), - }, - { - title: i18n.t("timetickets.actions.claimtasks"), - dataIndex: "claimtasks", - key: "claimtasks", - ellipsis: true, - render: (text, record) => ( -
    { - store.dispatch( - setModalContext({ - context: { - actions: {}, - context: { jobid: record.id }, - }, - modal: "timeTicketTask", - }) - ); - }} - > - {i18n.t("timetickets.actions.claimtasks")} -
    - ), - }, - { - title: i18n.t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - ellipsis: true, - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => - technician ? ( - - {record.ro_number} - {record.suspended && ( - - )} - - ) : ( - - - {record.ro_number} - {record.suspended && ( - - )} - {record.iouparent && ( - - - - )} - - - ), - }, - { - title: i18n.t("jobs.fields.owner"), - dataIndex: "ownr", - key: "ownr", - ellipsis: true, - render: (text, record) => , - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "ownr" && state.sortedInfo.order, - }, - { - title: i18n.t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - sorter: (a, b) => - alphaSort( - a.v_make_desc + a.v_model_desc, - b.v_make_desc + b.v_model_desc - ), - sortOrder: - state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, - render: (text, record) => ( - {`${ - record.v_model_yr || "" - } ${record.v_make_desc || ""} ${record.v_model_desc || ""} ${ - record.v_color || "" - } ${record.plate_no || ""}`} - ), - }, - { - title: i18n.t("jobs.fields.actual_in"), - dataIndex: "actual_in", - key: "actual_in", - ellipsis: true, - sorter: (a, b) => dateSort(a.actual_in, b.actual_in), - sortOrder: - state.sortedInfo.columnKey === "actual_in" && state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.actual_in") + " (HH:MM)", - dataIndex: "actual_in_time", - key: "actual_in_time", - ellipsis: true, +const r = ({technician, state, activeStatuses, data, bodyshop}) => { + return [ + { + title: i18n.t("jobs.actions.viewdetail"), + dataIndex: "viewdetail", + key: "viewdetail", + ellipsis: true, + render: (text, record) => ( + + {i18n.t("general.labels.view")} + + ), + }, + { + title: i18n.t("timetickets.actions.claimtasks"), + dataIndex: "claimtasks", + key: "claimtasks", + ellipsis: true, + render: (text, record) => ( +
    { + store.dispatch( + setModalContext({ + context: { + actions: {}, + context: {jobid: record.id}, + }, + modal: "timeTicketTask", + }) + ); + }} + > + {i18n.t("timetickets.actions.claimtasks")} +
    + ), + }, + { + title: i18n.t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => + technician ? ( + + {record.ro_number} + {record.suspended && ( + + )} + + ) : ( + + + {record.ro_number} + {record.suspended && ( + + )} + {record.iouparent && ( + + + + )} + + + ), + }, + { + title: i18n.t("jobs.fields.owner"), + dataIndex: "ownr", + key: "ownr", + ellipsis: true, + render: (text, record) => + technician ? ( + + ) : ( + + + + ), + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "ownr" && state.sortedInfo.order, + }, + { + title: i18n.t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + sorter: (a, b) => + alphaSort( + a.v_make_desc + a.v_model_desc, + b.v_make_desc + b.v_model_desc + ), + sortOrder: + state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, + render: (text, record) => + technician ? ( + <>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + } ${record.v_color || ""} ${record.plate_no || ""}`} + ) : ( + {`${ + record.v_model_yr || "" + } ${record.v_make_desc || ""} ${record.v_model_desc || ""} ${ + record.v_color || "" + } ${record.plate_no || ""}`} + ), + }, + { + title: i18n.t("jobs.fields.actual_in"), + dataIndex: "actual_in", + key: "actual_in", + ellipsis: true, + sorter: (a, b) => dateSort(a.actual_in, b.actual_in), + sortOrder: + state.sortedInfo.columnKey === "actual_in" && state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.actual_in") + " (HH:MM)", + dataIndex: "actual_in_time", + key: "actual_in_time", + ellipsis: true, - render: (text, record) => ( - {record.actual_in} - ), - }, - { - title: i18n.t("jobs.fields.scheduled_completion"), - dataIndex: "scheduled_completion", - key: "scheduled_completion", - ellipsis: true, - sorter: (a, b) => - dateSort(a.scheduled_completion, b.scheduled_completion), - sortOrder: - state.sortedInfo.columnKey === "scheduled_completion" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.scheduled_completion") + " (HH:MM)", - dataIndex: "scheduled_completion_time", - key: "scheduled_completion_time", - ellipsis: true, + render: (text, record) => ( + {record.actual_in} + ), + }, + { + title: i18n.t("jobs.fields.scheduled_completion"), + dataIndex: "scheduled_completion", + key: "scheduled_completion", + ellipsis: true, + sorter: (a, b) => + dateSort(a.scheduled_completion, b.scheduled_completion), + sortOrder: + state.sortedInfo.columnKey === "scheduled_completion" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.scheduled_completion") + " (HH:MM)", + dataIndex: "scheduled_completion_time", + key: "scheduled_completion_time", + ellipsis: true, - render: (text, record) => ( - {record.scheduled_completion} - ), - }, - { - title: i18n.t("jobs.fields.date_last_contacted"), - dataIndex: "date_last_contacted", - key: "date_last_contacted", - ellipsis: true, - sorter: (a, b) => dateSort(a.date_last_contacted, b.date_last_contacted), - sortOrder: - state.sortedInfo.columnKey === "date_last_contacted" && - state.sortedInfo.order, - render: (text, record) => , - }, - { - title: i18n.t("jobs.fields.date_next_contact"), - dataIndex: "date_next_contact", - key: "date_next_contact", - ellipsis: true, - sorter: (a, b) => dateSort(a.date_next_contact, b.date_next_contact), - sortOrder: - state.sortedInfo.columnKey === "date_next_contact" && - state.sortedInfo.order, - render: (text, record) => ( - - + render: (text, record) => ( + {record.scheduled_completion} + ), + }, + { + title: i18n.t("jobs.fields.date_last_contacted"), + dataIndex: "date_last_contacted", + key: "date_last_contacted", + ellipsis: true, + sorter: (a, b) => dateSort(a.date_last_contacted, b.date_last_contacted), + sortOrder: + state.sortedInfo.columnKey === "date_last_contacted" && + state.sortedInfo.order, + render: (text, record) => , + }, + { + title: i18n.t("jobs.fields.date_next_contact"), + dataIndex: "date_next_contact", + key: "date_next_contact", + ellipsis: true, + sorter: (a, b) => dateSort(a.date_next_contact, b.date_next_contact), + sortOrder: + state.sortedInfo.columnKey === "date_next_contact" && + state.sortedInfo.order, + render: (text, record) => ( + + - ), - }, - { - title: i18n.t("jobs.fields.scheduled_delivery"), - dataIndex: "scheduled_delivery", - key: "scheduled_delivery", - ellipsis: true, - sorter: (a, b) => dateSort(a.scheduled_delivery, b.scheduled_delivery), - sortOrder: - state.sortedInfo.columnKey === "scheduled_delivery" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.scheduled_delivery") + " (HH:MM)", - dataIndex: "scheduled_delivery_time", - key: "scheduled_delivery_time", - ellipsis: true, + ), + }, + { + title: i18n.t("jobs.fields.scheduled_delivery"), + dataIndex: "scheduled_delivery", + key: "scheduled_delivery", + ellipsis: true, + sorter: (a, b) => dateSort(a.scheduled_delivery, b.scheduled_delivery), + sortOrder: + state.sortedInfo.columnKey === "scheduled_delivery" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.scheduled_delivery") + " (HH:MM)", + dataIndex: "scheduled_delivery_time", + key: "scheduled_delivery_time", + ellipsis: true, - render: (text, record) => ( - {record.scheduled_delivery} - ), - }, - { - title: i18n.t("jobs.fields.ins_co_nm"), - dataIndex: "ins_co_nm", - key: "ins_co_nm", - ellipsis: true, - sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), - sortOrder: - state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, - }, - { - title: i18n.t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - }, - { - title: i18n.t("jobs.fields.clm_total"), - dataIndex: "clm_total", - key: "clm_total", - ellipsis: true, - sorter: (a, b) => a.clm_total - b.clm_total, - sortOrder: - state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, - render: (text, record) => ( - {record.clm_total} - ), - }, - { - title: i18n.t("jobs.fields.owner_owing"), - dataIndex: "owner_owing", - key: "owner_owing", - ellipsis: true, - sorter: (a, b) => a.owner_owing - b.owner_owing, - sortOrder: - state.sortedInfo.columnKey === "owner_owing" && state.sortedInfo.order, - render: (text, record) => ( - {record.owner_owing} - ), - }, - { - title: i18n.t("jobs.fields.ownr_ph1"), - dataIndex: "ownr_ph1", - key: "ownr_ph1", - ellipsis: true, - render: (text, record) => ( - {record.ownr_ph1} - ), - }, - { - title: i18n.t("jobs.fields.ownr_ph2"), - dataIndex: "ownr_ph2", - key: "ownr_ph2", - ellipsis: true, - render: (text, record) => ( - {record.ownr_ph2} - ), - }, - { - title: i18n.t("jobs.fields.specialcoveragepolicy"), - dataIndex: "special_coverage_policy", - key: "special_coverage_policy", - ellipsis: true, - }, + render: (text, record) => ( + {record.scheduled_delivery} + ), + }, + { + title: i18n.t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), + sortOrder: + state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, + }, + { + title: i18n.t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + }, + { + title: i18n.t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + ellipsis: true, + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, + render: (text, record) => ( + {record.clm_total} + ), + }, + { + title: i18n.t("jobs.fields.owner_owing"), + dataIndex: "owner_owing", + key: "owner_owing", + ellipsis: true, + sorter: (a, b) => a.owner_owing - b.owner_owing, + sortOrder: + state.sortedInfo.columnKey === "owner_owing" && state.sortedInfo.order, + render: (text, record) => ( + {record.owner_owing} + ), + }, + { + title: i18n.t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + render: (text, record) => ( + {record.ownr_ph1} + ), + }, + { + title: i18n.t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + ellipsis: true, + render: (text, record) => ( + {record.ownr_ph2} + ), + }, + { + title: i18n.t("jobs.fields.specialcoveragepolicy"), + dataIndex: "special_coverage_policy", + key: "special_coverage_policy", + ellipsis: true, + }, - { - title: i18n.t("jobs.fields.alt_transport"), - dataIndex: "alt_transport", - key: "alt_transport", - ellipsis: true, - sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport), - sortOrder: - state.sortedInfo.columnKey === "alt_transport" && - state.sortedInfo.order, - render: (text, record) => ( -
    - {record.alt_transport} - -
    - ), - }, - { - title: i18n.t("jobs.fields.status"), - dataIndex: "status", - key: "status", - ellipsis: true, - sorter: (a, b) => statusSort(a.status, b.status, activeStatuses), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => , - }, - { - title: i18n.t("jobs.fields.category"), - dataIndex: "category", - key: "category", - ellipsis: true, + { + title: i18n.t("jobs.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport), + sortOrder: + state.sortedInfo.columnKey === "alt_transport" && + state.sortedInfo.order, + render: (text, record) => ( +
    + {record.alt_transport} + +
    + ), + }, + { + title: i18n.t("jobs.fields.status"), + dataIndex: "status", + key: "status", + ellipsis: true, + sorter: (a, b) => statusSort(a.status, b.status, activeStatuses), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) => , + }, + { + title: i18n.t("jobs.fields.category"), + dataIndex: "category", + key: "category", + ellipsis: true, - filters: - (bodyshop && - bodyshop.md_categories.map((s) => { - return { - text: s, - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.category), - sorter: (a, b) => alphaSort(a.category, b.category), - sortOrder: - state.sortedInfo.columnKey === "category" && state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("production.labels.bodyhours"), - dataIndex: "labhrs", - key: "labhrs", - sorter: (a, b) => - a.labhrs.aggregate.sum.mod_lb_hrs - b.labhrs.aggregate.sum.mod_lb_hrs, - sortOrder: - state.sortedInfo.columnKey === "labhrs" && state.sortedInfo.order, - render: (text, record) => record.labhrs.aggregate.sum.mod_lb_hrs, - }, - { - title: i18n.t("production.labels.refinishhours"), - dataIndex: "larhrs", - key: "larhrs", - sorter: (a, b) => - a.larhrs.aggregate.sum.mod_lb_hrs - b.larhrs.aggregate.sum.mod_lb_hrs, - sortOrder: - state.sortedInfo.columnKey === "larhrs" && state.sortedInfo.order, - render: (text, record) => record.larhrs.aggregate.sum.mod_lb_hrs, - }, - { - title: i18n.t("production.labels.totalhours"), - dataIndex: "totalhours", - key: "totalhours", - sorter: (a, b) => - a.labhrs.aggregate.sum.mod_lb_hrs + - a.larhrs.aggregate.sum.mod_lb_hrs - - (b.labhrs.aggregate.sum.mod_lb_hrs + b.larhrs.aggregate.sum.mod_lb_hrs), - sortOrder: - state.sortedInfo.columnKey === "totalhours" && state.sortedInfo.order, - render: (text, record) => - ( - record.labhrs.aggregate.sum.mod_lb_hrs + - record.larhrs.aggregate.sum.mod_lb_hrs - ).toFixed(1), - }, - { - title: i18n.t("production.labels.alert"), - dataIndex: "alert", - key: "alert", + filters: + (bodyshop && + bodyshop.md_categories.map((s) => { + return { + text: s, + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.category), + sorter: (a, b) => alphaSort(a.category, b.category), + sortOrder: + state.sortedInfo.columnKey === "category" && state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("production.labels.bodyhours"), + dataIndex: "labhrs", + key: "labhrs", + sorter: (a, b) => + a.labhrs.aggregate.sum.mod_lb_hrs - b.labhrs.aggregate.sum.mod_lb_hrs, + sortOrder: + state.sortedInfo.columnKey === "labhrs" && state.sortedInfo.order, + render: (text, record) => record.labhrs.aggregate.sum.mod_lb_hrs, + }, + { + title: i18n.t("production.labels.refinishhours"), + dataIndex: "larhrs", + key: "larhrs", + sorter: (a, b) => + a.larhrs.aggregate.sum.mod_lb_hrs - b.larhrs.aggregate.sum.mod_lb_hrs, + sortOrder: + state.sortedInfo.columnKey === "larhrs" && state.sortedInfo.order, + render: (text, record) => record.larhrs.aggregate.sum.mod_lb_hrs, + }, + { + title: i18n.t("production.labels.totalhours"), + dataIndex: "totalhours", + key: "totalhours", + sorter: (a, b) => + a.labhrs.aggregate.sum.mod_lb_hrs + + a.larhrs.aggregate.sum.mod_lb_hrs - + (b.labhrs.aggregate.sum.mod_lb_hrs + b.larhrs.aggregate.sum.mod_lb_hrs), + sortOrder: + state.sortedInfo.columnKey === "totalhours" && state.sortedInfo.order, + render: (text, record) => + ( + record.labhrs.aggregate.sum.mod_lb_hrs + + record.larhrs.aggregate.sum.mod_lb_hrs + ).toFixed(1), + }, + { + title: i18n.t("production.labels.alert"), + dataIndex: "alert", + key: "alert", - render: (text, record) => , - }, - { - title: i18n.t("production.labels.note"), - dataIndex: "note", - key: "note", - ellipsis: true, - render: (text, record) => , - }, - { - title: i18n.t("production.labels.comment"), - dataIndex: "comment", - key: "comment", - ellipsis: true, - render: (text, record) => , - }, - { - title: i18n.t("production.labels.touchtime"), - dataIndex: "tt", - key: "tt", - render: (text, record) => { - return ; - }, - }, - { - title: i18n.t("production.labels.bodypriority"), - dataIndex: "bodypriority", - key: "bodypriority", + render: (text, record) => , + }, + { + title: i18n.t("production.labels.note"), + dataIndex: "note", + key: "note", + ellipsis: true, + render: (text, record) => , + }, + { + title: i18n.t("production.labels.comment"), + dataIndex: "comment", + key: "comment", + ellipsis: true, + render: (text, record) => , + }, + { + title: i18n.t("production.labels.touchtime"), + dataIndex: "tt", + key: "tt", + render: (text, record) => { + return ; + }, + }, + { + title: i18n.t("production.labels.bodypriority"), + dataIndex: "bodypriority", + key: "bodypriority", - sorter: (a, b) => - ((a.production_vars && a.production_vars.bodypriority) || 11) - - ((b.production_vars && b.production_vars.bodypriority) || 11), - sortOrder: - state.sortedInfo.columnKey === "bodypriority" && state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("production.labels.paintpriority"), - dataIndex: "paintpriority", - key: "paintpriority", + sorter: (a, b) => + ((a.production_vars && a.production_vars.bodypriority) || 11) - + ((b.production_vars && b.production_vars.bodypriority) || 11), + sortOrder: + state.sortedInfo.columnKey === "bodypriority" && state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("production.labels.paintpriority"), + dataIndex: "paintpriority", + key: "paintpriority", - sorter: (a, b) => - ((a.production_vars && a.production_vars.paintpriority) || 11) - - ((b.production_vars && b.production_vars.paintpriority) || 11), - sortOrder: - state.sortedInfo.columnKey === "paintpriority" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("production.labels.detailpriority"), - dataIndex: "detailpriority", - key: "detailpriority", + sorter: (a, b) => + ((a.production_vars && a.production_vars.paintpriority) || 11) - + ((b.production_vars && b.production_vars.paintpriority) || 11), + sortOrder: + state.sortedInfo.columnKey === "paintpriority" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("production.labels.detailpriority"), + dataIndex: "detailpriority", + key: "detailpriority", - sorter: (a, b) => - ((a.production_vars && a.production_vars.detailpriority) || 11) - - ((b.production_vars && b.production_vars.detailpriority) || 11), - sortOrder: - state.sortedInfo.columnKey === "detailpriority" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("production.labels.sublets"), - dataIndex: "sublets", - key: "sublets", - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.employee_body"), - dataIndex: "employee_body", - key: "employee_body", - sortOrder: - state.sortedInfo.columnKey === "employee_body" && - state.sortedInfo.order, - sorter: (a, b) => - alphaSort( - bodyshop.employees?.find((e) => e.id === a.employee_body)?.first_name, - bodyshop.employees?.find((e) => e.id === b.employee_body)?.first_name - ), - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.employee_prep"), - dataIndex: "employee_prep", - key: "employee_prep", - sortOrder: - state.sortedInfo.columnKey === "employee_prep" && - state.sortedInfo.order, - sorter: (a, b) => - alphaSort( - bodyshop.employees?.find((e) => e.id === a.employee_prep)?.first_name, - bodyshop.employees?.find((e) => e.id === b.employee_prep)?.first_name - ), - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.employee_csr"), - dataIndex: "employee_csr", - key: "employee_csr", - sortOrder: - state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order, - sorter: (a, b) => - alphaSort( - bodyshop.employees?.find((e) => e.id === a.employee_csr)?.first_name, - bodyshop.employees?.find((e) => e.id === b.employee_csr)?.first_name - ), - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.employee_refinish"), - dataIndex: "employee_refinish", - key: "employee_refinish", - sortOrder: - state.sortedInfo.columnKey === "employee_refinish" && - state.sortedInfo.order, - sorter: (a, b) => - alphaSort( - bodyshop.employees?.find((e) => e.id === a.employee_refinish) - ?.first_name, - bodyshop.employees?.find((e) => e.id === b.employee_refinish) - ?.first_name - ), - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.labels.parts_received"), - dataIndex: "parts_received", - key: "parts_received", - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.partsstatus"), - dataIndex: "partsstatus", - key: "partsstatus", - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.labels.estimator"), - dataIndex: "estimator", - key: "estimator", - sorter: (a, b) => - alphaSort( - `${a.est_ct_fn || ""} ${a.est_ct_ln || ""}`.trim(), - `${b.est_ct_fn || ""} ${b.est_ct_ln || ""}`.trim() - ), - sortOrder: - state.sortedInfo.columnKey === "estimator" && state.sortedInfo.order, - filters: - (data && - data - .map((j) => `${j.est_ct_fn || ""} ${j.est_ct_ln || ""}`.trim()) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "N/A", - value: [s], - }; - })) || - [], - onFilter: (value, record) => - value.includes( - `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim() - ), - render: (text, record) => - `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim(), - }, + sorter: (a, b) => + ((a.production_vars && a.production_vars.detailpriority) || 11) - + ((b.production_vars && b.production_vars.detailpriority) || 11), + sortOrder: + state.sortedInfo.columnKey === "detailpriority" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("production.labels.sublets"), + dataIndex: "sublets", + key: "sublets", + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.employee_body"), + dataIndex: "employee_body", + key: "employee_body", + sortOrder: + state.sortedInfo.columnKey === "employee_body" && + state.sortedInfo.order, + sorter: (a, b) => + alphaSort( + bodyshop.employees?.find((e) => e.id === a.employee_body)?.first_name, + bodyshop.employees?.find((e) => e.id === b.employee_body)?.first_name + ), + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.employee_prep"), + dataIndex: "employee_prep", + key: "employee_prep", + sortOrder: + state.sortedInfo.columnKey === "employee_prep" && + state.sortedInfo.order, + sorter: (a, b) => + alphaSort( + bodyshop.employees?.find((e) => e.id === a.employee_prep)?.first_name, + bodyshop.employees?.find((e) => e.id === b.employee_prep)?.first_name + ), + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.employee_csr"), + dataIndex: "employee_csr", + key: "employee_csr", + sortOrder: + state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order, + sorter: (a, b) => + alphaSort( + bodyshop.employees?.find((e) => e.id === a.employee_csr)?.first_name, + bodyshop.employees?.find((e) => e.id === b.employee_csr)?.first_name + ), + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.employee_refinish"), + dataIndex: "employee_refinish", + key: "employee_refinish", + sortOrder: + state.sortedInfo.columnKey === "employee_refinish" && + state.sortedInfo.order, + sorter: (a, b) => + alphaSort( + bodyshop.employees?.find((e) => e.id === a.employee_refinish) + ?.first_name, + bodyshop.employees?.find((e) => e.id === b.employee_refinish) + ?.first_name + ), + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.labels.parts_received"), + dataIndex: "parts_received", + key: "parts_received", + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.partsstatus"), + dataIndex: "partsstatus", + key: "partsstatus", + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.labels.estimator"), + dataIndex: "estimator", + key: "estimator", + sorter: (a, b) => + alphaSort( + `${a.est_ct_fn || ""} ${a.est_ct_ln || ""}`.trim(), + `${b.est_ct_fn || ""} ${b.est_ct_ln || ""}`.trim() + ), + sortOrder: + state.sortedInfo.columnKey === "estimator" && state.sortedInfo.order, + filters: + (data && + data + .map((j) => `${j.est_ct_fn || ""} ${j.est_ct_ln || ""}`.trim()) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "N/A", + value: [s], + }; + })) || + [], + onFilter: (value, record) => + value.includes( + `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim() + ), + render: (text, record) => + `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim(), + }, - //Added as a place holder for St Claude. Not implemented as it requires another join for a field used by only 1 client. - // { - // title: i18n.t("vehicles.fields.v_paint_codes", { number: "" }), - // dataIndex: "v_paint_codes", - // key: "v_paint_codes", - // render: (text, record) => - // record.vehicle?.v_paint_codes ? ( - // - // {Object.keys(record.vehicle.v_paint_codes) - // .filter( - // (key) => - // record.vehicle.v_paint_codes[key] !== "" && - // record.vehicle.v_paint_codes[key] !== null && - // record.vehicle.v_paint_codes[key] !== undefined - // ) - // .map((key, idx) => ( - // {record.vehicle.v_paint_codes[key]} - // ))} - // - // ) : null, - // }, - { - title: i18n.t("jobs.fields.date_repairstarted"), - dataIndex: "date_repairstarted", - key: "date_repairstarted", - ellipsis: true, - sorter: (a, b) => dateSort(a.date_repairstarted, b.date_repairstarted), - sortOrder: - state.sortedInfo.columnKey === "date_repairstarted" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: i18n.t("jobs.fields.date_repairstarted") + " (HH:MM)", - dataIndex: "date_repairstarted_time", - key: "date_repairstarted_time", - ellipsis: true, + //Added as a place holder for St Claude. Not implemented as it requires another join for a field used by only 1 client. + // { + // title: i18n.t("vehicles.fields.v_paint_codes", { number: "" }), + // dataIndex: "v_paint_codes", + // key: "v_paint_codes", + // render: (text, record) => + // record.vehicle?.v_paint_codes ? ( + // + // {Object.keys(record.vehicle.v_paint_codes) + // .filter( + // (key) => + // record.vehicle.v_paint_codes[key] !== "" && + // record.vehicle.v_paint_codes[key] !== null && + // record.vehicle.v_paint_codes[key] !== undefined + // ) + // .map((key, idx) => ( + // {record.vehicle.v_paint_codes[key]} + // ))} + // + // ) : null, + // }, + { + title: i18n.t("jobs.fields.date_repairstarted"), + dataIndex: "date_repairstarted", + key: "date_repairstarted", + ellipsis: true, + sorter: (a, b) => dateSort(a.date_repairstarted, b.date_repairstarted), + sortOrder: + state.sortedInfo.columnKey === "date_repairstarted" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: i18n.t("jobs.fields.date_repairstarted") + " (HH:MM)", + dataIndex: "date_repairstarted_time", + key: "date_repairstarted_time", + ellipsis: true, - render: (text, record) => ( - {record.date_repairstarted} - ), - }, - ]; + render: (text, record) => ( + {record.date_repairstarted} + ), + }, + ]; }; export default r; diff --git a/client/src/components/production-list-columns/production-list-columns.date.component.jsx b/client/src/components/production-list-columns/production-list-columns.date.component.jsx index 06a5c04d3..282fd3812 100644 --- a/client/src/components/production-list-columns/production-list-columns.date.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.date.component.jsx @@ -1,102 +1,111 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Dropdown, TimePicker } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Dropdown, TimePicker} from "antd"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {DateFormatter} from "../../utils/DateFormatter"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; export default function ProductionListDate({ - record, - field, - time, - pastIndicator, -}) { - const [updateAlert] = useMutation(UPDATE_JOB); - const [visible, setVisible] = useState(false); - const { t } = useTranslation(); + record, + field, + time, + pastIndicator, + }) { + const [updateAlert] = useMutation(UPDATE_JOB); + const [open, setOpen] = useState(false); + const {t} = useTranslation(); - const handleChange = (date) => { - logImEXEvent("product_toggle_date", { field }); - // if (date.isSame(record[field] && moment(record[field]))) { - // return; - // } + const handleChange = (date) => { + logImEXEvent("product_toggle_date", {field}); + // if (date.isSame(record[field] && dayjs(record[field]))) { + // return; + // } - //e.stopPropagation(); + //e.stopPropagation(); - updateAlert({ - variables: { - jobId: record.id, - job: { - [field]: date, - }, - }, - optimisticResponse: { - update_jobs: { - [field]: date, - }, - }, - }).then(() => { - if (record.refetch) record.refetch(); - if (!time) { - setVisible(false); - } - }); - }; + updateAlert({ + variables: { + jobId: record.id, + job: { + [field]: date, + }, + }, + optimisticResponse: { + update_jobs: { + [field]: date, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + if (!time) { + setOpen(false); + } + }); + }; - let className = ""; - if (pastIndicator) { - className = - !!record[field] && - ((moment().isSameOrAfter(moment(record[field]), "day") && - "production-completion-past") || - (moment().add(1, "day").isSame(moment(record[field]), "day") && - "production-completion-soon")); - } + let className = ""; + if (pastIndicator) { + className = + !!record[field] && + ((dayjs().isSameOrAfter(dayjs(record[field]), "day") && + "production-completion-past") || + (dayjs().add(1, "day").isSame(dayjs(record[field]), "day") && + "production-completion-soon")); + } + // TODO - Client Update = Why is the overlay a card? - return ( - setVisible(v)} - visible={visible} - style={{ - height: "19px", - }} - overlay={ - e.stopPropagation()}> - e.stopPropagation()} - value={(record[field] && moment(record[field])) || null} - onChange={handleChange} - format="MM/DD/YYYY" - isDateOnly={!time} - /> - {time && ( - e.stopPropagation()} - value={(record[field] && moment(record[field])) || null} - onChange={handleChange} - minuteStep={15} - format="hh:mm a" - /> - )} - - - } - > -
    setVisible(true)} - style={{ - height: "19px", - }} - className={className} - > - {record[field]} -
    -
    - ); + const overlayMenu = { + items: [ + { + key: 'overlayItem1', + label: + e.stopPropagation()}> + e.stopPropagation()} + value={(record[field] && dayjs(record[field])) || null} + onChange={handleChange} + format="MM/DD/YYYY" + isDateOnly={!time} + /> + {time && ( + e.stopPropagation()} + value={(record[field] && dayjs(record[field])) || null} + onChange={handleChange} + minuteStep={15} + format="hh:mm a" + /> + )} + + + } + ] + } + + return ( + setOpen(v)} + open={open} + style={{ + height: "19px", + }} + menu={overlayMenu} + > +
    setOpen(true)} + style={{ + height: "19px", + }} + className={className} + > + {record[field]} +
    +
    + ); } diff --git a/client/src/components/production-list-columns/production-list-columns.detailpriority.component.jsx b/client/src/components/production-list-columns/production-list-columns.detailpriority.component.jsx index ebd88163f..cb03f11ed 100644 --- a/client/src/components/production-list-columns/production-list-columns.detailpriority.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.detailpriority.component.jsx @@ -1,60 +1,62 @@ -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu } from "antd"; +import {useMutation} from "@apollo/client"; +import {Dropdown} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -export default function ProductionListColumnDetailPriority({ record }) { - const { t } = useTranslation(); +export default function ProductionListColumnDetailPriority({record}) { + const {t} = useTranslation(); - const [updateAlert] = useMutation(UPDATE_JOB); + const [updateAlert] = useMutation(UPDATE_JOB); - const handleSetDetailPriority = (e) => { - logImEXEvent("production_set_detail_priority"); - // e.stopPropagation(); - const { key } = e; - updateAlert({ - variables: { - jobId: record.id, - job: { - production_vars: { - ...record.production_vars, - detailpriority: key === "clearDetailPriority" ? null : key, - }, - }, - }, - }).then(() => { - if (record.refetch) record.refetch(); - }); - }; + const handleSetDetailPriority = (e) => { + logImEXEvent("production_set_detail_priority"); + // e.stopPropagation(); + const {key} = e; + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + detailpriority: key === "clearDetailPriority" ? null : key, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; - return ( - - - {t("production.actions.detailpriority-clear")} - - - {new Array(15).fill().map((value, index) => ( - -
    - {index + 1} -
    -
    - ))} -
    - - } - trigger={["click"]} - > -
    - {record.production_vars && record.production_vars.detailpriority} -
    -
    - ); + const menu = { + items: [ + { + key: "clearDetailPriority", + label: t("production.actions.detailpriority-clear"), + }, + { + key: "set", + label: t("production.actions.detailpriority-set"), + children: new Array(15).fill().map((value, index) => ({ + key: index + 1, + label: ( +
    + {index + 1} +
    + ), + })), + }, + ], + onClick: handleSetDetailPriority + } + + return ( + +
    + {record.production_vars && record.production_vars.detailpriority} +
    +
    + ); } diff --git a/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx b/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx index e2ed28896..f7f6dfb6c 100644 --- a/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx @@ -1,200 +1,191 @@ -import { DeleteFilled, PlusCircleFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { - Button, - Col, - notification, - Popover, - Row, - Select, - Space, - Spin, -} from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {DeleteFilled, PlusCircleFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Button, Col, notification, Popover, Row, Select, Space, Spin,} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; -const iconStyle = { marginLeft: ".3rem" }; +const iconStyle = {marginLeft: ".3rem"}; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function ProductionListEmpAssignment({ - insertAuditTrail, - bodyshop, - record, - type, -}) { - const { t } = useTranslation(); - const [updateJob] = useMutation(UPDATE_JOB); - const [loading, setLoading] = useState(false); + insertAuditTrail, + bodyshop, + record, + type, + }) { + const {t} = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); - const handleAdd = async (assignment) => { - setLoading(true); - const { operation, employeeid, name } = assignment; - logImEXEvent("job_assign_employee", { operation }); + const handleAdd = async (assignment) => { + setLoading(true); + const {operation, employeeid, name} = assignment; + logImEXEvent("job_assign_employee", {operation}); - let empAssignment = determineFieldName(operation); + let empAssignment = determineFieldName(operation); - const result = await updateJob({ - variables: { jobId: record.id, job: { [empAssignment]: employeeid } }, + const result = await updateJob({ + variables: {jobId: record.id, job: {[empAssignment]: employeeid}}, - // awaitRefetchQueries: true, + // awaitRefetchQueries: true, + }); + + insertAuditTrail({ + jobid: record.id, + operation: AuditTrailMapping.jobassignmentchange(empAssignment, name), + }); + + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + const handleRemove = async (operation) => { + setLoading(true); + logImEXEvent("job_unassign_employee", {operation}); + + let empAssignment = determineFieldName(operation); + const result = await updateJob({ + variables: {jobId: record.id, job: {[empAssignment]: null}}, + + awaitRefetchQueries: true, + }); + + insertAuditTrail({ + jobid: record.id, + operation: AuditTrailMapping.jobassignmentremoved(empAssignment), + }); + + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + + const [assignment, setAssignment] = useState({ + operation: null, + employeeid: null, }); - insertAuditTrail({ - jobid: record.id, - operation: AuditTrailMapping.jobassignmentchange(empAssignment, name), - }); + const [visibility, setVisibility] = useState(false); + const onChange = (e, option) => { + setAssignment({...assignment, employeeid: e, name: option.name}); + }; - if (!!result.errors) { - notification["error"]({ - message: t("jobs.errors.assigning", { - message: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; - const handleRemove = async (operation) => { - setLoading(true); - logImEXEvent("job_unassign_employee", { operation }); + const popContent = ( + +
    + + + + + + + + + + ); - let empAssignment = determineFieldName(operation); - const result = await updateJob({ - variables: { jobId: record.id, job: { [empAssignment]: null } }, + let theEmployee; - awaitRefetchQueries: true, - }); + if (record[type]) + theEmployee = bodyshop.employees.find((e) => e.id === record[type]); - insertAuditTrail({ - jobid: record.id, - operation: AuditTrailMapping.jobassignmentremoved(empAssignment), - }); - - if (!!result.errors) { - notification["error"]({ - message: t("jobs.errors.assigning", { - message: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }; - - const [assignment, setAssignment] = useState({ - operation: null, - employeeid: null, - }); - - const [visibility, setVisibility] = useState(false); - const onChange = (e, option) => { - setAssignment({ ...assignment, employeeid: e, name: option.name }); - }; - - const popContent = ( - - - - - - - - - - - - ); - - let theEmployee; - - if (record[type]) - theEmployee = bodyshop.employees.find((e) => e.id === record[type]); - - return ( - - - {record[type] ? ( -
    + return ( + + + {record[type] ? ( +
    {`${theEmployee.first_name || ""} ${ - theEmployee.last_name || "" + theEmployee.last_name || "" }`} - handleRemove(type)} - /> -
    - ) : ( - { - setAssignment({ operation: type }); - setVisibility(true); - }} - /> - )} -
    -
    - ); + handleRemove(type)} + /> +
    + ) : ( + { + setAssignment({operation: type}); + setVisibility(true); + }} + /> + )} +
    +
    + ); } const determineFieldName = (operation) => { - switch (operation) { - case "employee_body": - return "employee_body"; - case "employee_prep": - return "employee_prep"; - case "employee_refinish": - return "employee_refinish"; - case "employee_csr": - return "employee_csr"; - default: - return null; - } + switch (operation) { + case "employee_body": + return "employee_body"; + case "employee_prep": + return "employee_prep"; + case "employee_refinish": + return "employee_refinish"; + case "employee_csr": + return "employee_csr"; + default: + return null; + } }; export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListEmpAssignment); diff --git a/client/src/components/production-list-columns/production-list-columns.lastcontacted.component.jsx b/client/src/components/production-list-columns/production-list-columns.lastcontacted.component.jsx index 95532e0a3..335a3ceb7 100644 --- a/client/src/components/production-list-columns/production-list-columns.lastcontacted.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.lastcontacted.component.jsx @@ -1,146 +1,154 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Dropdown, Form, Input, notification, Space } from "antd"; -import moment from "moment"; -import React, { useState, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { INSERT_NEW_NOTE } from "../../graphql/notes.queries"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Dropdown, Form, Input, notification, Space} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {INSERT_NEW_NOTE} from "../../graphql/notes.queries"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; +import {DateFormatter} from "../../utils/DateFormatter"; import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionLastContacted); -export function ProductionLastContacted({ currentUser, record }) { - const [updateAlert] = useMutation(UPDATE_JOB); - const [insertNote] = useMutation(INSERT_NEW_NOTE); - const [visible, setVisible] = useState(false); - const { t } = useTranslation(); - const [form] = Form.useForm(); - const handleFinish = async ({ - date_last_contacted, - date_next_contact, - note, - }) => { - logImEXEvent("production_last_contacted"); +export function ProductionLastContacted({currentUser, record}) { + const [updateAlert] = useMutation(UPDATE_JOB); + const [insertNote] = useMutation(INSERT_NEW_NOTE); + const [open, setOpen] = useState(false); + const {t} = useTranslation(); + const [form] = Form.useForm(); + const handleFinish = async ({ + date_last_contacted, + date_next_contact, + note, + }) => { + logImEXEvent("production_last_contacted"); - //e.stopPropagation(); - const res = await updateAlert({ - variables: { - jobId: record.id, - job: { - date_last_contacted, - ...(date_next_contact ? { date_next_contact } : {}), - }, - }, - }); - if (res.errors) { - notification.open({ - type: "error", - message: t("jobs.errors.saving", { - error: JSON.stringify(res.errors), - }), - }); - } - if (note && note.trim() !== "") { - //Insert a note. - const res2 = await insertNote({ - variables: { - noteInput: { - jobid: record.id, - text: note, - created_by: currentUser.email, - }, - }, - }); - if (res2.errors) { - notification.open({ - type: "error", - message: t("notes.errors.inserting", { - error: JSON.stringify(res.errors), - }), + //e.stopPropagation(); + const res = await updateAlert({ + variables: { + jobId: record.id, + job: { + date_last_contacted, + ...(date_next_contact ? {date_next_contact} : {}), + }, + }, }); - } - } - if (record.refetch) record.refetch(); - - setVisible(false); - }; - - useEffect(() => { - if (visible) { - form.setFieldsValue({ - note: null, - date_last_contacted: - record.date_last_contacted && moment(record.date_last_contacted), - }); - } - }, [visible, form, record.date_last_contacted]); - - return ( -
    - e.stopPropagation()} - > -
    - - - - - - - - - - - - - - - + if (res.errors) { + notification.open({ + type: "error", + message: t("jobs.errors.saving", { + error: JSON.stringify(res.errors), + }), + }); } - > -
    setVisible(true)} - style={{ - height: "19px", - }} - > - - {record.date_last_contacted} - + if (note && note.trim() !== "") { + //Insert a note. + const res2 = await insertNote({ + variables: { + noteInput: { + jobid: record.id, + text: note, + created_by: currentUser.email, + }, + }, + }); + if (res2.errors) { + notification.open({ + type: "error", + message: t("notes.errors.inserting", { + error: JSON.stringify(res.errors), + }), + }); + } + } + if (record.refetch) record.refetch(); + + setOpen(false); + }; + + useEffect(() => { + if (open) { + form.setFieldsValue({ + note: null, + date_last_contacted: + record.date_last_contacted && dayjs(record.date_last_contacted), + }); + } + }, [open, form, record.date_last_contacted]); + + const overlayMenu = { + items: [ + { + key: 'overlay-item-1', + label: + e.stopPropagation()} + > +
    + + + + + + + + + + + + + + +
    + } + ] + } + + return ( +
    + +
    setOpen(true)} + style={{ + height: "19px", + }} + > + + {record.date_last_contacted} + +
    +
    - -
    - ); + ); } diff --git a/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx b/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx index 501a625d8..c6b371cac 100644 --- a/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx @@ -1,60 +1,61 @@ -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu } from "antd"; +import {useMutation} from "@apollo/client"; +import {Dropdown} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -export default function ProductionListColumnPaintPriority({ record }) { - const { t } = useTranslation(); +export default function ProductionListColumnPaintPriority({record}) { + const {t} = useTranslation(); - const [updateAlert] = useMutation(UPDATE_JOB); + const [updateAlert] = useMutation(UPDATE_JOB); - const handleSetPaintPriority = (e) => { - logImEXEvent("production_set_paint_priority"); - // e.stopPropagation(); - const { key } = e; - updateAlert({ - variables: { - jobId: record.id, - job: { - production_vars: { - ...record.production_vars, - paintpriority: key === "clearPaintPriority" ? null : key, - }, - }, - }, - }).then(() => { - if (record.refetch) record.refetch(); - }); - }; + const handleSetPaintPriority = (e) => { + logImEXEvent("production_set_paint_priority"); + // e.stopPropagation(); + const {key} = e; + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + paintpriority: key === "clearPaintPriority" ? null : key, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; - return ( - - - {t("production.actions.paintpriority-clear")} - - - {new Array(15).fill().map((value, index) => ( - -
    - {index + 1} -
    -
    - ))} -
    - - } - trigger={["click"]} - > -
    - {record.production_vars && record.production_vars.paintpriority} -
    -
    - ); + const menu = { + items: [ + { + key: "clearPaintPriority", + label: t("production.actions.paintpriority-clear"), + }, + { + key: "set", + label: t("production.actions.paintpriority-set"), + children: new Array(15).fill().map((value, index) => ({ + key: index + 1, + label: ( +
    + {index + 1} +
    + ), + })), + }, + ], + onClick: handleSetPaintPriority + }; + + return ( + +
    + {record.production_vars && record.production_vars.paintpriority} +
    +
    + ); } diff --git a/client/src/components/production-list-columns/production-list-columns.partsreceived.component.jsx b/client/src/components/production-list-columns/production-list-columns.partsreceived.component.jsx index e1948ff94..8a12a6ed9 100644 --- a/client/src/components/production-list-columns/production-list-columns.partsreceived.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.partsreceived.component.jsx @@ -1,41 +1,41 @@ -import { useMemo } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMemo} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListColumnPartsReceived); -export function ProductionListColumnPartsReceived({ bodyshop, record }) { - const amount = useMemo(() => { - const amount = record.joblines_status.reduce( - (acc, val) => { - acc.total += val.count; - acc.received = - val.status === bodyshop.md_order_statuses.default_received - ? acc.received + val.count - : acc.received; - return acc; - }, - { total: 0, received: 0 } - ); +export function ProductionListColumnPartsReceived({bodyshop, record}) { + const amount = useMemo(() => { + const amount = record.joblines_status.reduce( + (acc, val) => { + acc.total += val.count; + acc.received = + val.status === bodyshop.md_order_statuses.default_received + ? acc.received + val.count + : acc.received; + return acc; + }, + {total: 0, received: 0} + ); - return { - ...amount, - percent: - amount.total !== 0 - ? ((amount.received / amount.total) * 100).toFixed(0) + "%" - : "N/A", - }; - }, [record, bodyshop.md_order_statuses]); + return { + ...amount, + percent: + amount.total !== 0 + ? ((amount.received / amount.total) * 100).toFixed(0) + "%" + : "N/A", + }; + }, [record, bodyshop.md_order_statuses]); - return `${amount.percent} (${amount.received}/${amount.total})`; + return `${amount.percent} (${amount.received}/${amount.total})`; } diff --git a/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx b/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx index ff823bc3d..b9131208f 100644 --- a/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx @@ -1,117 +1,117 @@ import Icon from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Button, Input, Popover, Space } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { FaRegStickyNote } from "react-icons/fa"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {useMutation} from "@apollo/client"; +import {Button, Input, Popover, Space} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {FaRegStickyNote} from "react-icons/fa"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({ - setNoteUpsertContext: (context) => - dispatch(setModalContext({ context: context, modal: "noteUpsert" })), + setNoteUpsertContext: (context) => + dispatch(setModalContext({context: context, modal: "noteUpsert"})), }); -function ProductionListColumnProductionNote({ record, setNoteUpsertContext }) { - const { t } = useTranslation(); +function ProductionListColumnProductionNote({record, setNoteUpsertContext}) { + const {t} = useTranslation(); - const [note, setNote] = useState( - (record.production_vars && record.production_vars.note) || "" - ); + const [note, setNote] = useState( + (record.production_vars && record.production_vars.note) || "" + ); - const [visible, setVisible] = useState(false); + const [open, setOpen] = useState(false); - const [updateAlert] = useMutation(UPDATE_JOB); + const [updateAlert] = useMutation(UPDATE_JOB); - const handleSaveNote = (e) => { - logImEXEvent("production_add_note"); - e.stopPropagation(); - setVisible(false); - updateAlert({ - variables: { - jobId: record.id, - job: { - production_vars: { - ...record.production_vars, - note: note, - }, - }, - }, - }).then(() => { - if (record.refetch) record.refetch(); - }); - }; + const handleSaveNote = (e) => { + logImEXEvent("production_add_note"); + e.stopPropagation(); + setOpen(false); + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + note: note, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; - const handleChange = (e) => { - e.stopPropagation(); - setNote(e.target.value); - }; + const handleChange = (e) => { + e.stopPropagation(); + setNote(e.target.value); + }; - const handleVisibleChange = (flag) => { - setVisible(flag); - if (flag) - setNote((record.production_vars && record.production_vars.note) || ""); - }; + const handleOpenChange = (flag) => { + setOpen(flag); + if (flag) + setNote((record.production_vars && record.production_vars.note) || ""); + }; - return ( - - - - - + + +
    + } + trigger={["click"]} + > +
    - {t("notes.actions.savetojobnotes")} - - -
    - } - trigger={["click"]} - > -
    - - {(record.production_vars && record.production_vars.note) || " "} -
    - - ); + + {(record.production_vars && record.production_vars.note) || " "} + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListColumnProductionNote); diff --git a/client/src/components/production-list-columns/production-list-columns.status.category.jsx b/client/src/components/production-list-columns/production-list-columns.status.category.jsx index 115b69a3f..08fbeb759 100644 --- a/client/src/components/production-list-columns/production-list-columns.status.category.jsx +++ b/client/src/components/production-list-columns/production-list-columns.status.category.jsx @@ -1,63 +1,65 @@ -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu, Spin } from "antd"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Dropdown, Spin} from "antd"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); -export function ProductionListColumnCategory({ record, bodyshop }) { - const [updateJob] = useMutation(UPDATE_JOB); - const [loading, setLoading] = useState(false); - const handleSetStatus = async (e) => { - logImEXEvent("production_change_status"); +export function ProductionListColumnCategory({record, bodyshop}) { + const [updateJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); - setLoading(true); - const { key } = e; - await updateJob({ - variables: { - jobId: record.id, - job: { - category: key, - }, - }, - }); + const handleSetStatus = async (e) => { + logImEXEvent("production_change_status"); - setLoading(false); - }; + setLoading(true); + const {key} = e; + await updateJob({ + variables: { + jobId: record.id, + job: { + category: key, + }, + }, + }); - return ( - - {bodyshop.md_categories.map((item) => ( - {item} - ))} - - } - trigger={["click"]} - > -
    - {record.category} - {loading && } -
    -
    - ); + setLoading(false); + }; + + const menu = { + items: bodyshop.md_categories.map((item) => ({ + key: item, + label: item, + })), + onClick: handleSetStatus, + style: { + maxHeight: "200px", + overflowY: "auto", + } + }; + + return ( + +
    + {record.category} + {loading && } +
    +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListColumnCategory); diff --git a/client/src/components/production-list-columns/production-list-columns.status.component.jsx b/client/src/components/production-list-columns/production-list-columns.status.component.jsx index e29ffdbeb..f4278bbe5 100644 --- a/client/src/components/production-list-columns/production-list-columns.status.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.status.component.jsx @@ -1,72 +1,74 @@ -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu, Spin } from "antd"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { insertAuditTrail } from "../../redux/application/application.actions"; +import {useMutation} from "@apollo/client"; +import {Dropdown, Spin} from "antd"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {insertAuditTrail} from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); + export function ProductionListColumnStatus({ - record, - bodyshop, - insertAuditTrail, -}) { - const [updateJob] = useMutation(UPDATE_JOB); - const [loading, setLoading] = useState(false); + record, + bodyshop, + insertAuditTrail, + }) { + const [updateJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); - const handleSetStatus = async (e) => { - logImEXEvent("production_change_status"); - // e.stopPropagation(); - setLoading(true); - const { key } = e; - await updateJob({ - variables: { - jobId: record.id, - job: { - status: key, - }, - }, - }); - insertAuditTrail({ - jobid: record.id, - operation: AuditTrailMapping.jobstatuschange(key), - }); + const handleSetStatus = async (e) => { + logImEXEvent("production_change_status"); + // e.stopPropagation(); + setLoading(true); + const {key} = e; + await updateJob({ + variables: { + jobId: record.id, + job: { + status: key, + }, + }, + }); + insertAuditTrail({ + jobid: record.id, + operation: AuditTrailMapping.jobstatuschange(key), + }); - setLoading(false); - }; + setLoading(false); + }; - return ( - - {bodyshop.md_ro_statuses.production_statuses.map((item) => ( - {item} - ))} - - } - trigger={["click"]} - > -
    - {record.status} - {loading && } -
    -
    - ); + const menu = { + items: bodyshop.md_ro_statuses.production_statuses.map((item) => ({ + key: item, + label: item, + })), + onClick: handleSetStatus, + style: { + maxHeight: "200px", + overflowY: "auto", + } + }; + + return ( + +
    + {record.status} + {loading && } +
    +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListColumnStatus); diff --git a/client/src/components/production-list-columns/prodution-list-columns.touchtime.component.jsx b/client/src/components/production-list-columns/prodution-list-columns.touchtime.component.jsx index c651b7f8d..30219a299 100644 --- a/client/src/components/production-list-columns/prodution-list-columns.touchtime.component.jsx +++ b/client/src/components/production-list-columns/prodution-list-columns.touchtime.component.jsx @@ -1,38 +1,39 @@ -import moment from "moment"; -import React, { useMemo } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useMemo} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionlistColumnTouchTime); -export function ProductionlistColumnTouchTime({ bodyshop, job }) { - let ct = useMemo(() => { - if (!!job.actual_in) { - const totalHrs = - (job.larhrs.aggregate.sum.mod_lb_hrs || 0) + - (job.labhrs.aggregate.sum.mod_lb_hrs || 0); +export function ProductionlistColumnTouchTime({bodyshop, job}) { + let ct = useMemo(() => { + if (!!job.actual_in) { + const totalHrs = + (job.larhrs.aggregate.sum.mod_lb_hrs || 0) + + (job.labhrs.aggregate.sum.mod_lb_hrs || 0); - const Difference_In_Days = moment().diff( - moment(job.actual_in), - "days", - true - ); + const Difference_In_Days = dayjs().diff( + dayjs(job.actual_in), + "day", + true + ); - return (totalHrs / Difference_In_Days).toFixed(2); - } - return 0; - }, [job]); + return (totalHrs / Difference_In_Days).toFixed(2); + } + return 0; + }, [job]); - const underTarget = ct < bodyshop.target_touchtime; + const underTarget = ct < bodyshop.target_touchtime; - return {ct}; + return {ct}; } diff --git a/client/src/components/production-list-detail/production-list-detail.component.jsx b/client/src/components/production-list-detail/production-list-detail.component.jsx index 96d81ed95..928785675 100644 --- a/client/src/components/production-list-detail/production-list-detail.component.jsx +++ b/client/src/components/production-list-detail/production-list-detail.component.jsx @@ -1,24 +1,27 @@ -import { PrinterFilled } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Descriptions, Drawer, PageHeader, Space } from "antd"; +import {PrinterFilled} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Descriptions, Drawer, Space} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_JOB_CARD_DETAILS} from "../../graphql/jobs.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {DateFormatter} from "../../utils/DateFormatter"; +import PhoneNumberFormatter from "../../utils/PhoneFormatter"; import AlertComponent from "../alert/alert.component"; import StartChatButton from "../chat-open-button/chat-open-button.component"; import JobAtChange from "../job-at-change/job-at-change.component"; import JobDetailCardsDocumentsComponent from "../job-detail-cards/job-detail-cards.documents.component"; import JobDetailCardsNotesComponent from "../job-detail-cards/job-detail-cards.notes.component"; import JobDetailCardsPartsComponent from "../job-detail-cards/job-detail-cards.parts.component"; +import CardTemplate from "../job-detail-cards/job-detail-cards.template.component"; import JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container"; import ScoreboardAddButton from "../job-scoreboard-add-button/job-scoreboard-add-button.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; @@ -26,144 +29,164 @@ import OwnerNameDisplay from "../owner-name-display/owner-name-display.component import ProductionRemoveButton from "../production-remove-button/production-remove-button.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - setPrintCenterContext: (context) => - dispatch(setModalContext({ context: context, modal: "printCenter" })), + setPrintCenterContext: (context) => + dispatch(setModalContext({context: context, modal: "printCenter"})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListDetail); export function ProductionListDetail({ - bodyshop, - jobs, - setPrintCenterContext, - technician, -}) { - const search = queryString.parse(useLocation().search); - const history = useHistory(); - const { selected } = search; + bodyshop, + jobs, + setPrintCenterContext, + technician, + }) { + const search = queryString.parse(useLocation().search); + const history = useNavigate(); + const {selected} = search; - const { t } = useTranslation(); - const theJob = jobs.find((j) => j.id === selected) || {}; + const {t} = useTranslation(); + const theJob = jobs.find((j) => j.id === selected) || {}; - const handleClose = () => { - delete search.selected; - history.push({ search: queryString.stringify(search) }); - }; - const { loading, error, data, refetch } = useQuery(QUERY_JOB_CARD_DETAILS, { - variables: { id: selected }, - skip: !selected, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const handleClose = () => { + delete search.selected; + history({search: queryString.stringify(search)}); + }; + const {loading, error, data, refetch} = useQuery(QUERY_JOB_CARD_DETAILS, { + variables: {id: selected}, + skip: !selected, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - return ( - - {!technician ? ( - - ) : null} - - {!technician ? ( - - ) : null} - - } - /> - } - placement="right" - width={"50%"} - onClose={handleClose} - visible={selected} - > - {loading && } - {error && } - {!loading && data && ( -
    - - - - {theJob.ro_number || ""} - - - - {data.jobs_by_pk.alt_transport || ""} - - - - - {theJob.clm_no || ""} - - - {theJob.ins_co_nm || ""} - - - - - - - - {`${theJob.v_model_yr || ""} ${theJob.v_color || ""} ${ - theJob.v_make_desc || "" - } ${theJob.v_model_desc || ""}`} - - - {theJob.clm_total} - - - {theJob.actual_in} - - - {theJob.scheduled_completion} - - - - - - - {!bodyshop.uselocalmediaserver && ( - - )} -
    - )} -
    - ); + return ( + + {!technician ? ( + + ) : null} + + {!technician ? ( + + ) : null} + + } + /> + } + placement="right" + width={"50%"} + onClose={handleClose} + open={selected} + > + {loading && } + {error && } + {!loading && data && ( +
    + + + + + + + {theJob.ro_number || ""} + + + + {data.jobs_by_pk.alt_transport || ""} + + + + + {theJob.clm_no || ""} + + + {theJob.ins_co_nm || ""} + + + + + {!technician ? ( + <> + + + + ) : ( + <> + + {data.jobs_by_pk.ownr_ph1} + + + {data.jobs_by_pk.ownr_ph2} + + + )} + + + + {`${theJob.v_model_yr || ""} ${theJob.v_color || ""} ${ + theJob.v_make_desc || "" + } ${theJob.v_model_desc || ""}`} + + + {theJob.clm_total} + + + {theJob.actual_in} + + + {theJob.scheduled_completion} + + + + + {!bodyshop.uselocalmediaserver && ( + + )} + +
    + )} +
    + ); } diff --git a/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx b/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx index 246177367..ad96eec51 100644 --- a/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx +++ b/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx @@ -1,101 +1,102 @@ -import { useMutation } from "@apollo/client"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { Button, Form, Input, notification, Popover, Space } from "antd"; -import { useTranslation } from "react-i18next"; -import { UPDATE_SHOP } from "../../graphql/bodyshop.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useMutation} from "@apollo/client"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {Button, Form, Input, notification, Popover, Space} from "antd"; +import {useTranslation} from "react-i18next"; +import {UPDATE_SHOP} from "../../graphql/bodyshop.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function ProductionListSaveConfigButton({ - columns, - bodyshop, - tableState, -}) { - const [updateShop] = useMutation(UPDATE_SHOP); - const [loading, setLoading] = useState(false); - const [visible, setVisible] = useState(false); - const [form] = Form.useForm(); + columns, + bodyshop, + tableState, + }) { + const [updateShop] = useMutation(UPDATE_SHOP); + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); + const [form] = Form.useForm(); - const { t } = useTranslation(); + const {t} = useTranslation(); - const handleSaveConfig = async (values) => { - logImEXEvent("production_save_config"); - setLoading(true); - const result = await updateShop({ - variables: { - id: bodyshop.id, - shop: { - production_config: [ - ...bodyshop.production_config.filter((b) => b.name !== values.name), - //Assign it to the name - { - name: values.name, - columns: { - columnKeys: columns.map((i) => { - return { key: i.key, width: i.width }; - }), - tableState, - }, + const handleSaveConfig = async (values) => { + logImEXEvent("production_save_config"); + setLoading(true); + const result = await updateShop({ + variables: { + id: bodyshop.id, + shop: { + production_config: [ + ...bodyshop.production_config.filter((b) => b.name !== values.name), + //Assign it to the name + { + name: values.name, + columns: { + columnKeys: columns.map((i) => { + return {key: i.key, width: i.width}; + }), + tableState, + }, + }, + ], + }, }, - ], - }, - }, - }); - if (!!!result.errors) { - notification["success"]({ message: t("bodyshop.successes.save") }); - } else { - notification["error"]({ - message: t("bodyshop.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - } - form.resetFields(); - setVisible(false); - setLoading(false); - }; - const popMenu = ( -
    -
    - - - + }); + if (!!!result.errors) { + notification["success"]({message: t("bodyshop.successes.save")}); + } else { + notification["error"]({ + message: t("bodyshop.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + form.resetFields(); + setOpen(false); + setLoading(false); + }; + const popMenu = ( +
    + + + + - - - - - -
    - ); + + + + + +
    + ); - return ( - - - - ); + return ( + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListSaveConfigButton); diff --git a/client/src/components/production-list-table/production-list-print.component.jsx b/client/src/components/production-list-table/production-list-print.component.jsx index 547819061..e5cd71ecf 100644 --- a/client/src/components/production-list-table/production-list-print.component.jsx +++ b/client/src/components/production-list-table/production-list-print.component.jsx @@ -1,132 +1,125 @@ -import { Button, Dropdown, Menu } from "antd"; -import React, { useState } from "react"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { useTranslation } from "react-i18next"; -import { GenerateDocument } from "../../utils/RenderTemplate"; +import {Button, Dropdown} from "antd"; +import React, {useState} from "react"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {useTranslation} from "react-i18next"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; const ProdTemplates = TemplateList("production"); const { - production_by_technician_one, - production_by_category_one, - production_by_repair_status_one, + production_by_technician_one, + production_by_category_one, + production_by_repair_status_one, } = TemplateList("special"); const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionListPrint); -export function ProductionListPrint({ bodyshop }) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - return ( - - {Object.keys(ProdTemplates).map((key) => ( - { - setLoading(true); - await GenerateDocument( - { - name: ProdTemplates[key].key, - // variables: { id: contract.id }, - }, - {}, - "p" - ); - setLoading(false); - }} - > - {ProdTemplates[key].title} - - ))} - - {bodyshop.employees - .filter((e) => e.active) - .map((e) => ( - { - setLoading(true); - await GenerateDocument( - { - name: production_by_technician_one.key, - variables: { id: e.id }, - }, - {}, - "p" - ); - setLoading(false); - }} - > - {e.first_name} {e.last_name} - - ))} - - - {bodyshop.md_categories.map((e) => ( - { - setLoading(true); - await GenerateDocument( - { - name: production_by_category_one.key, - variables: { category: e }, - }, - {}, - "p" - ); - setLoading(false); - }} - > - {e} - - ))} - - - {bodyshop.md_ro_statuses.production_statuses.map((e) => ( - { - setLoading(true); - await GenerateDocument( - { - name: production_by_repair_status_one.key, - variables: { status: e }, - }, - {}, - "p" - ); - setLoading(false); - }} - > - {e} - - ))} - - - } - > - - - ); + +export function ProductionListPrint({bodyshop}) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + + const menu = { + items: [ + ...Object.keys(ProdTemplates).map((key) => { + return { + key: key, + label: ProdTemplates[key].title, + onClick: async () => { + setLoading(true); + await GenerateDocument( + { + name: ProdTemplates[key].key, + // variables: { id: contract.id }, + }, + {}, + "p" + ); + setLoading(false); + } + }; + }), + { + label: t("reportcenter.templates.production_by_technician_one"), + children: bodyshop.employees + .filter((e) => e.active) + .map((e) => { + return { + key: e.id, + label: `${e.first_name} ${e.last_name}`, + onClick: async () => { + setLoading(true); + await GenerateDocument( + { + name: production_by_technician_one.key, + variables: {id: e.id}, + }, + {}, + "p" + ); + setLoading(false); + } + }; + }) + }, + { + label: t("reportcenter.templates.production_by_category_one"), + children: bodyshop.md_categories.map((e) => { + return { + key: e, + label: e, + onClick: async () => { + setLoading(true); + await GenerateDocument( + { + name: production_by_category_one.key, + variables: {category: e}, + }, + {}, + "p" + ); + setLoading(false); + } + }; + }) + }, + { + label: t("reportcenter.templates.production_by_repair_status_one"), + children: bodyshop.md_ro_statuses.production_statuses.map((e) => { + return { + key: e, + label: e, + onClick: async () => { + setLoading(true); + await GenerateDocument( + { + name: production_by_repair_status_one.key, + variables: {status: e}, + }, + {}, + "p" + ); + setLoading(false); + } + }; + }) + } + ] + }; + + return ( + + + ); } diff --git a/client/src/components/production-list-table/production-list-table-view-select.component.jsx b/client/src/components/production-list-table/production-list-table-view-select.component.jsx index 82086ac96..eb219c812 100644 --- a/client/src/components/production-list-table/production-list-table-view-select.component.jsx +++ b/client/src/components/production-list-table/production-list-table-view-select.component.jsx @@ -1,162 +1,161 @@ -import { DeleteOutlined } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Popconfirm, Select } from "antd"; +import {DeleteOutlined} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Popconfirm, Select} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_ACTIVE_PROD_LIST_VIEW } from "../../graphql/associations.queries"; -import { UPDATE_SHOP } from "../../graphql/bodyshop.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_ACTIVE_PROD_LIST_VIEW} from "../../graphql/associations.queries"; +import {UPDATE_SHOP} from "../../graphql/bodyshop.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import ProductionListColumns from "../production-list-columns/production-list-columns.data"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + technician: selectTechnician, + currentUser: selectCurrentUser, }); export function ProductionListTable({ - bodyshop, - technician, - currentUser, - state, - data, - setColumns, - setState, -}) { - const { t } = useTranslation(); - const [updateDefaultProdView] = useMutation(UPDATE_ACTIVE_PROD_LIST_VIEW); - const [updateShop] = useMutation(UPDATE_SHOP); + bodyshop, + technician, + currentUser, + state, + data, + setColumns, + setState, + }) { + const {t} = useTranslation(); + const [updateDefaultProdView] = useMutation(UPDATE_ACTIVE_PROD_LIST_VIEW); + const [updateShop] = useMutation(UPDATE_SHOP); - const handleSelect = async (value, option) => { - setColumns( - bodyshop.production_config - .filter((pc) => pc.name === value)[0] - .columns.columnKeys.map((k) => { - return { - ...ProductionListColumns({ - bodyshop, - technician, - state, - data: data, - activeStatuses: bodyshop.md_ro_statuses.active_statuses, - }).find((e) => e.key === k.key), - width: k.width, - }; - }) - ); - setState( - bodyshop.production_config.filter((pc) => pc.name === value)[0].columns - .tableState - ); + const handleSelect = async (value, option) => { + setColumns( + bodyshop.production_config + .filter((pc) => pc.name === value)[0] + .columns.columnKeys.map((k) => { + return { + ...ProductionListColumns({ + bodyshop, + technician, + state, + data: data, + activeStatuses: bodyshop.md_ro_statuses.active_statuses, + }).find((e) => e.key === k.key), + width: k.width, + }; + }) + ); + setState( + bodyshop.production_config.filter((pc) => pc.name === value)[0].columns + .tableState + ); - const assoc = bodyshop.associations.find( - (a) => a.useremail === currentUser.email - ); + const assoc = bodyshop.associations.find( + (a) => a.useremail === currentUser.email + ); - if (assoc) { - await updateDefaultProdView({ - variables: { assocId: assoc.id, view: value }, - update(cache) { - cache.modify({ - id: cache.identify(bodyshop), - fields: { - associations(existingAssociations, { readField }) { - return existingAssociations.map((a) => { - if (a.useremail !== currentUser.email) return a; - return { ...a, default_prod_list_view: value }; - }); - }, + if (assoc) { + await updateDefaultProdView({ + variables: {assocId: assoc.id, view: value}, + update(cache) { + cache.modify({ + id: cache.identify(bodyshop), + fields: { + associations(existingAssociations, {readField}) { + return existingAssociations.map((a) => { + if (a.useremail !== currentUser.email) return a; + return {...a, default_prod_list_view: value}; + }); + }, + }, + }); + }, + }); + } + }; + + const handleTrash = async (name) => { + await updateShop({ + variables: { + id: bodyshop.id, + shop: { + production_config: bodyshop.production_config.filter( + (b) => b.name !== name + ), + }, }, - }); - }, - }); - } - }; + awaitRefetchQueries: true, + }); - const handleTrash = async (name) => { - await updateShop({ - variables: { - id: bodyshop.id, - shop: { - production_config: bodyshop.production_config.filter( - (b) => b.name !== name - ), - }, - }, - awaitRefetchQueries: true, - }); + setColumns( + bodyshop.production_config[0].columns.columnKeys.map((k) => { + return { + ...ProductionListColumns({ + technician, + state, + data: data, + activeStatuses: bodyshop.md_ro_statuses.active_statuses, + }).find((e) => e.key === k.key), + width: k.width, + }; + }) + ); - setColumns( - bodyshop.production_config[0].columns.columnKeys.map((k) => { - return { - ...ProductionListColumns({ - technician, - state, - data: data, - activeStatuses: bodyshop.md_ro_statuses.active_statuses, - }).find((e) => e.key === k.key), - width: k.width, - }; - }) + setState(bodyshop.production_config[0].columns.tableState); + }; + const assoc = bodyshop.associations.find( + (a) => a.useremail === currentUser.email ); - setState(bodyshop.production_config[0].columns.tableState); - }; - const assoc = bodyshop.associations.find( - (a) => a.useremail === currentUser.email - ); - - const defaultView = assoc && assoc.default_prod_list_view; - return ( -
    - + {bodyshop.production_config.map((config) => ( + +
    {config.name} - handleTrash(config.name)} - > - { - e.stopPropagation(); - }} - /> - -
    -
    - ))} - -
    - ); + handleTrash(config.name)} + > + { + e.stopPropagation(); + }} + /> + + + + ))} + + + ); } + export default connect(mapStateToProps, null)(ProductionListTable); diff --git a/client/src/components/production-list-table/production-list-table.component.jsx b/client/src/components/production-list-table/production-list-table.component.jsx index 5257cea9d..91c23a7fc 100644 --- a/client/src/components/production-list-table/production-list-table.component.jsx +++ b/client/src/components/production-list-table/production-list-table.component.jsx @@ -1,350 +1,345 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Button, - Dropdown, - Input, - Menu, - PageHeader, - Space, - Statistic, - Table, -} from "antd"; -import React, { useEffect, useMemo, useState } from "react"; +import {SyncOutlined} from "@ant-design/icons"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Dropdown, Input, Space, Statistic, Table} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; +import React, {useEffect, useMemo, useState} from "react"; import ReactDragListView from "react-drag-listview"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import ProductionListColumnsAdd from "../production-list-columns/production-list-columns.add.component"; import ProductionListColumns from "../production-list-columns/production-list-columns.data"; import ProductionListDetail from "../production-list-detail/production-list-detail.component"; -import ProductionListSaveConfigButton from "../production-list-save-config-button/production-list-save-config-button.component"; +import ProductionListSaveConfigButton + from "../production-list-save-config-button/production-list-save-config-button.component"; import ProductionListPrint from "./production-list-print.component"; import ProductionListTableViewSelect from "./production-list-table-view-select.component"; import ResizeableTitle from "./production-list-table.resizeable.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + technician: selectTechnician, + currentUser: selectCurrentUser, }); -export function ProductionListTable({ - loading, - data, - refetch, - bodyshop, - technician, - currentUser, -}) { - const [searchText, setSearchText] = useState(""); - const { Production_List_Status_Colors } = useTreatments( - ["Production_List_Status_Colors"], - {}, - bodyshop.imexshopid - ); - const assoc = bodyshop.associations.find( - (a) => a.useremail === currentUser.email - ); +export function ProductionListTable({loading, data, refetch, bodyshop, technician, currentUser}) { - const defaultView = assoc && assoc.default_prod_list_view; + const [searchText, setSearchText] = useState(""); - const [state, setState] = useState( - (bodyshop.production_config && - bodyshop.production_config.find((p) => p.name === defaultView)?.columns - .tableState) || - bodyshop.production_config[0]?.columns.tableState || { - sortedInfo: {}, - filteredInfo: { text: "" }, - } - ); - - const { t } = useTranslation(); - - const matchingColumnConfig = useMemo(() => { - return bodyshop.production_config.find((p) => p.name === defaultView); - }, [bodyshop.production_config, defaultView]); - - const [columns, setColumns] = useState( - (state && - matchingColumnConfig && - matchingColumnConfig.columns.columnKeys.map((k) => { - return { - ...ProductionListColumns({ - bodyshop, - technician, - state, - data: data, - activeStatuses: bodyshop.md_ro_statuses.active_statuses, - }).find((e) => e.key === k.key), - width: k.width ?? 100, - }; - })) || - [] - ); - - useEffect(() => { - const newColumns = - (state && - matchingColumnConfig && - matchingColumnConfig.columns.columnKeys.map((k) => { - return { - ...ProductionListColumns({ - bodyshop, - technician, - state, - data: data, - activeStatuses: bodyshop.md_ro_statuses.active_statuses, - }).find((e) => e.key === k.key), - width: k.width ?? 100, - }; - })) || - []; - setColumns(newColumns); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ - //state, - matchingColumnConfig, - bodyshop, - technician, - data, - ]); //State removed from dependency array as it causes race condition when removing columns from table view and is not needed. - - const handleTableChange = (pagination, filters, sorter) => { - setState({ - ...state, - filteredInfo: filters, - sortedInfo: { columnKey: sorter.columnKey, order: sorter.order }, + const {treatments: {Production_List_Status_Colors}} = useSplitTreatments({ + attributes: {}, + names: ["Production_List_Status_Colors"], + splitKey: bodyshop.imexshopid, }); - }; - const onDragEnd = (fromIndex, toIndex) => { - const columnsCopy = columns.slice(); - const item = columnsCopy.splice(fromIndex, 1)[0]; - columnsCopy.splice(toIndex, 0, item); - setColumns(columnsCopy); - }; - const removeColumn = (e) => { - const { key } = e; - const newColumns = columns.filter((i) => i.key !== key); - setColumns(newColumns); - }; + const assoc = bodyshop.associations.find( + (a) => a.useremail === currentUser.email + ); - const handleResize = - (index) => - (e, { size }) => { - const nextColumns = [...columns]; - nextColumns[index] = { - ...nextColumns[index], - width: size.width, - }; - setColumns(nextColumns); + const defaultView = assoc && assoc.default_prod_list_view; + + const [state, setState] = useState( + (bodyshop.production_config && + bodyshop.production_config.find((p) => p.name === defaultView)?.columns + .tableState) || + bodyshop.production_config[0]?.columns.tableState || { + sortedInfo: {}, + filteredInfo: {text: ""}, + } + ); + + const {t} = useTranslation(); + + const matchingColumnConfig = useMemo(() => { + return bodyshop.production_config.find((p) => p.name === defaultView); + }, [bodyshop.production_config, defaultView]); + + const [columns, setColumns] = useState( + (state && + matchingColumnConfig && + matchingColumnConfig.columns.columnKeys.map((k) => { + return { + ...ProductionListColumns({ + bodyshop, + technician, + state, + data, + activeStatuses: bodyshop.md_ro_statuses.active_statuses, + }).find((e) => e.key === k.key), + width: k.width ?? 100, + }; + })) || + [] + ); + + useEffect(() => { + const newColumns = + (state && + matchingColumnConfig && + matchingColumnConfig.columns.columnKeys.map((k) => { + return { + ...ProductionListColumns({ + bodyshop, + technician, + state, + data: data, + activeStatuses: bodyshop.md_ro_statuses.active_statuses, + }).find((e) => e.key === k.key), + width: k.width ?? 100, + }; + })) || + []; + setColumns(newColumns); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + //state, + matchingColumnConfig, + bodyshop, + technician, + data, + ]); //State removed from dependency array as it causes race condition when removing columns from table view and is not needed. + + + const handleTableChange = (pagination, filters, sorter) => { + setState({ + ...state, + filteredInfo: filters, + sortedInfo: {columnKey: sorter.columnKey, order: sorter.order}, + }); }; - const headerItem = (col) => ( - - - {t("production.actions.removecolumn")} - - - } - trigger={["contextMenu"]} - > - {col.title} - - ); + const onDragEnd = (fromIndex, toIndex) => { + const columnsCopy = columns.slice(); + const item = columnsCopy.splice(fromIndex, 1)[0]; + columnsCopy.splice(toIndex, 0, item); + setColumns(columnsCopy); + }; - const dataSource = - searchText === "" - ? data - : data.filter( - (j) => - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_co_nm || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.status || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.ins_co_nm || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ); + const removeColumn = (e) => { + const {key} = e; + const newColumns = columns.filter((i) => i.key !== key); + setColumns(newColumns); + }; - // const handleSelectRecord = (record) => { - // if (selected !== record.id) { - // setSelected(record.id); - // } else { - // setSelected(null); - // } - // }; - - if (!!!columns) return
    No columns found.
    ; - - const totalHrs = data - .reduce( - (acc, val) => - acc + - (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0) + - (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), - 0 - ) - .toFixed(1); - const totalLAB = data - .reduce( - (acc, val) => acc + (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0), - 0 - ) - .toFixed(1); - const totalLAR = data - .reduce( - (acc, val) => acc + (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), - 0 - ) - .toFixed(1); - return ( -
    - - - - - - - } - extra={ - - - - - - - - setSearchText(e.target.value)} - placeholder={t("general.labels.search")} - value={searchText} - /> - - - } - /> - - -
    { - if (!bodyshop.md_ro_statuses.production_colors) return null; - - const color = bodyshop.md_ro_statuses.production_colors.find( - (x) => x.status === record.status - ); - - if (!color) { - if (index % 2 === 0) - return { - style: { - backgroundColor: `rgb(236, 236, 236)`, - }, - }; - - return null; - } - - return { - className: "rowWithColor", - style: { - "--bgColor": `rgb(${color.color.r},${color.color.g},${color.color.b},${color.color.a})`, - }, - }; - }, - })} - components={{ - header: { - cell: ResizeableTitle, - }, - }} - columns={columns.map((c, index) => { - return { - ...c, - filteredValue: state.filteredInfo[c.key] || null, - sortOrder: - state.sortedInfo.columnKey === c.key && state.sortedInfo.order, - title: headerItem(c), - ellipsis: true, - width: c.width ?? 100, - onHeaderCell: (column) => ({ - width: column.width, - onResize: handleResize(index), - }), + const handleResize = + (index) => + (e, {size}) => { + const nextColumns = [...columns]; + nextColumns[index] = { + ...nextColumns[index], + width: size.width, + }; + setColumns(nextColumns); }; - })} - rowKey="id" - loading={loading} - dataSource={dataSource} - scroll={{ x: 1000 }} - onChange={handleTableChange} - /> - - - ); + + + const headerItem = (col) => { + const menu = { + onClick: removeColumn, + items: [ + { + key: col.key, + label: t("production.actions.removecolumn"), + }, + ] + } + + return ( + + {col.title} + + ) + }; + + const dataSource = + searchText === "" + ? data + : data.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.status || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.ins_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ); + + // const handleSelectRecord = (record) => { + // if (selected !== record.id) { + // setSelected(record.id); + // } else { + // setSelected(null); + // } + // }; + + if (!!!columns) return
    No columns found.
    ; + + const totalHrs = data + .reduce( + (acc, val) => + acc + + (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0) + + (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), + 0 + ) + .toFixed(1); + const totalLAB = data + .reduce( + (acc, val) => acc + (val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0), + 0 + ) + .toFixed(1); + const totalLAR = data + .reduce( + (acc, val) => acc + (val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0), + 0 + ) + .toFixed(1); + return ( +
    + + + + + + + } + extra={ + + + + + + + + setSearchText(e.target.value)} + placeholder={t("general.labels.search")} + value={searchText} + /> + + + } + /> + + +
    { + if (!bodyshop.md_ro_statuses.production_colors) return null; + + const color = bodyshop.md_ro_statuses.production_colors.find( + (x) => x.status === record.status + ); + + if (!color) { + if (index % 2 === 0) + return { + style: { + backgroundColor: `rgb(236, 236, 236)`, + }, + }; + + return null; + } + + return { + className: "rowWithColor", + style: { + "--bgColor": `rgb(${color.color.r},${color.color.g},${color.color.b},${color.color.a})`, + }, + }; + }, + })} + components={{ + header: { + cell: ResizeableTitle, + }, + }} + columns={columns.map((c, index) => { + return { + ...c, + filteredValue: state.filteredInfo[c.key] || null, + sortOrder: + state.sortedInfo.columnKey === c.key && state.sortedInfo.order, + title: headerItem(c), + ellipsis: true, + width: c.width ?? 100, + onHeaderCell: (column) => ({ + width: column.width, + onResize: handleResize(index), + }), + }; + })} + rowKey="id" + loading={loading} + dataSource={dataSource} + scroll={{x: 1000}} + onChange={handleTableChange} + /> + + + ); } export default connect(mapStateToProps, null)(ProductionListTable); diff --git a/client/src/components/production-list-table/production-list-table.container.jsx b/client/src/components/production-list-table/production-list-table.container.jsx index 6697137cb..af856c1b8 100644 --- a/client/src/components/production-list-table/production-list-table.container.jsx +++ b/client/src/components/production-list-table/production-list-table.container.jsx @@ -1,74 +1,74 @@ -import { useApolloClient, useQuery, useSubscription } from "@apollo/client"; -import React, { useEffect, useState } from "react"; +import {useApolloClient, useQuery, useSubscription} from "@apollo/client"; +import React, {useEffect, useState} from "react"; import { - QUERY_EXACT_JOBS_IN_PRODUCTION, - QUERY_EXACT_JOB_IN_PRODUCTION, - QUERY_JOBS_IN_PRODUCTION, - SUBSCRIPTION_JOBS_IN_PRODUCTION, + QUERY_EXACT_JOB_IN_PRODUCTION, + QUERY_EXACT_JOBS_IN_PRODUCTION, + QUERY_JOBS_IN_PRODUCTION, + SUBSCRIPTION_JOBS_IN_PRODUCTION, } from "../../graphql/jobs.queries"; import ProductionListTable from "./production-list-table.component"; import _ from "lodash"; export default function ProductionListTableContainer() { - const { refetch, loading, data } = useQuery(QUERY_JOBS_IN_PRODUCTION, { - pollInterval: 3600000, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const client = useApolloClient(); - const [joblist, setJoblist] = useState([]); - const { data: updatedJobs } = useSubscription( - SUBSCRIPTION_JOBS_IN_PRODUCTION - ); - - useEffect(() => { - if (!(data && data.jobs)) return; - setJoblist( - data.jobs.map((j) => { - return { id: j.id, updated_at: j.updated_at }; - }) - ); - }, [data]); - - useEffect(() => { - if (!updatedJobs || joblist.length === 0) return; - - const jobDiff = _.differenceWith( - joblist, - updatedJobs.jobs, - (a, b) => a.id === b.id && a.updated_at === b.updated_at + const {refetch, loading, data} = useQuery(QUERY_JOBS_IN_PRODUCTION, { + pollInterval: 3600000, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const client = useApolloClient(); + const [joblist, setJoblist] = useState([]); + const {data: updatedJobs} = useSubscription( + SUBSCRIPTION_JOBS_IN_PRODUCTION ); - if (jobDiff.length > 1) { - getUpdatedJobsData(jobDiff.map((j) => j.id)); - } else if (jobDiff.length === 1) { - jobDiff.forEach((job) => { - getUpdatedJobData(job.id); - }); - } + useEffect(() => { + if (!(data && data.jobs)) return; + setJoblist( + data.jobs.map((j) => { + return {id: j.id, updated_at: j.updated_at}; + }) + ); + }, [data]); - setJoblist(updatedJobs.jobs); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [updatedJobs]); + useEffect(() => { + if (!updatedJobs || joblist.length === 0) return; - const getUpdatedJobData = async (jobId) => { - client.query({ - query: QUERY_EXACT_JOB_IN_PRODUCTION, - variables: { id: jobId }, - }); - }; - const getUpdatedJobsData = async (jobIds) => { - client.query({ - query: QUERY_EXACT_JOBS_IN_PRODUCTION, - variables: { ids: jobIds }, - }); - }; + const jobDiff = _.differenceWith( + joblist, + updatedJobs.jobs, + (a, b) => a.id === b.id && a.updated_at === b.updated_at + ); - return ( - - ); + if (jobDiff.length > 1) { + getUpdatedJobsData(jobDiff.map((j) => j.id)); + } else if (jobDiff.length === 1) { + jobDiff.forEach((job) => { + getUpdatedJobData(job.id); + }); + } + + setJoblist(updatedJobs.jobs); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [updatedJobs]); + + const getUpdatedJobData = async (jobId) => { + client.query({ + query: QUERY_EXACT_JOB_IN_PRODUCTION, + variables: {id: jobId}, + }); + }; + const getUpdatedJobsData = async (jobIds) => { + client.query({ + query: QUERY_EXACT_JOBS_IN_PRODUCTION, + variables: {ids: jobIds}, + }); + }; + + return ( + + ); } diff --git a/client/src/components/production-list-table/production-list-table.resizeable.component.jsx b/client/src/components/production-list-table/production-list-table.resizeable.component.jsx index 618e9e8cd..f4bc60a84 100644 --- a/client/src/components/production-list-table/production-list-table.resizeable.component.jsx +++ b/client/src/components/production-list-table/production-list-table.resizeable.component.jsx @@ -1,29 +1,29 @@ import React from "react"; -import { Resizable } from "react-resizable"; +import {Resizable} from "react-resizable"; export default function ResizableComponent(props) { - const { onResize, width, ...restProps } = props; + const {onResize, width, ...restProps} = props; - if (!width) { - return - - - {t("user.actions.updateprofile")} - - } - > - - - - - - - - - - - - - - - {t("user.actions.changepassword")} - - } - > - - - } - type="password" - placeholder={t("general.labels.password")} - /> - - ({ - validator(rule, value) { - if (!value || getFieldValue("password") === value) { - return Promise.resolve(); - } - return Promise.reject( - t("general.labels.passwordsdonotmatch") - ); - }, - }), - ]} - > - } - type="password" - placeholder={t("general.labels.password")} - /> - - - - - - - ); + return ( + <> + + + + {t("user.actions.updateprofile")} + + } + > + + + + + + + + + + + + + + + {t("user.actions.changepassword")} + + } + > + + + } + type="password" + placeholder={t("general.labels.password")} + /> + + ({ + validator(rule, value) { + if (!value || getFieldValue("password") === value) { + return Promise.resolve(); + } + return Promise.reject( + t("general.labels.passwordsdonotmatch") + ); + }, + }), + ]} + > + } + type="password" + placeholder={t("general.labels.password")} + /> + + + + + + + ); }); diff --git a/client/src/components/profile-shops/profile-shops.component.jsx b/client/src/components/profile-shops/profile-shops.component.jsx index 9360ed7ad..3afc52b8c 100644 --- a/client/src/components/profile-shops/profile-shops.component.jsx +++ b/client/src/components/profile-shops/profile-shops.component.jsx @@ -1,77 +1,78 @@ -import { Button, Card, Col, Input, Table, Typography } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {Button, Card, Col, Input, Table, Typography} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; + export default function ProfileShopsComponent({ - loading, - data, - updateActiveShop, -}) { - const { t } = useTranslation(); - const [search, setSearch] = useState(""); - const columns = [ - { - title: t("associations.fields.shopname"), - dataIndex: "shopname", - key: "shopname", - width: "25%", - render: (text, record) => {record.bodyshop.shopname}, - }, - { - title: t("associations.fields.active"), - dataIndex: "active", - key: "active", - width: "25%", - render: (text, record) => {record.active ? "Yes" : "No"}, - }, - { - title: t("associations.labels.actions"), - dataIndex: "actions", - key: "actions", - width: "25%", - render: (text, record) => ( - + loading, + data, + updateActiveShop, + }) { + const {t} = useTranslation(); + const [search, setSearch] = useState(""); + const columns = [ + { + title: t("associations.fields.shopname"), + dataIndex: "shopname", + key: "shopname", + width: "25%", + render: (text, record) => {record.bodyshop.shopname}, + }, + { + title: t("associations.fields.active"), + dataIndex: "active", + key: "active", + width: "25%", + render: (text, record) => {record.active ? "Yes" : "No"}, + }, + { + title: t("associations.labels.actions"), + dataIndex: "actions", + key: "actions", + width: "25%", + render: (text, record) => ( + {record.active ? null : ( - + )} - ), - }, - ]; + ), + }, + ]; - const filteredData = - search === "" - ? data - : data.filter((d) => - d.bodyshop.shopname.toLowerCase().includes(search.toLowerCase()) - ); + const filteredData = + search === "" + ? data + : data.filter((d) => + d.bodyshop.shopname.toLowerCase().includes(search.toLowerCase()) + ); - return ( - - - {t("profile.labels.activeshop")} - - } - extra={ - setSearch(e.target.value)} - allowClear - placeholder={t("general.labels.search")} - /> - } - > -
    ; - } + if (!width) { + return ; + } - return ( - { - e.stopPropagation(); - }} - /> - } - > - - - ); + return ( + { + e.stopPropagation(); + }} + /> + } + > + + + ); } diff --git a/client/src/components/production-remove-button/production-remove-button.component.jsx b/client/src/components/production-remove-button/production-remove-button.component.jsx index 3f7b0a896..15d7ad87f 100644 --- a/client/src/components/production-remove-button/production-remove-button.component.jsx +++ b/client/src/components/production-remove-button/production-remove-button.component.jsx @@ -1,44 +1,44 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; import queryString from "query-string"; -import { useHistory, useLocation } from "react-router-dom"; +import {useLocation, useNavigate} from "react-router-dom"; -export default function ProductionRemoveButton({ jobId }) { - const [removeJobFromProduction] = useMutation(UPDATE_JOB); - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const search = queryString.parse(useLocation().search); - const history = useHistory(); +export default function ProductionRemoveButton({jobId}) { + const [removeJobFromProduction] = useMutation(UPDATE_JOB); + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); - const handleRemoveFromProd = async () => { - logImEXEvent("production_remove_job"); - setLoading(true); - const result = await removeJobFromProduction({ - variables: { jobId: jobId, job: { inproduction: false } }, - }); + const handleRemoveFromProd = async () => { + logImEXEvent("production_remove_job"); + setLoading(true); + const result = await removeJobFromProduction({ + variables: {jobId: jobId, job: {inproduction: false}}, + }); - if (!!!result.errors) { - notification["success"]({ message: t("production.successes.removed") }); - delete search.selected; - history.push({ search: queryString.stringify(search) }); - } else { - notification["error"]({ - message: t("production.errors.removing", { - error: JSON.stringify(result.errors), - }), - }); - } + if (!!!result.errors) { + notification["success"]({message: t("production.successes.removed")}); + delete search.selected; + history({search: queryString.stringify(search)}); + } else { + notification["error"]({ + message: t("production.errors.removing", { + error: JSON.stringify(result.errors), + }), + }); + } - setLoading(false); - }; + setLoading(false); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/production-sublets-manage/production-sublets-manage.component.jsx b/client/src/components/production-sublets-manage/production-sublets-manage.component.jsx index 9a7e8e6bc..ae44f2244 100644 --- a/client/src/components/production-sublets-manage/production-sublets-manage.component.jsx +++ b/client/src/components/production-sublets-manage/production-sublets-manage.component.jsx @@ -1,106 +1,107 @@ -import { CheckCircleFilled, EyeInvisibleFilled } from "@ant-design/icons"; -import { Button, List, notification, Popover } from "antd"; -import React, { useMemo, useState } from "react"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { UPDATE_JOB_LINE_SUBLET } from "../../graphql/jobs-lines.queries"; -export default function ProductionSubletsManageComponent({ subletJobLines }) { - const { t } = useTranslation(); - const [updateJobLine] = useMutation(UPDATE_JOB_LINE_SUBLET); - const [loading, setLoading] = useState(false); - const subletCount = useMemo(() => { - return { - total: subletJobLines.filter((s) => !s.sublet_ignored).length, - outstanding: subletJobLines.filter( - (s) => !s.sublet_ignored && !s.sublet_completed - ).length, +import {CheckCircleFilled, EyeInvisibleFilled} from "@ant-design/icons"; +import {Button, List, notification, Popover} from "antd"; +import React, {useMemo, useState} from "react"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {UPDATE_JOB_LINE_SUBLET} from "../../graphql/jobs-lines.queries"; + +export default function ProductionSubletsManageComponent({subletJobLines}) { + const {t} = useTranslation(); + const [updateJobLine] = useMutation(UPDATE_JOB_LINE_SUBLET); + const [loading, setLoading] = useState(false); + const subletCount = useMemo(() => { + return { + total: subletJobLines.filter((s) => !s.sublet_ignored).length, + outstanding: subletJobLines.filter( + (s) => !s.sublet_ignored && !s.sublet_completed + ).length, + }; + }, [subletJobLines]); + + const handleSubletMark = async (sublet, action) => { + setLoading(true); + + const result = await updateJobLine({ + variables: { + jobId: sublet.jobid, + now: new Date(), + lineId: sublet.id, + line: { + sublet_completed: + action === "complete" ? !sublet.sublet_completed : false, + sublet_ignored: action === "ignore" ? !sublet.sublet_ignored : false, + }, + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("joblines.errors.updating", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("joblines.successes.updated"), + }); + } + setLoading(false); }; - }, [subletJobLines]); - const handleSubletMark = async (sublet, action) => { - setLoading(true); + const popContent = ( +
    + e.stopPropagation()} + dataSource={subletJobLines} + renderItem={(s) => ( + { + e.stopPropagation(); + handleSubletMark(s, "complete"); + }} + type={s.sublet_completed ? "primary" : "ghost"} + > + + , + , + ]} + > + + + )} + /> +
    + ); - const result = await updateJobLine({ - variables: { - jobId: sublet.jobid, - now: new Date(), - lineId: sublet.id, - line: { - sublet_completed: - action === "complete" ? !sublet.sublet_completed : false, - sublet_ignored: action === "ignore" ? !sublet.sublet_ignored : false, - }, - }, - }); - - if (!!result.errors) { - notification["error"]({ - message: t("joblines.errors.updating", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("joblines.successes.updated"), - }); - } - setLoading(false); - }; - - const popContent = ( -
    - e.stopPropagation()} - dataSource={subletJobLines} - renderItem={(s) => ( - { - e.stopPropagation(); - handleSubletMark(s, "complete"); - }} - type={s.sublet_completed ? "primary" : "ghost"} - > - - , - , - ]} - > - - - )} - /> -
    - ); - - return ( - - 0 ? "tomato" : "" }}>{`${ - subletCount.total - subletCount.outstanding + return ( + + 0 ? "tomato" : ""}}>{`${ + subletCount.total - subletCount.outstanding } / ${subletCount.total}`} - - ); + + ); } diff --git a/client/src/components/profile-my/profile-my.component.jsx b/client/src/components/profile-my/profile-my.component.jsx index 1d4c8633e..6ec7d4038 100644 --- a/client/src/components/profile-my/profile-my.component.jsx +++ b/client/src/components/profile-my/profile-my.component.jsx @@ -1,146 +1,143 @@ -import { Button, Card, Col, Form, Input, notification } from "antd"; -import { LockOutlined } from "@ant-design/icons"; +import {Button, Card, Col, Form, Input, notification} from "antd"; +import {LockOutlined} from "@ant-design/icons"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { updateUserDetails } from "../../redux/user/user.actions"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; -import { - logImEXEvent, - updateCurrentPassword, -} from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {updateUserDetails} from "../../redux/user/user.actions"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; +import {logImEXEvent, updateCurrentPassword,} from "../../firebase/firebase.utils"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - updateUserDetails: (userDetails) => dispatch(updateUserDetails(userDetails)), + updateUserDetails: (userDetails) => dispatch(updateUserDetails(userDetails)), }); export default connect( - mapStateToProps, - mapDispatchToProps -)(function ProfileMyComponent({ currentUser, updateUserDetails }) { - const { t } = useTranslation(); + mapStateToProps, + mapDispatchToProps +)(function ProfileMyComponent({currentUser, updateUserDetails}) { + const {t} = useTranslation(); - const handleFinish = (values) => { - logImEXEvent("profile_update"); + const handleFinish = (values) => { + logImEXEvent("profile_update"); - updateUserDetails({ - displayName: values.displayName, - photoURL: values.photoURL, - }); - }; + updateUserDetails({ + displayName: values.displayName, + photoURL: values.photoURL, + }); + }; - const handleChangePassword = async ({ password }) => { - logImEXEvent("password_update"); - try { - await updateCurrentPassword(password); - notification.success({ - message: t("user.successess.passwordchanged"), - }); - } catch (error) { - notification.error({ - message: error.message, - }); - } - }; + const handleChangePassword = async ({password}) => { + logImEXEvent("password_update"); + try { + await updateCurrentPassword(password); + notification.success({ + message: t("user.successess.passwordchanged"), + }); + } catch (error) { + notification.error({ + message: error.message, + }); + } + }; - return ( - <> -
    - - - ); + return ( + + + {t("profile.labels.activeshop")} + + } + extra={ + setSearch(e.target.value)} + allowClear + placeholder={t("general.labels.search")} + /> + } + > +
    + + + ); } diff --git a/client/src/components/profile-shops/profile-shops.container.jsx b/client/src/components/profile-shops/profile-shops.container.jsx index 41bcf010f..7e5556fb0 100644 --- a/client/src/components/profile-shops/profile-shops.container.jsx +++ b/client/src/components/profile-shops/profile-shops.container.jsx @@ -1,77 +1,71 @@ -import { useMutation, useQuery } from "@apollo/client"; +import {useMutation, useQuery} from "@apollo/client"; import React from "react"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - QUERY_ALL_ASSOCIATIONS, - UPDATE_ACTIVE_ASSOCIATION, -} from "../../graphql/associations.queries"; +import {logImEXEvent, messaging} from "../../firebase/firebase.utils"; +import {QUERY_ALL_ASSOCIATIONS, UPDATE_ACTIVE_ASSOCIATION,} from "../../graphql/associations.queries"; import AlertComponent from "../alert/alert.component"; import ProfileShopsComponent from "./profile-shops.component"; import axios from "axios"; -import { messaging } from "../../firebase/firebase.utils"; -import { getToken } from "firebase/messaging"; +import {getToken} from "firebase/messaging"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProfileShopsContainer); -export function ProfileShopsContainer({ bodyshop, currentUser }) { - const { loading, error, data } = useQuery(QUERY_ALL_ASSOCIATIONS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - email: currentUser.email, - }, - skip: !currentUser, - }); - const [updateActiveAssociation] = useMutation(UPDATE_ACTIVE_ASSOCIATION); - - const updateActiveShop = async (newActiveAssocId) => { - logImEXEvent("profile_change_active_shop"); - - try { - const fcm_tokens = await getToken(messaging); - - await axios.post("/notifications/unsubscribe", { - fcm_tokens, - imexshopid: bodyshop.imexshopid, - type: "messaging", - }); - } catch (error) { - console.log("No FCM token. Skipping unsubscribe."); - } - - await updateActiveAssociation({ - variables: { - newActiveAssocId: newActiveAssocId, - }, +export function ProfileShopsContainer({bodyshop, currentUser}) { + const {loading, error, data} = useQuery(QUERY_ALL_ASSOCIATIONS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + email: currentUser.email, + }, + skip: !currentUser, }); + const [updateActiveAssociation] = useMutation(UPDATE_ACTIVE_ASSOCIATION); - //Force window refresh. + const updateActiveShop = async (newActiveAssocId) => { + logImEXEvent("profile_change_active_shop"); - window.location.reload(); - }; + try { + const fcm_tokens = await getToken(messaging); - if (error) return ; - return ( - - ); + await axios.post("/notifications/unsubscribe", { + fcm_tokens, + imexshopid: bodyshop.imexshopid, + type: "messaging", + }); + } catch (error) { + console.log("No FCM token. Skipping unsubscribe."); + } + + await updateActiveAssociation({ + variables: { + newActiveAssocId: newActiveAssocId, + }, + }); + + //Force window refresh. + + window.location.reload(); + }; + + if (error) return ; + return ( + + ); } diff --git a/client/src/components/qbo-authorize/qbo-authorize.component.jsx b/client/src/components/qbo-authorize/qbo-authorize.component.jsx index 8d333a989..3c333f436 100644 --- a/client/src/components/qbo-authorize/qbo-authorize.component.jsx +++ b/client/src/components/qbo-authorize/qbo-authorize.component.jsx @@ -1,59 +1,59 @@ -import { Space } from "antd"; +import {Space} from "antd"; import Axios from "axios"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useCookies } from "react-cookie"; -import { useHistory, useLocation } from "react-router-dom"; +import React, {useEffect} from "react"; +import {useCookies} from "react-cookie"; +import {useLocation, useNavigate} from "react-router-dom"; import QboSignIn from "../../assets/qbo/C2QB_green_btn_med_default.svg"; export default function QboAuthorizeComponent() { - const location = useLocation(); - const history = useHistory(); - const [, setCookie] = useCookies(["access_token", "refresh_token"]); + const location = useLocation(); + const history = useNavigate(); + const [setCookie] = useCookies(["access_token", "refresh_token"]); - const handleQbSignIn = async () => { - const result = await Axios.post("/qbo/authorize"); - window.location.href = result.data; - }; - const qs = queryString.parse(location.search); + const handleQbSignIn = async () => { + const result = await Axios.post("/qbo/authorize"); + window.location.href = result.data; + }; + const qs = queryString.parse(location.search); - const { error } = qs; + const {error} = qs; - useEffect(() => { - const { code, state, realmId } = qs; - const hasBeenCalledBack = code && realmId && state; + useEffect(() => { + const {code, state, realmId} = qs; + const hasBeenCalledBack = code && realmId && state; - if (hasBeenCalledBack) { - // setCookie("qbo_code", code, { path: "/" }); - // setCookie("qbo_state", state, { path: "/" }); + if (hasBeenCalledBack) { + // setCookie("qbo_code", code, { path: "/" }); + // setCookie("qbo_state", state, { path: "/" }); - // let expires = new Date(); - // expires.setTime(expires.getTime() + 8726400 * 1000); + // let expires = new Date(); + // expires.setTime(expires.getTime() + 8726400 * 1000); - // setCookie("qbo_realmId", realmId, { - // path: "/", - // expires, + // setCookie("qbo_realmId", realmId, { + // path: "/", + // expires, - // ...(process.env.NODE_ENV !== "development" - // ? { domain: `.${window.location.host}` } - // : {}), - // }); + // ...(process.env.NODE_ENV !== "development" + // ? { domain: `.${window.location.host}` } + // : {}), + // }); - history.push({ pathname: `/manage/accounting/receivables` }); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [qs, location, setCookie]); + history({pathname: `/manage/accounting/receivables`}); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [qs, location, setCookie]); - return ( - - Sign In to QuickBooks Online + return ( + + Sign In to QuickBooks Online - {error && JSON.parse(decodeURIComponent(error)).error_description} - - ); + {error && JSON.parse(decodeURIComponent(error)).error_description} + + ); } diff --git a/client/src/components/rbac-wrapper/rbac-defaults.js b/client/src/components/rbac-wrapper/rbac-defaults.js index a01dd54c2..2d193c484 100644 --- a/client/src/components/rbac-wrapper/rbac-defaults.js +++ b/client/src/components/rbac-wrapper/rbac-defaults.js @@ -1,76 +1,76 @@ const ret = { - "accounting:payables": 1, - "accounting:payments": 1, - "accounting:receivables": 1, - "accounting:exportlogs": 3, + "accounting:payables": 1, + "accounting:payments": 1, + "accounting:receivables": 1, + "accounting:exportlogs": 3, - "csi:page": 6, - "csi:export": 5, + "csi:page": 6, + "csi:export": 5, - "contracts:create": 2, - "contracts:detail": 2, - "contracts:list": 2, + "contracts:create": 2, + "contracts:detail": 2, + "contracts:list": 2, - "courtesycar:create": 2, - "courtesycar:detail": 2, - "courtesycar:list": 2, + "courtesycar:create": 2, + "courtesycar:detail": 2, + "courtesycar:list": 2, - "jobs:admin": 5, - "jobs:list-active": 1, - "jobs:list-all": 2, - "jobs:available-list": 2, - "jobs:create": 1, - "jobs:intake": 1, - "jobs:close": 5, - "jobs:detail": 1, - "jobs:partsqueue": 4, - "jobs:checklist-view": 2, - "jobs:list-ready": 1, - "jobs:void": 5, + "jobs:admin": 5, + "jobs:list-active": 1, + "jobs:list-all": 2, + "jobs:available-list": 2, + "jobs:create": 1, + "jobs:intake": 1, + "jobs:close": 5, + "jobs:detail": 1, + "jobs:partsqueue": 4, + "jobs:checklist-view": 2, + "jobs:list-ready": 1, + "jobs:void": 5, - "bills:enter": 2, - "bills:view": 2, - "bills:list": 2, - "bills:delete": 3, - "bills:reexport": 3, + "bills:enter": 2, + "bills:view": 2, + "bills:list": 2, + "bills:delete": 3, + "bills:reexport": 3, - "employees:page": 5, + "employees:page": 5, - "owners:list": 2, - "owners:detail": 3, + "owners:list": 2, + "owners:detail": 3, - "payments:enter": 3, - "payments:list": 3, + "payments:enter": 3, + "payments:list": 3, - "phonebook:view": 1, - "phonebook:edit": 2, + "phonebook:view": 1, + "phonebook:edit": 2, - "production:board": 1, - "production:list": 1, + "production:board": 1, + "production:list": 1, - "schedule:view": 2, + "schedule:view": 2, - "scoreboard:view": 3, + "scoreboard:view": 3, - "shiftclock:view": 2, + "shiftclock:view": 2, - "shop:config": 4, - "shop:dashboard": 3, - "shop:rbac": 5, - "shop:reportcenter": 2, - "shop:templates": 4, - "shop:vendors": 2, + "shop:config": 4, + "shop:dashboard": 3, + "shop:rbac": 5, + "shop:reportcenter": 2, + "shop:templates": 4, + "shop:vendors": 2, - "temporarydocs:view": 2, + "temporarydocs:view": 2, - "timetickets:enter": 3, - "timetickets:list": 3, - "timetickets:edit": 4, - "timetickets:shiftedit": 5, + "timetickets:enter": 3, + "timetickets:list": 3, + "timetickets:edit": 4, + "timetickets:shiftedit": 5, - "users:editaccess": 4, + "users:editaccess": 4, - "inventory:list": 1, - "inventory:delete": 2, + "inventory:list": 1, + "inventory:delete": 2, }; export default ret; diff --git a/client/src/components/rbac-wrapper/rbac-wrapper.component.jsx b/client/src/components/rbac-wrapper/rbac-wrapper.component.jsx index 3722d3d7c..768093aa4 100644 --- a/client/src/components/rbac-wrapper/rbac-wrapper.component.jsx +++ b/client/src/components/rbac-wrapper/rbac-wrapper.component.jsx @@ -1,66 +1,63 @@ import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - selectAuthLevel, - selectBodyshop, -} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectAuthLevel, selectBodyshop,} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import rbacDefaults from "./rbac-defaults"; const mapStateToProps = createStructuredSelector({ - authLevel: selectAuthLevel, - bodyshop: selectBodyshop, + authLevel: selectAuthLevel, + bodyshop: selectBodyshop, }); function RbacWrapper({ - authLevel, - bodyshop, - requiredAuthLevel, - noauth, - children, - action, - dispatch, - ...restProps -}) { - const { t } = useTranslation(); + authLevel, + bodyshop, + requiredAuthLevel, + noauth, + children, + action, + dispatch, + ...restProps + }) { + const {t} = useTranslation(); - if ( - (requiredAuthLevel && requiredAuthLevel <= authLevel) || - ((bodyshop.md_rbac && bodyshop.md_rbac[action]) || rbacDefaults[action]) <= - authLevel || - (bodyshop.md_rbac && - !bodyshop.md_rbac[action] && - rbacDefaults[action] <= authLevel) - ) - return children; - //return
    {React.cloneElement(children, restProps)}
    ; - - return ( - noauth || ( - + if ( + (requiredAuthLevel && requiredAuthLevel <= authLevel) || + ((bodyshop.md_rbac && bodyshop.md_rbac[action]) || rbacDefaults[action]) <= + authLevel || + (bodyshop.md_rbac && + !bodyshop.md_rbac[action] && + rbacDefaults[action] <= authLevel) ) - ); + return children; + //return
    {React.cloneElement(children, restProps)}
    ; + + return ( + noauth || ( + + ) + ); } export function HasRbacAccess({ - authLevel, - bodyshop, - requiredAuthLevel, - action, -}) { - return ( - (requiredAuthLevel && requiredAuthLevel <= authLevel) || - ((bodyshop.md_rbac && bodyshop.md_rbac[action]) || rbacDefaults[action]) <= - authLevel || - (bodyshop.md_rbac && - !bodyshop.md_rbac[action] && - rbacDefaults[action] <= authLevel) - ); + authLevel, + bodyshop, + requiredAuthLevel, + action, + }) { + return ( + (requiredAuthLevel && requiredAuthLevel <= authLevel) || + ((bodyshop.md_rbac && bodyshop.md_rbac[action]) || rbacDefaults[action]) <= + authLevel || + (bodyshop.md_rbac && + !bodyshop.md_rbac[action] && + rbacDefaults[action] <= authLevel) + ); } export default connect(mapStateToProps, null)(RbacWrapper); diff --git a/client/src/components/report-center-modal/report-center-modal.component.jsx b/client/src/components/report-center-modal/report-center-modal.component.jsx index a18fcfbf1..6d99f2254 100644 --- a/client/src/components/report-center-modal/report-center-modal.component.jsx +++ b/client/src/components/report-center-modal/report-center-modal.component.jsx @@ -1,330 +1,323 @@ -import { useLazyQuery } from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Button, - Card, - Col, - DatePicker, - Form, - Input, - Radio, - Row, - Typography, -} from "antd"; +import {useLazyQuery} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Card, Col, DatePicker, Form, Input, Radio, Row, Typography,} from "antd"; import _ from "lodash"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ACTIVE_EMPLOYEES } from "../../graphql/employees.queries"; -import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries"; -import { selectReportCenter } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ACTIVE_EMPLOYEES} from "../../graphql/employees.queries"; +import {QUERY_ALL_VENDORS} from "../../graphql/vendors.queries"; +import {selectReportCenter} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import DatePIckerRanges from "../../utils/DatePickerRanges"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; import EmployeeSearchSelect from "../employee-search-select/employee-search-select.component"; import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; import "./report-center-modal.styles.scss"; + const mapStateToProps = createStructuredSelector({ - reportCenterModal: selectReportCenter, - bodyshop: selectBodyshop, + reportCenterModal: selectReportCenter, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ReportCenterModalComponent); -export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) { - const [form] = Form.useForm(); - const [search, setSearch] = useState(""); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const Templates = TemplateList("report_center"); - const ReportsList = - Enhanced_Payroll.treatment === "on" - ? Object.keys(Templates) - .map((key) => { - return Templates[key]; - }) - .filter( - (temp) => - temp.enhanced_payroll === undefined || - temp.enhanced_payroll === true - ) - : Object.keys(Templates) - .map((key) => { - return Templates[key]; - }) - .filter( - (temp) => - temp.enhanced_payroll === undefined || - temp.enhanced_payroll === false - ); - const { visible } = reportCenterModal; - - const [callVendorQuery, { data: vendorData, called: vendorCalled }] = - useLazyQuery(QUERY_ALL_VENDORS, { - skip: !( - visible && - Templates[form.getFieldValue("key")] && - Templates[form.getFieldValue("key")].idtype - ), +export function ReportCenterModalComponent({reportCenterModal, bodyshop}) { + const [form] = Form.useForm(); + const [search, setSearch] = useState(""); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, }); - const [callEmployeeQuery, { data: employeeData, called: employeeCalled }] = - useLazyQuery(QUERY_ACTIVE_EMPLOYEES, { - skip: !( - visible && - Templates[form.getFieldValue("key")] && - Templates[form.getFieldValue("key")].idtype - ), - }); - const handleFinish = async (values) => { - setLoading(true); - const start = values.dates[0]; - const end = values.dates[1]; - const { id } = values; + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const Templates = TemplateList("report_center"); + const ReportsList = + Enhanced_Payroll.treatment === "on" + ? Object.keys(Templates) + .map((key) => { + return Templates[key]; + }) + .filter( + (temp) => + temp.enhanced_payroll === undefined || + temp.enhanced_payroll === true + ) + : Object.keys(Templates) + .map((key) => { + return Templates[key]; + }) + .filter( + (temp) => + temp.enhanced_payroll === undefined || + temp.enhanced_payroll === false + ); - await GenerateDocument( - { - name: values.key, - variables: { - ...(start - ? { start: moment(start).startOf("day").format("YYYY-MM-DD") } - : {}), - ...(end - ? { end: moment(end).endOf("day").format("YYYY-MM-DD") } - : {}), - ...(start ? { starttz: moment(start).startOf("day") } : {}), - ...(end ? { endtz: moment(end).endOf("day") } : {}), + const {open} = reportCenterModal; - ...(id ? { id: id } : {}), - }, - }, - { - to: values.to, - subject: Templates[values.key]?.subject, - }, - values.sendbyexcel === "excel" - ? "x" - : values.sendby === "email" - ? "e" - : "p", - id - ); - setLoading(false); - }; + const [callVendorQuery, {data: vendorData, called: vendorCalled}] = + useLazyQuery(QUERY_ALL_VENDORS, { + skip: !( + open && + Templates[form.getFieldValue("key")] && + Templates[form.getFieldValue("key")].idtype + ), + }); - const FilteredReportsList = - search !== "" - ? ReportsList.filter((r) => - r.title.toLowerCase().includes(search.toLowerCase()) - ) - : ReportsList; + const [callEmployeeQuery, {data: employeeData, called: employeeCalled}] = + useLazyQuery(QUERY_ACTIVE_EMPLOYEES, { + skip: !( + open && + Templates[form.getFieldValue("key")] && + Templates[form.getFieldValue("key")].idtype + ), + }); - //Group it, create cards, and then filter out. + const handleFinish = async (values) => { + setLoading(true); + const start = values.dates[0]; + const end = values.dates[1]; + const {id} = values; - const grouped = _.groupBy(FilteredReportsList, "group"); - - return ( -
    -
    - setSearch(e.target.value)} - value={search} - /> - - - {/* {Object.keys(Templates).map((key) => ( + { + to: values.to, + subject: Templates[values.key]?.subject, + }, + values.sendbyexcel === "excel" + ? "x" + : values.sendby === "email" + ? "e" + : "p", + id + ); + setLoading(false); + }; + + const FilteredReportsList = + search !== "" + ? ReportsList.filter((r) => + r.title.toLowerCase().includes(search.toLowerCase()) + ) + : ReportsList; + + //Group it, create cards, and then filter out. + + const grouped = _.groupBy(FilteredReportsList, "group"); + + return ( +
    + + setSearch(e.target.value)} + value={search} + /> + + + {/* {Object.keys(Templates).map((key) => ( {Templates[key].title} ))} */} - - {Object.keys(grouped).map((key) => ( -
    - + {Object.keys(grouped).map((key) => ( + + + + {t(`reportcenter.labels.groups.${key}`)} + +
      + {grouped[key].map((item) => ( +
    • + + {item.title} + +
    • + ))} +
    +
    + + ))} + + + + + {() => { + const key = form.getFieldValue("key"); + if (!key) return null; + //Kind of Id + const rangeFilter = Templates[key] && Templates[key].rangeFilter; + if (!rangeFilter) return null; + return ( +
    + {t("reportcenter.labels.filterson", { + object: rangeFilter.object, + field: rangeFilter.field, + })} +
    + ); }} - > - - {t(`reportcenter.labels.groups.${key}`)} - -
      - {grouped[key].map((item) => ( -
    • - - {item.title} - -
    • - ))} -
    - - - ))} - - -
    - - {() => { - const key = form.getFieldValue("key"); - if (!key) return null; - //Kind of Id - const rangeFilter = Templates[key] && Templates[key].rangeFilter; - if (!rangeFilter) return null; - return ( -
    - {t("reportcenter.labels.filterson", { - object: rangeFilter.object, - field: rangeFilter.field, - })} -
    - ); - }} -
    - - {() => { - const key = form.getFieldValue("key"); - const currentId = form.getFieldValue("id"); - if (!key) return null; - //Kind of Id - const idtype = Templates[key] && Templates[key].idtype; - if (!idtype && currentId) { - form.setFieldsValue({ id: null }); - return null; - } - if (!vendorCalled && idtype === "vendor") callVendorQuery(); - if (!employeeCalled && idtype === "employee") callEmployeeQuery(); - if (idtype === "vendor") - return ( - - - ); - if (idtype === "employee") - return ( - - + + {() => { + const key = form.getFieldValue("key"); + const currentId = form.getFieldValue("id"); + if (!key) return null; + //Kind of Id + const idtype = Templates[key] && Templates[key].idtype; + if (!idtype && currentId) { + form.setFieldsValue({id: null}); + return null; + } + if (!vendorCalled && idtype === "vendor") callVendorQuery(); + if (!employeeCalled && idtype === "employee") callEmployeeQuery(); + if (idtype === "vendor") + return ( + + + + ); + if (idtype === "employee") + return ( + + + + ); + else return null; + }} - ); - else return null; - }} - - - - - - {() => { - const key = form.getFieldValue("key"); - //Kind of Id - const reporttype = Templates[key] && Templates[key].reporttype; + + + + + {() => { + const key = form.getFieldValue("key"); + //Kind of Id + const reporttype = Templates[key] && Templates[key].reporttype; - if (reporttype === "excel") - return ( - - - {t("general.labels.excel")} - + if (reporttype === "excel") + return ( + + + {t("general.labels.excel")} + + + ); + if (reporttype !== "excel") + return ( + + + {t("general.labels.email")} + {t("general.labels.print")} + + + ); + }} - ); - if (reporttype !== "excel") - return ( - - - {t("general.labels.email")} - {t("general.labels.print")} - - - ); - }} - -
    - +
    + +
    +
    - - - ); + ); } diff --git a/client/src/components/report-center-modal/report-center-modal.container.jsx b/client/src/components/report-center-modal/report-center-modal.container.jsx index 84fe65560..6537c4964 100644 --- a/client/src/components/report-center-modal/report-center-modal.container.jsx +++ b/client/src/components/report-center-modal/report-center-modal.container.jsx @@ -1,47 +1,47 @@ -import { Modal } from "antd"; +import {Modal} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectReportCenter } from "../../redux/modals/modals.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectReportCenter} from "../../redux/modals/modals.selectors"; import RbacWrapperComponent from "../rbac-wrapper/rbac-wrapper.component"; import ReportCenterModalComponent from "./report-center-modal.component"; const mapStateToProps = createStructuredSelector({ - reportCenterModal: selectReportCenter, + reportCenterModal: selectReportCenter, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("reportCenter")), + toggleModalVisible: () => dispatch(toggleModalVisible("reportCenter")), }); export function ReportCenterModalContainer({ - reportCenterModal, - toggleModalVisible, -}) { - const { t } = useTranslation(); + reportCenterModal, + toggleModalVisible, + }) { + const {t} = useTranslation(); - const { visible } = reportCenterModal; + const {open} = reportCenterModal; - return ( - toggleModalVisible()} - onCancel={() => toggleModalVisible()} - cancelButtonProps={{ style: { display: "none" } }} - destroyOnClose - width="80%" - > - - - - - ); + return ( + toggleModalVisible()} + onCancel={() => toggleModalVisible()} + cancelButtonProps={{style: {display: "none"}}} + destroyOnClose + width="80%" + > + + + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ReportCenterModalContainer); diff --git a/client/src/components/report-center-modal/report-center-modal.styles.scss b/client/src/components/report-center-modal/report-center-modal.styles.scss index ccd2dcfee..8b9bc788a 100644 --- a/client/src/components/report-center-modal/report-center-modal.styles.scss +++ b/client/src/components/report-center-modal/report-center-modal.styles.scss @@ -2,8 +2,10 @@ .ant-radio-group { // display: block; } + .ant-radio-wrapper { display: block; + span { word-wrap: break-word; } diff --git a/client/src/components/schedule-ats-summary/schedule-ats-summary.component.jsx b/client/src/components/schedule-ats-summary/schedule-ats-summary.component.jsx index 6362e12e3..3b9d0c828 100644 --- a/client/src/components/schedule-ats-summary/schedule-ats-summary.component.jsx +++ b/client/src/components/schedule-ats-summary/schedule-ats-summary.component.jsx @@ -1,48 +1,50 @@ -import { Space } from "antd"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectScheduleLoad } from "../../redux/application/application.selectors"; +import {Space} from "antd"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectScheduleLoad} from "../../redux/application/application.selectors"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - scheduleLoad: selectScheduleLoad, + //currentUser: selectCurrentUser + scheduleLoad: selectScheduleLoad, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ScheduleAtsSummary({ scheduleLoad, appointments }) { - const { t } = useTranslation(); +export function ScheduleAtsSummary({scheduleLoad, appointments}) { + const {t} = useTranslation(); - const atsSummary = useMemo(() => { - let atsSummary = {}; - if (!appointments || appointments.length === 0) { - return {}; - } - appointments - .filter((a) => a.isintake) - .forEach((a) => { - if (!a.job.alt_transport) return; - if (!atsSummary[a.job.alt_transport]) { - atsSummary[a.job.alt_transport] = 1; - } else { - atsSummary[a.job.alt_transport] = atsSummary[a.job.alt_transport] + 1; + const atsSummary = useMemo(() => { + let atsSummary = {}; + if (!appointments || appointments.length === 0) { + return {}; } - }); - return atsSummary; - }, [appointments]); + appointments + .filter((a) => a.isintake) + .forEach((a) => { + if (!a.job.alt_transport) return; + if (!atsSummary[a.job.alt_transport]) { + atsSummary[a.job.alt_transport] = 1; + } else { + atsSummary[a.job.alt_transport] = atsSummary[a.job.alt_transport] + 1; + } + }); + return atsSummary; + }, [appointments]); - if (Object.keys(atsSummary).length > 0) - return ( - - {t("schedule.labels.atssummary")} - {Object.keys(atsSummary).map((key) => ( - {`${key}: ${atsSummary[key]}`} - ))} - - ); + if (Object.keys(atsSummary).length > 0) + return ( + + {t("schedule.labels.atssummary")} + {Object.keys(atsSummary).map((key) => ( + {`${key}: ${atsSummary[key]}`} + ))} + + ); - return null; + return null; } + export default connect(mapStateToProps, mapDispatchToProps)(ScheduleAtsSummary); diff --git a/client/src/components/schedule-block-day/schedule-block-day.component.jsx b/client/src/components/schedule-block-day/schedule-block-day.component.jsx index 548da1f9f..82149eb6e 100644 --- a/client/src/components/schedule-block-day/schedule-block-day.component.jsx +++ b/client/src/components/schedule-block-day/schedule-block-day.component.jsx @@ -1,74 +1,75 @@ -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu, notification } from "antd"; -import moment from "moment"; +import {useMutation} from "@apollo/client"; +import {Dropdown, notification} from "antd"; +import dayjs from "../../utils/day"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_APPOINTMENT_BLOCK } from "../../graphql/appointments.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_APPOINTMENT_BLOCK} from "../../graphql/appointments.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {logImEXEvent} from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); export function ScheduleBlockDay({ - date, - children, - refetch, - bodyshop, - alreadyBlocked, -}) { - const { t } = useTranslation(); - const [insertBlock] = useMutation(INSERT_APPOINTMENT_BLOCK); + date, + children, + refetch, + bodyshop, + alreadyBlocked, + }) { + const {t} = useTranslation(); + const [insertBlock] = useMutation(INSERT_APPOINTMENT_BLOCK); - const handleMenu = async (e) => { - e.domEvent.stopPropagation(); + const handleMenu = async (e) => { + e.domEvent.stopPropagation(); - if (e.key === "block") { - const blockAppt = { - title: t("appointments.labels.blocked"), - block: true, - isintake: false, - bodyshopid: bodyshop.id, - start: moment(date).startOf("day"), - end: moment(date).endOf("day"), - }; - logImEXEvent("dashboard_change_layout"); + if (e.key === "block") { + const blockAppt = { + title: t("appointments.labels.blocked"), + block: true, + isintake: false, + bodyshopid: bodyshop.id, + start: dayjs(date).startOf("day"), + end: dayjs(date).endOf("day"), + }; + logImEXEvent("dashboard_change_layout"); - const result = await insertBlock({ - variables: { app: [blockAppt] }, - }); + const result = await insertBlock({ + variables: {app: [blockAppt]}, + }); - if (!!result.errors) { - notification["error"]({ - message: t("appointments.errors.blocking", { - message: JSON.stringify(result.errors), - }), - }); - } + if (!!result.errors) { + notification["error"]({ + message: t("appointments.errors.blocking", { + message: JSON.stringify(result.errors), + }), + }); + } - if (!!refetch) refetch(); + if (!!refetch) refetch(); + } + }; + + const menu = { + items: [ + { + key: "block", + label: t("appointments.actions.block"), + }, + ], + onClick: handleMenu, } - }; - const menu = ( - - {t("appointments.actions.block")} - - ); - - return ( - - {children} - - ); + return ( + + {children} + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ScheduleBlockDay); diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js index 82d1c9281..9d827b75a 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js @@ -1,92 +1,86 @@ -import { RadarChartOutlined } from "@ant-design/icons"; -import { Popover, Space } from "antd"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { - Legend, - PolarAngleAxis, - PolarGrid, - PolarRadiusAxis, - Radar, - RadarChart, - Tooltip, -} from "recharts"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {RadarChartOutlined} from "@ant-design/icons"; +import {Popover, Space} from "antd"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Legend, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart, Tooltip,} from "recharts"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ScheduleCalendarHeaderGraph({ bodyshop, loadData }) { - const { ssbuckets } = bodyshop; - const { t } = useTranslation(); - const data = useMemo(() => { - return ( - (loadData && - loadData.expectedLoad && - Object.keys(loadData.expectedLoad).map((key) => { - const metadataBucket = ssbuckets.filter((b) => b.id === key)[0]; +export function ScheduleCalendarHeaderGraph({bodyshop, loadData}) { + const {ssbuckets} = bodyshop; + const {t} = useTranslation(); + const data = useMemo(() => { + return ( + (loadData && + loadData.expectedLoad && + Object.keys(loadData.expectedLoad).map((key) => { + const metadataBucket = ssbuckets.filter((b) => b.id === key)[0]; - return { - bucket: loadData.expectedLoad[key].label, - current: loadData.expectedLoad[key].count, - target: metadataBucket && metadataBucket.target, - }; - })) || - [] + return { + bucket: loadData.expectedLoad[key].label, + current: loadData.expectedLoad[key].count, + target: metadataBucket && metadataBucket.target, + }; + })) || + [] + ); + }, [loadData, ssbuckets]); + + const popContent = ( +
    + + {t("appointments.labels.expectedprodhrs")} + {loadData?.expectedHours?.toFixed(1)} + {t("appointments.labels.expectedjobs")} + {loadData?.expectedJobCount} + + + + + + + + + + +
    ); - }, [loadData, ssbuckets]); - const popContent = ( -
    - - {t("appointments.labels.expectedprodhrs")} - {loadData?.expectedHours?.toFixed(1)} - {t("appointments.labels.expectedjobs")} - {loadData?.expectedJobCount} - - - - - - - - - - -
    - ); - - return ( - - - - ); + return ( + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleCalendarHeaderGraph); diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js index 732bcc2c2..e3bff1a39 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js @@ -1,221 +1,221 @@ import Icon from "@ant-design/icons"; -import { Popover } from "antd"; +import {Popover} from "antd"; import _ from "lodash"; -import moment from "moment"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { MdFileDownload, MdFileUpload } from "react-icons/md"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { - selectScheduleLoad, - selectScheduleLoadCalculating, -} from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import dayjs from "../../utils/day"; + +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {MdFileDownload, MdFileUpload} from "react-icons/md"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectScheduleLoad, selectScheduleLoadCalculating,} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component"; import ScheduleCalendarHeaderGraph from "./schedule-calendar-header-graph.component"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - load: selectScheduleLoad, - calculating: selectScheduleLoadCalculating, + bodyshop: selectBodyshop, + load: selectScheduleLoad, + calculating: selectScheduleLoadCalculating, }); const mapDispatchToProps = (dispatch) => ({}); export function ScheduleCalendarHeaderComponent({ - bodyshop, - label, - refetch, - date, - load, - calculating, - events, - ...otherProps -}) { - const ATSToday = useMemo(() => { - if (!events) return []; - return _.groupBy( - events.filter( - (e) => - !e.vacation && - e.isintake && - moment(date).isSame(moment(e.start), "day") - ), - "job.alt_transport" - ); - }, [events, date]); + bodyshop, + label, + refetch, + date, + load, + calculating, + events, + ...otherProps + }) { + const ATSToday = useMemo(() => { + if (!events) return []; + return _.groupBy( + events.filter( + (e) => + !e.vacation && + e.isintake && + dayjs(date).isSame(dayjs(e.start), "day") + ), + "job.alt_transport" + ); + }, [events, date]); - const isDayBlocked = useMemo(() => { - if (!events) return []; - return ( - events && - events.filter( - (e) => moment(date).isSame(moment(e.start), "day") && e.block - ) - ); - }, [events, date]); + const isDayBlocked = useMemo(() => { + if (!events) return []; + return ( + events && + events.filter( + (e) => dayjs(date).isSame(dayjs(e.start), "day") && e.block + ) + ); + }, [events, date]); - const { t } = useTranslation(); - const loadData = load[date.toISOString().substr(0, 10)]; + const {t} = useTranslation(); + const loadData = load[date.toISOString().substr(0, 10)]; - const jobsOutPopup = () => ( -
    e.stopPropagation()}> -
    - - {loadData && loadData.allJobsOut ? ( - loadData.allJobsOut.map((j) => ( - - - - - - - )) - ) : ( - - - - )} - -
    - {j.ro_number} - - - - {`(${( - j.labhrs.aggregate.sum.mod_lb_hrs + - j.larhrs.aggregate.sum.mod_lb_hrs - ).toFixed(1)} ${t("general.labels.hours")})`} - - - {j.scheduled_completion} - -
    {t("appointments.labels.nocompletingjobs")}
    - - ); - - const jobsInPopup = () => ( -
    e.stopPropagation()}> - - - {loadData && loadData.allJobsIn ? ( - loadData.allJobsIn.map((j) => ( - - - - - - - )) - ) : ( - - - - )} - -
    - {j.ro_number} - {j.status} - - - - {`(${( - j.labhrs.aggregate.sum.mod_lb_hrs + - j.larhrs.aggregate.sum.mod_lb_hrs - ).toFixed(1)} ${t("general.labels.hours")})`} - - {j.scheduled_in} -
    {t("appointments.labels.noarrivingjobs")}
    -
    - ); - - const LoadComponent = loadData ? ( -
    -
    - - - {(loadData.allHoursIn || 0) && loadData.allHoursIn.toFixed(2)} - - - - {(loadData.allHoursOut || 0) && loadData.allHoursOut.toFixed(2)} - - -
    -
    -
      - {Object.keys(ATSToday).map((key, idx) => ( -
    • {`${ - key === "null" || key === "undefined" ? "N/A" : key - }: ${ATSToday[key].length}`}
    • - ))} -
    -
    -
    - ) : null; - - const isShopOpen = (date) => { - let day; - switch (moment(date).day()) { - case 0: - day = "sunday"; - break; - case 1: - day = "monday"; - break; - case 2: - day = "tuesday"; - break; - case 3: - day = "wednesday"; - break; - case 4: - day = "thursday"; - break; - case 5: - day = "friday"; - break; - case 6: - day = "saturday"; - break; - default: - day = "sunday"; - break; - } - - return bodyshop.workingdays[day]; - }; - - return ( -
    - 0} - date={date} - refetch={refetch} - > -
    - {label} - {calculating ? : LoadComponent} + const jobsOutPopup = () => ( +
    e.stopPropagation()}> + + + {loadData && loadData.allJobsOut ? ( + loadData.allJobsOut.map((j) => ( + + + + + + + )) + ) : ( + + + + )} + +
    + {j.ro_number} + + + + {`(${( + j.labhrs.aggregate.sum.mod_lb_hrs + + j.larhrs.aggregate.sum.mod_lb_hrs + ).toFixed(1)} ${t("general.labels.hours")})`} + + + {j.scheduled_completion} + +
    {t("appointments.labels.nocompletingjobs")}
    - -
    - ); + ); + + const jobsInPopup = () => ( +
    e.stopPropagation()}> + + + {loadData && loadData.allJobsIn ? ( + loadData.allJobsIn.map((j) => ( + + + + + + + )) + ) : ( + + + + )} + +
    + {j.ro_number} + {j.status} + + + + {`(${( + j.labhrs.aggregate.sum.mod_lb_hrs + + j.larhrs.aggregate.sum.mod_lb_hrs + ).toFixed(1)} ${t("general.labels.hours")})`} + + {j.scheduled_in} +
    {t("appointments.labels.noarrivingjobs")}
    +
    + ); + + const LoadComponent = loadData ? ( +
    +
    + + + {(loadData.allHoursIn || 0) && loadData.allHoursIn.toFixed(2)} + + + + {(loadData.allHoursOut || 0) && loadData.allHoursOut.toFixed(2)} + + +
    +
    +
      + {Object.keys(ATSToday).map((key, idx) => ( +
    • {`${ + key === "null" || key === "undefined" ? "N/A" : key + }: ${ATSToday[key].length}`}
    • + ))} +
    +
    +
    + ) : null; + + const isShopOpen = (date) => { + let day; + switch (dayjs(date).day()) { + case 0: + day = "sunday"; + break; + case 1: + day = "monday"; + break; + case 2: + day = "tuesday"; + break; + case 3: + day = "wednesday"; + break; + case 4: + day = "thursday"; + break; + case 5: + day = "friday"; + break; + case 6: + day = "saturday"; + break; + default: + day = "sunday"; + break; + } + + return bodyshop.workingdays[day]; + }; + + return ( +
    + 0} + date={date} + refetch={refetch} + > +
    + {label} + {calculating ? : LoadComponent} +
    +
    +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleCalendarHeaderComponent); diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js index e03b48ba0..263aab865 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js @@ -1,29 +1,29 @@ -import moment from "moment"; +import dayjs from "../../utils/day"; export function getRange(dateParam, viewParam) { - let start, end; - let date = dateParam || new Date(); - let view = viewParam || "week"; - // if view is day: from moment(date).startOf('day') to moment(date).endOf('day'); - if (view === "day") { - start = moment(date).startOf("day"); - end = moment(date).endOf("day"); - } - // if view is week: from moment(date).startOf('isoWeek') to moment(date).endOf('isoWeek'); - else if (view === "week") { - start = moment(date).startOf("week"); - end = moment(date).endOf("week"); - } - //if view is month: from moment(date).startOf('month').subtract(7, 'days') to moment(date).endOf('month').add(7, 'days'); i do additional 7 days math because you can see adjacent weeks on month view (that is the way how i generate my recurrent events for the Big Calendar, but if you need only start-end of month - just remove that math); - else if (view === "month") { - start = moment(date).startOf("month").subtract(7, "days"); - end = moment(date).endOf("month").add(7, "days"); - } - // if view is agenda: from moment(date).startOf('day') to moment(date).endOf('day').add(1, 'month'); - else if (view === "agenda") { - start = moment(date).startOf("day"); - end = moment(date).endOf("day").add(1, "month"); - } + let start, end; + let date = dateParam || new Date(); + let view = viewParam || "week"; + // if view is day: from dayjs(date).startOf('day') to dayjs(date).endOf('day'); + if (view === "day") { + start = dayjs(date).startOf("day"); + end = dayjs(date).endOf("day"); + } + // if view is week: from dayjs(date).startOf('isoWeek') to dayjs(date).endOf('isoWeek'); + else if (view === "week") { + start = dayjs(date).startOf("week"); + end = dayjs(date).endOf("week"); + } + //if view is month: from dayjs(date).startOf('month').subtract(7, 'day') to dayjs(date).endOf('month').add(7, 'day'); i do additional 7 days math because you can see adjacent weeks on month view (that is the way how i generate my recurrent events for the Big Calendar, but if you need only start-end of month - just remove that math); + else if (view === "month") { + start = dayjs(date).startOf("month").subtract(7, "day"); + end = dayjs(date).endOf("month").add(7, "day"); + } + // if view is agenda: from dayjs(date).startOf('day') to dayjs(date).endOf('day').add(1, 'month'); + else if (view === "agenda") { + start = dayjs(date).startOf("day"); + end = dayjs(date).endOf("day").add(1, "month"); + } - return { start, end }; + return {start, end}; } diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss b/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss index a46e37b41..6753cd293 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss @@ -1,13 +1,15 @@ .rbc-time-header-cell-single-day { display: unset; } + .rbc-time-view .rbc-allday-cell { height: unset; } -.rbc-month-row{ +.rbc-month-row { overflow: unset !important; } + // .rbc-row-content { // display: none; // } @@ -31,6 +33,7 @@ .rbc-event.rbc-selected { background-color: slategrey; } + .imex-calendar-load { max-width: 12rem; position: relative; diff --git a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx index 7cd90bd14..90cd33bc4 100644 --- a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx +++ b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx @@ -1,153 +1,161 @@ -import moment from "moment"; +import dayjs from "../../utils/day"; import queryString from "query-string"; import React from "react"; -import { Calendar, momentLocalizer } from "react-big-calendar"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Calendar, dayjsLocalizer} from "react-big-calendar"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import Event from "../job-at-change/schedule-event.container"; import HeaderComponent from "./schedule-calendar-header.component"; import "./schedule-calendar.styles.scss"; import JobDetailCards from "../job-detail-cards/job-detail-cards.component"; -import { selectProblemJobs } from "../../redux/application/application.selectors"; -import { Alert, Collapse } from "antd"; -import { useTranslation, Trans } from "react-i18next"; -import { Link } from "react-router-dom"; +import {selectProblemJobs} from "../../redux/application/application.selectors"; +import {Alert, Collapse, Space} from "antd"; +import {Trans, useTranslation} from "react-i18next"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - problemJobs: selectProblemJobs, + bodyshop: selectBodyshop, + problemJobs: selectProblemJobs, }); -const localizer = momentLocalizer(moment); +const localizer = dayjsLocalizer(dayjs); + export function ScheduleCalendarWrapperComponent({ - bodyshop, - problemJobs, - data, - refetch, - defaultView, - setDateRangeCallback, - date, - ...otherProps -}) { - const search = queryString.parse(useLocation().search); - const history = useHistory(); - const { t } = useTranslation(); - const handleEventPropStyles = (event, start, end, isSelected) => { - return { - ...(event.color && !((search.view || defaultView) === "agenda") - ? { - style: { - backgroundColor: - event.color && event.color.hex ? event.color.hex : event.color, - }, - } - : {}), - className: `${event.arrived ? "imex-event-arrived" : ""} ${ - event.block ? "imex-event-block" : "" - }`, + bodyshop, + problemJobs, + data, + refetch, + defaultView, + setDateRangeCallback, + date, + ...otherProps + }) { + const search = queryString.parse(useLocation().search); + const history = useNavigate(); + const {t} = useTranslation(); + const handleEventPropStyles = (event, start, end, isSelected) => { + return { + ...(event.color && !((search.view || defaultView) === "agenda") + ? { + style: { + backgroundColor: + event.color && event.color.hex ? event.color.hex : event.color, + }, + } + : {}), + className: `${event.arrived ? "imex-event-arrived" : ""} ${ + event.block ? "imex-event-block" : "" + }`, + }; }; - }; - const selectedDate = new Date(date || moment(search.date) || Date.now()); + const selectedDate = new Date(date || dayjs(search.date) || Date.now()); - return ( - <> - - {problemJobs && problemJobs.length > 2 ? ( - - + return ( + <> + + {problemJobs && problemJobs.length > 2 ? ( + + {t("appointments.labels.severalerrorsfound")} - } - > - {problemJobs.map((problem) => ( - , - ]} - values={{ - ro_number: problem.ro_number, - code: problem.code, - }} - /> - } - /> - ))} - - - ) : ( - problemJobs.map((problem) => ( - , - ]} - values={{ - ro_number: problem.ro_number, - code: problem.code, - }} - /> - } - /> - )) - )} + } + > + + {problemJobs.map((problem) => ( + , + ]} + values={{ + ro_number: problem.ro_number, + code: problem.code, + }} + /> + } + /> + ))} + - { - search.date = date.toISOString().substr(0, 10); - history.push({ search: queryString.stringify(search) }); - }} - onRangeChange={(start, end) => { - if (setDateRangeCallback) setDateRangeCallback({ start, end }); - }} - onView={(view) => { - search.view = view; - history.push({ search: queryString.stringify(search) }); - }} - step={15} - // timeslots={1} - showMultiDayTimes - localizer={localizer} - min={ - bodyshop.schedule_start_time - ? new Date(bodyshop.schedule_start_time) - : new Date("2020-01-01T06:00:00") - } - max={ - bodyshop.schedule_end_time - ? new Date(bodyshop.schedule_end_time) - : new Date("2020-01-01T20:00:00") - } - eventPropGetter={handleEventPropStyles} - components={{ - event: (e) => - Event({ bodyshop: bodyshop, event: e.event, refetch: refetch }), - header: (p) => ( - - ), - }} - {...otherProps} - /> - - ); + + + ) : ( + + { + problemJobs.map((problem) => ( + , + ]} + values={{ + ro_number: problem.ro_number, + code: problem.code, + }} + /> + } + /> + )) + } + + )} + + { + search.date = date.toISOString().substr(0, 10); + history({search: queryString.stringify(search)}); + }} + onRangeChange={(start, end) => { + if (setDateRangeCallback) setDateRangeCallback({start, end}); + }} + onView={(view) => { + search.view = view; + history({search: queryString.stringify(search)}); + }} + step={15} + // timeslots={1} + showMultiDayTimes + localizer={localizer} + min={ + bodyshop.schedule_start_time + ? new Date(bodyshop.schedule_start_time) + : new Date("2020-01-01T06:00:00") + } + max={ + bodyshop.schedule_end_time + ? new Date(bodyshop.schedule_end_time) + : new Date("2020-01-01T20:00:00") + } + eventPropGetter={handleEventPropStyles} + components={{ + event: (e) => + Event({bodyshop: bodyshop, event: e.event, refetch: refetch}), + header: (p) => ( + + ), + }} + {...otherProps} + /> + + ); } export default connect(mapStateToProps, null)(ScheduleCalendarWrapperComponent); diff --git a/client/src/components/schedule-calendar/schedule-calendar.component.jsx b/client/src/components/schedule-calendar/schedule-calendar.component.jsx index 1c9463e23..a1c928f72 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.component.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.component.jsx @@ -1,16 +1,8 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { - Button, - Card, - Checkbox, - Col, - PageHeader, - Row, - Select, - Space, -} from "antd"; -import { t } from "i18next"; -import React, { useMemo } from "react"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Checkbox, Col, Row, Select, Space,} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; +import {t} from "i18next"; +import React, {useMemo} from "react"; import useLocalStorage from "../../utils/useLocalStorage"; import ScheduleAtsSummary from "../schedule-ats-summary/schedule-ats-summary.component"; import ScheduleCalendarWrapperComponent from "../schedule-calendar-wrapper/scheduler-calendar-wrapper.component"; @@ -18,163 +10,164 @@ import ScheduleModal from "../schedule-job-modal/schedule-job-modal.container"; import ScheduleManualEvent from "../schedule-manual-event/schedule-manual-event.component"; import ScheduleProductionList from "../schedule-production-list/schedule-production-list.component"; import ScheduleVerifyIntegrity from "../schedule-verify-integrity/schedule-verify-integrity.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import _ from "lodash"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleCalendarComponent); -export function ScheduleCalendarComponent({ data, refetch, bodyshop }) { - const [filter, setFilter] = useLocalStorage("filter_events", { - intake: true, - manual: true, - employeevacation: true, - ins_co_nm: null, - }); - const [estimatorsFilter, setEstimatiorsFilter] = useLocalStorage( - "estimators", - [] - ); - - const estimators = useMemo(() => { - return _.uniq([ - ...data - .filter((d) => d.__typename === "appointments") - .map((app) => - `${app.job?.est_ct_fn || ""} ${app.job?.est_ct_ln || ""}`.trim() - ) - .filter((e) => e.length > 0), - ...bodyshop.md_estimators.map((e) => - `${e.est_ct_fn || ""} ${e.est_ct_ln || ""}`.trim() - ), - ]); - }, [data, bodyshop.md_estimators]); - - const filteredData = useMemo(() => { - return data.filter((d) => { - const estFilter = - d.__typename === "appointments" - ? estimatorsFilter.length === 0 - ? true - : !!estimatorsFilter.find( - (e) => - e === - `${d.job?.est_ct_fn || ""} ${d.job?.est_ct_ln || ""}`.trim() - ) - : true; - - return ( - (d.block || - (filter.intake && d.isintake) || - (filter.manual && !d.isintake && d.block === false) || - (d.__typename === "employee_vacation" && - filter.employeevacation && - !!d.employee)) && - (filter.ins_co_nm && filter.ins_co_nm.length > 0 - ? filter.ins_co_nm.includes(d.job?.ins_co_nm) - : true) && - estFilter - ); +export function ScheduleCalendarComponent({data, refetch, bodyshop}) { + const [filter, setFilter] = useLocalStorage("filter_events", { + intake: true, + manual: true, + employeevacation: true, + ins_co_nm: null, }); - }, [data, filter, estimatorsFilter]); + const [estimatorsFilter, setEstimatiorsFilter] = useLocalStorage( + "estimators", + [] + ); - return ( - - + const estimators = useMemo(() => { + return _.uniq([ + ...data + .filter((d) => d.__typename === "appointments") + .map((app) => + `${app.job?.est_ct_fn || ""} ${app.job?.est_ct_ln || ""}`.trim() + ) + .filter((e) => e.length > 0), + ...bodyshop.md_estimators.map((e) => + `${e.est_ct_fn || ""} ${e.est_ct_ln || ""}`.trim() + ), + ]); + }, [data, bodyshop.md_estimators]); - - - - setFilter({ ...filter, ins_co_nm: [] })} - value={filter?.ins_co_nm ? filter.ins_co_nm : []} - onChange={(e) => { - setFilter({ ...filter, ins_co_nm: e }); - }} - options={bodyshop.md_ins_cos.map((i) => ({ - label: i.name, - value: i.name, - }))} - /> - { - setFilter({ ...filter, intake: e.target.checked }); - }} - > - {t("schedule.labels.intake")} - - { - setFilter({ ...filter, manual: e.target.checked }); - }} - > - {t("schedule.labels.manual")} - - { - setFilter({ ...filter, employeevacation: e.target.checked }); - }} - > - {t("schedule.labels.employeevacation")} - - - - + const filteredData = useMemo(() => { + return data.filter((d) => { + const estFilter = + d.__typename === "appointments" + ? estimatorsFilter.length === 0 + ? true + : !!estimatorsFilter.find( + (e) => + e === + `${d.job?.est_ct_fn || ""} ${d.job?.est_ct_ln || ""}`.trim() + ) + : true; - - - } - /> - + return ( + (d.block || + (filter.intake && d.isintake) || + (filter.manual && !d.isintake && d.block === false) || + (d.__typename === "employee_vacation" && + filter.employeevacation && + !!d.employee)) && + (filter.ins_co_nm && filter.ins_co_nm.length > 0 + ? filter.ins_co_nm.includes(d.job?.ins_co_nm) + : true) && + estFilter + ); + }); + }, [data, filter, estimatorsFilter]); - - - - - - - ); + return ( + + + + + + + setFilter({...filter, ins_co_nm: []})} + value={filter?.ins_co_nm ? filter.ins_co_nm : []} + onChange={(e) => { + setFilter({...filter, ins_co_nm: e}); + }} + options={bodyshop.md_ins_cos.map((i) => ({ + label: i.name, + value: i.name, + }))} + /> + { + setFilter({...filter, intake: e.target.checked}); + }} + > + {t("schedule.labels.intake")} + + { + setFilter({...filter, manual: e.target.checked}); + }} + > + {t("schedule.labels.manual")} + + { + setFilter({...filter, employeevacation: e.target.checked}); + }} + > + {t("schedule.labels.employeevacation")} + + + + + + + + } + /> + + + + + + + + + ); } diff --git a/client/src/components/schedule-calendar/schedule-calendar.container.jsx b/client/src/components/schedule-calendar/schedule-calendar.container.jsx index 27e05258a..f0d0cfc6e 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.container.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.container.jsx @@ -1,84 +1,86 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; -import React, { useMemo, useEffect } from "react"; -import { useLocation } from "react-router-dom"; -import { QUERY_ALL_ACTIVE_APPOINTMENTS } from "../../graphql/appointments.queries"; +import React, {useEffect, useMemo} from "react"; +import {useLocation} from "react-router-dom"; +import {QUERY_ALL_ACTIVE_APPOINTMENTS} from "../../graphql/appointments.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import { getRange } from "../schedule-calendar-wrapper/schedule-calendar-util"; +import {getRange} from "../schedule-calendar-wrapper/schedule-calendar-util"; import ScheduleCalendarComponent from "./schedule-calendar.component"; -import { calculateScheduleLoad } from "../../redux/application/application.actions"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import moment from "moment"; +import {calculateScheduleLoad} from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import dayjs from "../../utils/day"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + //currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ - calculateScheduleLoad: (endDate) => dispatch(calculateScheduleLoad(endDate)), + calculateScheduleLoad: (endDate) => dispatch(calculateScheduleLoad(endDate)), }); -export function ScheduleCalendarContainer({ calculateScheduleLoad }) { - const search = queryString.parse(useLocation().search); +export function ScheduleCalendarContainer({calculateScheduleLoad}) { + const search = queryString.parse(useLocation().search); - const { date, view } = search; - const range = useMemo(() => getRange(date, view), [date, view]); + const {date, view} = search; + const range = useMemo(() => getRange(date, view), [date, view]); - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_ACTIVE_APPOINTMENTS, - { - variables: { - start: range.start.toDate(), - end: range.end.toDate(), - startd: range.start, - endd: range.end, - }, - skip: !!!range.start || !!!range.end, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_ACTIVE_APPOINTMENTS, + { + variables: { + start: range.start.toDate(), + end: range.end.toDate(), + startd: range.start, + endd: range.end, + }, + skip: !!!range.start || !!!range.end, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } + ); - useEffect(() => { - if (data && range.end) calculateScheduleLoad(range.end); - }, [data, range, calculateScheduleLoad]); + useEffect(() => { + if (data && range.end) calculateScheduleLoad(range.end); + }, [data, range, calculateScheduleLoad]); - if (loading) return ; - if (error) return ; - let normalizedData = [ - ...data.appointments.map((e) => { - //Required becuase Hasura returns a string instead of a date object. - return Object.assign( - {}, - e, - { start: new Date(e.start) }, - { end: new Date(e.end) } - ); - }), - ...data.employee_vacation.map((e) => { - //Required becuase Hasura returns a string instead of a date object. - return { - ...e, - title: `${ - (e.employee.first_name && e.employee.first_name.substr(0, 1)) || "" - } ${e.employee.last_name || ""} OUT`, - color: "red", - start: moment(e.start).startOf("day").toDate(), - end: moment(e.end).startOf("day").toDate(), - allDay: true, - vacation: true, - }; - }), - ]; + if (loading) return ; + if (error) return ; + let normalizedData = [ + ...data.appointments.map((e) => { + //Required becuase Hasura returns a string instead of a date object. + return Object.assign( + {}, + e, + {start: new Date(e.start)}, + {end: new Date(e.end)} + ); + }), + ...data.employee_vacation.map((e) => { + //Required becuase Hasura returns a string instead of a date object. + return { + ...e, + title: `${ + (e.employee.first_name && e.employee.first_name.substr(0, 1)) || "" + } ${e.employee.last_name || ""} OUT`, + color: "red", + start: dayjs(e.start).startOf("day").toDate(), + end: dayjs(e.end).startOf("day").toDate(), + allDay: true, + vacation: true, + }; + }), + ]; - return ( - - ); + return ( + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleCalendarContainer); diff --git a/client/src/components/schedule-day-view/schedule-day-view.component.jsx b/client/src/components/schedule-day-view/schedule-day-view.component.jsx index 61a9fd1a3..cd1eaa856 100644 --- a/client/src/components/schedule-day-view/schedule-day-view.component.jsx +++ b/client/src/components/schedule-day-view/schedule-day-view.component.jsx @@ -1,18 +1,18 @@ import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import ScheduleCalendarWrapperComponent from "../schedule-calendar-wrapper/scheduler-calendar-wrapper.component"; -export default function ScheduleDayViewComponent({ data, day }) { - const { t } = useTranslation(); - if (data) - return ( - - ); - else return
    {t("appointments.labels.nodateselected")}
    ; +export default function ScheduleDayViewComponent({data, day}) { + const {t} = useTranslation(); + if (data) + return ( + + ); + else return
    {t("appointments.labels.nodateselected")}
    ; } diff --git a/client/src/components/schedule-day-view/schedule-day-view.container.jsx b/client/src/components/schedule-day-view/schedule-day-view.container.jsx index e35b44873..1c43f5774 100644 --- a/client/src/components/schedule-day-view/schedule-day-view.container.jsx +++ b/client/src/components/schedule-day-view/schedule-day-view.container.jsx @@ -1,57 +1,57 @@ import React from "react"; import ScheduleDayViewComponent from "./schedule-day-view.component"; -import { useQuery } from "@apollo/client"; -import { QUERY_APPOINTMENT_BY_DATE } from "../../graphql/appointments.queries"; +import {useQuery} from "@apollo/client"; +import {QUERY_APPOINTMENT_BY_DATE} from "../../graphql/appointments.queries"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; -import moment from "moment"; -import { useTranslation } from "react-i18next"; +import dayjs from "../../utils/day"; +import {useTranslation} from "react-i18next"; -export default function ScheduleDayViewContainer({ day }) { - const { loading, error, data } = useQuery(QUERY_APPOINTMENT_BY_DATE, { - variables: { - start: moment(day).startOf("day"), - end: moment(day).endOf("day"), - startd: moment(day).startOf("day").format("YYYY-MM-DD"), - endd: moment(day).add(1, "day").format("YYYY-MM-DD"), - }, - skip: !moment(day).isValid(), - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { t } = useTranslation(); - if (!day) return
    {t("appointments.labels.nodateselected")}
    ; - if (loading) return ; - if (error) return
    {error.message}
    ; - let normalizedData; +export default function ScheduleDayViewContainer({day}) { + const {loading, error, data} = useQuery(QUERY_APPOINTMENT_BY_DATE, { + variables: { + start: dayjs(day).startOf("day"), + end: dayjs(day).endOf("day"), + startd: dayjs(day).startOf("day").format("YYYY-MM-DD"), + endd: dayjs(day).add(1, "day").format("YYYY-MM-DD"), + }, + skip: !dayjs(day).isValid(), + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const {t} = useTranslation(); + if (!day) return
    {t("appointments.labels.nodateselected")}
    ; + if (loading) return ; + if (error) return
    {error.message}
    ; + let normalizedData; - if (data) { - normalizedData = [ - ...data.appointments.map((e) => { - //Required becuase Hasura returns a string instead of a date object. - return Object.assign( - {}, - e, - { start: new Date(e.start) }, - { end: new Date(e.end) } - ); - }), - ...data.employee_vacation.map((e) => { - //Required becuase Hasura returns a string instead of a date object. - return { - ...e, - title: `${ - (e.employee.first_name && e.employee.first_name.substr(0, 1)) || "" - } ${e.employee.last_name || ""} OUT`, - color: "red", - start: moment(e.start).startOf("day").toDate(), - end: moment(e.end).startOf("day").toDate(), - vacation: true, - }; - }), - ]; - } + if (data) { + normalizedData = [ + ...data.appointments.map((e) => { + //Required becuase Hasura returns a string instead of a date object. + return Object.assign( + {}, + e, + {start: new Date(e.start)}, + {end: new Date(e.end)} + ); + }), + ...data.employee_vacation.map((e) => { + //Required becuase Hasura returns a string instead of a date object. + return { + ...e, + title: `${ + (e.employee.first_name && e.employee.first_name.substr(0, 1)) || "" + } ${e.employee.last_name || ""} OUT`, + color: "red", + start: dayjs(e.start).startOf("day").toDate(), + end: dayjs(e.end).startOf("day").toDate(), + vacation: true, + }; + }), + ]; + } - return ( - - ); + return ( + + ); } diff --git a/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx b/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx index 0d03b913d..cdd16431a 100644 --- a/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx +++ b/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx @@ -1,48 +1,45 @@ import React from "react"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import AlertComponent from "../alert/alert.component"; -import { Timeline } from "antd"; -import { useTranslation } from "react-i18next"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {Timeline} from "antd"; +import {useTranslation} from "react-i18next"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; export default function ScheduleExistingAppointmentsList({ - existingAppointments, -}) { - const { t } = useTranslation(); - if (existingAppointments.loading) return ; - if (existingAppointments.error) + existingAppointments, + }) { + const {t} = useTranslation(); + if (existingAppointments.loading) return ; + if (existingAppointments.error) + return ( + + ); + return ( - +
    + {t("appointments.labels.priorappointments")} + ({ + key: item.id, + color: item.canceled ? "red" : item.arrived ? "green" : "blue", + children: ( + <> + {item.canceled + ? t("appointments.labels.cancelledappointment") + : item.arrived + ? t("appointments.labels.arrivedon") + : t("appointments.labels.scheduledfor")} + {item.start} + + ), + })) + : [] + } + />
    ); - - return ( -
    - {t("appointments.labels.priorappointments")} - - {existingAppointments.data - ? existingAppointments.data.appointments.map((item) => { - return ( - - {item.canceled - ? t("appointments.labels.cancelledappointment") - : item.arrived - ? t("appointments.labels.arrivedon") - : t("appointments.labels.scheduledfor")} - - {item.start} - - ); - }) - : null} - -
    - ); } diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx index fdfb9932c..28fcd4425 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx +++ b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx @@ -1,220 +1,213 @@ -import { - Button, - Col, - Form, - Input, - Row, - Select, - Space, - Switch, - Typography, -} from "antd"; +import {Button, Col, Form, Input, Row, Select, Space, Switch, Typography,} from "antd"; import axios from "axios"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { calculateScheduleLoad } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { DateFormatter } from "../../utils/DateFormatter"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {calculateScheduleLoad} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {DateFormatter} from "../../utils/DateFormatter"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; import EmailInput from "../form-items-formatted/email-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import ScheduleDayViewContainer from "../schedule-day-view/schedule-day-view.container"; -import ScheduleExistingAppointmentsList from "../schedule-existing-appointments-list/schedule-existing-appointments-list.component"; +import ScheduleExistingAppointmentsList + from "../schedule-existing-appointments-list/schedule-existing-appointments-list.component"; import "./schedule-job-modal.scss"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) - calculateScheduleLoad: (endDate) => dispatch(calculateScheduleLoad(endDate)), + //setUserLanguage: language => dispatch(setUserLanguage(language)) + calculateScheduleLoad: (endDate) => dispatch(calculateScheduleLoad(endDate)), }); export function ScheduleJobModalComponent({ - bodyshop, - form, - existingAppointments, - lbrHrsData, - jobId, - calculateScheduleLoad, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [smartOptions, setSmartOptions] = useState([]); + bodyshop, + form, + existingAppointments, + lbrHrsData, + jobId, + calculateScheduleLoad, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [smartOptions, setSmartOptions] = useState([]); - const handleSmartScheduling = async () => { - setLoading(true); - try { - const response = await axios.post("/scheduling/job", { - jobId: jobId, - }); - if (response.data) setSmartOptions(response.data); - } catch (error) { - console.log("error", error, error.message); - } finally { - setLoading(false); - } - }; - - const handleDateBlur = () => { - const values = form.getFieldsValue(); - - if (lbrHrsData) { - const totalHours = - lbrHrsData.jobs_by_pk.labhrs.aggregate.sum.mod_lb_hrs + - lbrHrsData.jobs_by_pk.larhrs.aggregate.sum.mod_lb_hrs; - - if (values.start && !values.scheduled_completion) - form.setFieldsValue({ - scheduled_completion: moment(values.start).businessAdd( - totalHours / bodyshop.target_touchtime, - "days" - ), - }); - } - }; - - return ( - - - - - {lbrHrsData?.jobs_by_pk?.ro_number} - - {`B/R Hrs:${ - lbrHrsData?.jobs_by_pk.labhrs?.aggregate?.sum?.mod_lb_hrs || 0 - }/${ - lbrHrsData?.jobs_by_pk.larhrs?.aggregate?.sum?.mod_lb_hrs || 0 - }`} - - - - - - - - - - - - {t("appointments.labels.smartscheduling")} - - - { - // smartOptions.length > 0 && ( - //
    {t("appointments.labels.suggesteddates")}
    - // ) + const handleSmartScheduling = async () => { + setLoading(true); + try { + const response = await axios.post("/scheduling/job", { + jobId: jobId, + }); + if (response.data) setSmartOptions(response.data); + } catch (error) { + console.log("error", error, error.message); + } finally { + setLoading(false); } - - - {smartOptions.map((d, idx) => ( - - ))} - + + + {smartOptions.map((d, idx) => ( + + ))} + - - - - + + + + - - - - - - - - - - - - - - - - {t("appointments.labels.history")} - - - - prev.start !== cur.start}> - {() => { - const values = form.getFieldsValue(); - if (values.start) { - calculateScheduleLoad(moment(values.start).add(3, "days")); - } - return ( -
    - -
    - ); - }} -
    - -
    - ); + + + + + + + + + + + + + + + + {t("appointments.labels.history")} + + + + prev.start !== cur.start}> + {() => { + const values = form.getFieldsValue(); + if (values.start) { + calculateScheduleLoad(dayjs(values.start).add(3, "day")); + } + return ( +
    + +
    + ); + }} +
    + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleJobModalComponent); diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx b/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx index 19c360a21..268f4700a 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx +++ b/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx @@ -1,249 +1,246 @@ -import { useMutation, useQuery } from "@apollo/client"; -//import moment from "moment"; -import { Form, Modal, notification } from "antd"; -import moment from "moment-business-days"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useMutation, useQuery} from "@apollo/client"; +import {Form, Modal, notification} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import { - CANCEL_APPOINTMENT_BY_ID, - INSERT_APPOINTMENT, - QUERY_APPOINTMENTS_BY_JOBID, + CANCEL_APPOINTMENT_BY_ID, + INSERT_APPOINTMENT, + QUERY_APPOINTMENTS_BY_JOBID, } from "../../graphql/appointments.queries"; -import { QUERY_LBR_HRS_BY_PK, UPDATE_JOBS } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectSchedule } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {QUERY_LBR_HRS_BY_PK, UPDATE_JOBS} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {setEmailOptions} from "../../redux/email/email.actions"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectSchedule} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; -import { DateTimeFormat } from "../../utils/DateFormatter"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {DateTimeFormat} from "../../utils/DateFormatter"; +import {TemplateList} from "../../utils/TemplateConstants"; import ScheduleJobModalComponent from "./schedule-job-modal.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - scheduleModal: selectSchedule, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + scheduleModal: selectSchedule, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("schedule")), - setEmailOptions: (e) => dispatch(setEmailOptions(e)), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + toggleModalVisible: () => dispatch(toggleModalVisible("schedule")), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); export function ScheduleJobModalContainer({ - scheduleModal, - bodyshop, - toggleModalVisible, - setEmailOptions, - currentUser, - insertAuditTrail, -}) { - const { visible, context, actions } = scheduleModal; - const { jobId, job, previousEvent } = context; + scheduleModal, + bodyshop, + toggleModalVisible, + setEmailOptions, + currentUser, + insertAuditTrail, + }) { + const {open, context, actions} = scheduleModal; + const {jobId, job, previousEvent} = context; - const { refetch } = actions; - const [form] = Form.useForm(); + const {refetch} = actions; + const [form] = Form.useForm(); - const { data: lbrHrsData } = useQuery(QUERY_LBR_HRS_BY_PK, { - variables: { id: job && job.id }, - skip: !job || !job.id, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const [loading, setLoading] = useState(false); - const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID); - const [insertAppointment] = useMutation(INSERT_APPOINTMENT); - const [updateJobStatus] = useMutation(UPDATE_JOBS); - - useEffect(() => { - if (job) form.resetFields(); - }, [job, form]); - - const { t } = useTranslation(); - - const existingAppointments = useQuery(QUERY_APPOINTMENTS_BY_JOBID, { - variables: { jobid: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: !visible || !!!jobId, - }); - - useEffect(() => { - if ( - existingAppointments.data && - existingAppointments.data.appointments.length > 0 && - !existingAppointments.data.appointments[0].canceled - ) { - form.setFieldsValue({ - color: existingAppointments.data.appointments[0].color, - - note: existingAppointments.data.appointments[0].note, - }); - } - }, [existingAppointments.data, form]); - - const handleFinish = async (values) => { - logImEXEvent("schedule_new_appointment"); - - setLoading(true); - if (!!previousEvent) { - const cancelAppt = await cancelAppointment({ - variables: { appid: previousEvent }, - }); - - if (!!cancelAppt.errors) { - notification["error"]({ - message: t("appointments.errors.canceling", { - message: JSON.stringify(cancelAppt.errors), - }), - }); - return; - } - - notification["success"]({ - message: t("appointments.successes.canceled"), - }); - } - - if (existingAppointments.data.appointments.length > 0) { - await Promise.all( - existingAppointments.data.appointments.map((app) => { - return cancelAppointment({ - variables: { appid: app.id }, - }); - }) - ); - } - - const appt = await insertAppointment({ - variables: { - app: { - jobid: jobId, - bodyshopid: bodyshop.id, - start: moment(values.start), - end: moment(values.start).add(bodyshop.appt_length || 60, "minutes"), - color: values.color, - note: values.note, - created_by: currentUser.email, - }, - jobId: jobId, - altTransport: values.alt_transport, - }, + const {data: lbrHrsData} = useQuery(QUERY_LBR_HRS_BY_PK, { + variables: {id: job && job.id}, + skip: !job || !job.id, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - if (!appt.errors) { - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.appointmentinsert( - DateTimeFormat(values.start) - ), - }); - } + const [loading, setLoading] = useState(false); + const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID); + const [insertAppointment] = useMutation(INSERT_APPOINTMENT); + const [updateJobStatus] = useMutation(UPDATE_JOBS); - if (!!appt.errors) { - notification["error"]({ - message: t("appointments.errors.saving", { - message: JSON.stringify(appt.errors), - }), - }); - return; - } - notification["success"]({ - message: t("appointments.successes.created"), + useEffect(() => { + if (job) form.resetFields(); + }, [job, form]); + + const {t} = useTranslation(); + + const existingAppointments = useQuery(QUERY_APPOINTMENTS_BY_JOBID, { + variables: {jobid: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !open || !!!jobId, }); - if (jobId) { - const jobUpdate = await updateJobStatus({ - variables: { - jobIds: [jobId], - fields: { - status: bodyshop.md_ro_statuses.default_scheduled, - date_scheduled: new Date(), - scheduled_in: values.start, - scheduled_completion: values.scheduled_completion, - lost_sale_reason: null, - date_lost_sale: null, - }, - }, - }); - if (!!jobUpdate.errors) { - notification["error"]({ - message: t("appointments.errors.saving", { - message: JSON.stringify(jobUpdate.errors), - }), + useEffect(() => { + if ( + existingAppointments.data && + existingAppointments.data.appointments.length > 0 && + !existingAppointments.data.appointments[0].canceled + ) { + form.setFieldsValue({ + color: existingAppointments.data.appointments[0].color, + + note: existingAppointments.data.appointments[0].note, + }); + } + }, [existingAppointments.data, form]); + + const handleFinish = async (values) => { + logImEXEvent("schedule_new_appointment"); + + setLoading(true); + if (!!previousEvent) { + const cancelAppt = await cancelAppointment({ + variables: {appid: previousEvent}, + }); + + if (!!cancelAppt.errors) { + notification["error"]({ + message: t("appointments.errors.canceling", { + message: JSON.stringify(cancelAppt.errors), + }), + }); + return; + } + + notification["success"]({ + message: t("appointments.successes.canceled"), + }); + } + + if (existingAppointments.data.appointments.length > 0) { + await Promise.all( + existingAppointments.data.appointments.map((app) => { + return cancelAppointment({ + variables: {appid: app.id}, + }); + }) + ); + } + + const appt = await insertAppointment({ + variables: { + app: { + jobid: jobId, + bodyshopid: bodyshop.id, + start: dayjs(values.start), + end: dayjs(values.start).add(bodyshop.appt_length || 60, "minute"), + color: values.color, + note: values.note, + created_by: currentUser.email, + }, + jobId: jobId, + altTransport: values.alt_transport, + }, }); - return; - } - } - setLoading(false); - toggleModalVisible(); - if (values.notifyCustomer) { - setEmailOptions({ - jobid: jobId, - messageOptions: { - to: [values.email], - replyTo: bodyshop.email, - subject: TemplateList("appointment").appointment_confirmation.subject, - }, - template: { - name: TemplateList("appointment").appointment_confirmation.key, - variables: { - id: appt.data.insert_appointments.returning[0].id, - }, - }, - }); - } - if (refetch) refetch(); - }; - return ( - toggleModalVisible()} - onOk={() => form.submit()} - width={"90%"} - maskClosable={false} - destroyOnClose - okButtonProps={{ - loading: loading, - }} - > -
    - - -
    - ); + if (!appt.errors) { + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.appointmentinsert( + DateTimeFormat(values.start) + ), + }); + } + + if (!!appt.errors) { + notification["error"]({ + message: t("appointments.errors.saving", { + message: JSON.stringify(appt.errors), + }), + }); + return; + } + notification["success"]({ + message: t("appointments.successes.created"), + }); + if (jobId) { + const jobUpdate = await updateJobStatus({ + variables: { + jobIds: [jobId], + fields: { + status: bodyshop.md_ro_statuses.default_scheduled, + date_scheduled: new Date(), + scheduled_in: values.start, + scheduled_completion: values.scheduled_completion, + lost_sale_reason: null, + date_lost_sale: null, + }, + }, + }); + + if (!!jobUpdate.errors) { + notification["error"]({ + message: t("appointments.errors.saving", { + message: JSON.stringify(jobUpdate.errors), + }), + }); + return; + } + } + setLoading(false); + toggleModalVisible(); + if (values.notifyCustomer) { + setEmailOptions({ + jobid: jobId, + messageOptions: { + to: [values.email], + replyTo: bodyshop.email, + subject: TemplateList("appointment").appointment_confirmation.subject, + }, + template: { + name: TemplateList("appointment").appointment_confirmation.key, + variables: { + id: appt.data.insert_appointments.returning[0].id, + }, + }, + }); + } + if (refetch) refetch(); + }; + + return ( + toggleModalVisible()} + onOk={() => form.submit()} + width={"90%"} + maskClosable={false} + destroyOnClose + okButtonProps={{ + loading: loading, + }} + closable={false} + > +
    + + +
    + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleJobModalContainer); diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.scss b/client/src/components/schedule-job-modal/schedule-job-modal.scss index 6c2c42694..1cb0ef8bb 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.scss +++ b/client/src/components/schedule-job-modal/schedule-job-modal.scss @@ -1,6 +1,7 @@ .schedule-job-modal { height: 70vh; overflow-y: auto; + .rbc-calendar { .rbc-toolbar { .rbc-btn-group { diff --git a/client/src/components/schedule-manual-event/schedule-manual-event.component.jsx b/client/src/components/schedule-manual-event/schedule-manual-event.component.jsx index ffba05c31..1d41163da 100644 --- a/client/src/components/schedule-manual-event/schedule-manual-event.component.jsx +++ b/client/src/components/schedule-manual-event/schedule-manual-event.component.jsx @@ -1,166 +1,163 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Form, Input, Popover, Select, Space } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - INSERT_MANUAL_APPT, - UPDATE_APPOINTMENT, -} from "../../graphql/appointments.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Form, Input, Popover, Select, Space} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_MANUAL_APPT, UPDATE_APPOINTMENT,} from "../../graphql/appointments.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleManualEvent); -export function ScheduleManualEvent({ bodyshop, event }) { - const { t } = useTranslation(); - const [insertAppointment] = useMutation(INSERT_MANUAL_APPT); - const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [visibility, setVisibility] = useState(false); - // const [callQuery, { loading: entryLoading, data: entryData }] = useLazyQuery( - // QUERY_SCOREBOARD_ENTRY - // ); +export function ScheduleManualEvent({bodyshop, event}) { + const {t} = useTranslation(); + const [insertAppointment] = useMutation(INSERT_MANUAL_APPT); + const [updateAppointment] = useMutation(UPDATE_APPOINTMENT); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [visibility, setVisibility] = useState(false); + // const [callQuery, { loading: entryLoading, data: entryData }] = useLazyQuery( + // QUERY_SCOREBOARD_ENTRY + // ); - useEffect(() => { - if (visibility && event) { - form.setFieldsValue(event); - } - }, [visibility, form, event]); + useEffect(() => { + if (visibility && event) { + form.setFieldsValue(event); + } + }, [visibility, form, event]); - const handleFinish = async (values) => { - logImEXEvent("schedule_manual_event"); + const handleFinish = async (values) => { + logImEXEvent("schedule_manual_event"); - setLoading(true); - try { - if (event && event.id) { - updateAppointment({ - variables: { appid: event.id, app: values }, - refetchQueries: ["QUERY_ALL_ACTIVE_APPOINTMENTS"], - }); - } else { - insertAppointment({ - variables: { - apt: { ...values, isintake: false, bodyshopid: bodyshop.id }, - }, - refetchQueries: ["QUERY_ALL_ACTIVE_APPOINTMENTS"], - }); - } - form.resetFields(); - setVisibility(false); - } catch (error) { - console.log(error); - } finally { - setLoading(false); - } - }; + setLoading(true); + try { + if (event && event.id) { + updateAppointment({ + variables: {appid: event.id, app: values}, + refetchQueries: ["QUERY_ALL_ACTIVE_APPOINTMENTS"], + }); + } else { + insertAppointment({ + variables: { + apt: {...values, isintake: false, bodyshopid: bodyshop.id}, + }, + refetchQueries: ["QUERY_ALL_ACTIVE_APPOINTMENTS"], + }); + } + form.resetFields(); + setVisibility(false); + } catch (error) { + console.log(error); + } finally { + setLoading(false); + } + }; - const overlay = ( - -
    -
    - - - - - - - - - - ({ - async validator(rule, value) { - if (value) { - const { start } = form.getFieldsValue(); - if (moment(start).isAfter(moment(value))) { - return Promise.reject( - t("employees.labels.endmustbeafterstart") - ); - } else { - return Promise.resolve(); - } - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - - - + const overlay = ( + +
    + + + + + + + + + + + ({ + async validator(rule, value) { + if (value) { + const {start} = form.getFieldsValue(); + if (dayjs(start).isAfter(dayjs(value))) { + return Promise.reject( + t("employees.labels.endmustbeafterstart") + ); + } else { + return Promise.resolve(); + } + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + + + - - + + + +
    +
    + ); + + const handleClick = (e) => { + setVisibility(true); + }; + + return ( + + - - - -
    -
    - ); - - const handleClick = (e) => { - setVisibility(true); - }; - - return ( - - - - ); + + ); } diff --git a/client/src/components/schedule-production-list/schedule-production-list.component.jsx b/client/src/components/schedule-production-list/schedule-production-list.component.jsx index a83a974aa..b70f562f8 100644 --- a/client/src/components/schedule-production-list/schedule-production-list.component.jsx +++ b/client/src/components/schedule-production-list/schedule-production-list.component.jsx @@ -1,70 +1,71 @@ -import { DownOutlined } from "@ant-design/icons"; -import { Button, Card, Popover } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {Button, Card, Popover} from "antd"; import React from "react"; -import { useLazyQuery } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { QUERY_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useLazyQuery} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; +import {QUERY_JOBS_IN_PRODUCTION} from "../../graphql/jobs.queries"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import "./schedule-production-list.styles.scss"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; + export default function ScheduleProductionList() { - const { t } = useTranslation(); - const [callQuery, { loading, error, data }] = useLazyQuery( - QUERY_JOBS_IN_PRODUCTION - ); - - const content = () => { - return ( - -
    e.stopPropagation()} - className="jobs-in-production-table" - > - {loading ? : null} - {error ? ( - - ) : null} - {data ? ( - - - {data && data.jobs - ? data.jobs.map((j) => ( - - - - - - - - )) - : null} - -
    - {j.ro_number} - {`${j.v_model_yr || ""} ${j.v_make_desc || ""} ${ - j.v_model_desc || "" - }`}{`${j.labhrs.aggregate.sum.mod_lb_hrs || "0"} / ${ - j.larhrs.aggregate.sum.mod_lb_hrs || "0" - }`} - - {j.scheduled_completion} - -
    - ) : null} -
    -
    + const {t} = useTranslation(); + const [callQuery, {loading, error, data}] = useLazyQuery( + QUERY_JOBS_IN_PRODUCTION ); - }; - return ( - - - - ); + const content = () => { + return ( + +
    e.stopPropagation()} + className="jobs-in-production-table" + > + {loading ? : null} + {error ? ( + + ) : null} + {data ? ( + + + {data && data.jobs + ? data.jobs.map((j) => ( + + + + + + + + )) + : null} + +
    + {j.ro_number} + {`${j.v_model_yr || ""} ${j.v_make_desc || ""} ${ + j.v_model_desc || "" + }`}{`${j.labhrs.aggregate.sum.mod_lb_hrs || "0"} / ${ + j.larhrs.aggregate.sum.mod_lb_hrs || "0" + }`} + + {j.scheduled_completion} + +
    + ) : null} +
    +
    + ); + }; + + return ( + + + + ); } diff --git a/client/src/components/schedule-production-list/schedule-production-list.styles.scss b/client/src/components/schedule-production-list/schedule-production-list.styles.scss index 35d77ecb9..d4a19fd75 100644 --- a/client/src/components/schedule-production-list/schedule-production-list.styles.scss +++ b/client/src/components/schedule-production-list/schedule-production-list.styles.scss @@ -24,6 +24,7 @@ padding: 0.625em; //text-align: center; } + table td.currency { text-align: right; } diff --git a/client/src/components/schedule-verify-integrity/schedule-verify-integrity.component.jsx b/client/src/components/schedule-verify-integrity/schedule-verify-integrity.component.jsx index 061b15b2c..2b50a43e6 100644 --- a/client/src/components/schedule-verify-integrity/schedule-verify-integrity.component.jsx +++ b/client/src/components/schedule-verify-integrity/schedule-verify-integrity.component.jsx @@ -1,60 +1,61 @@ -import { useApolloClient } from "@apollo/client"; -import { Button } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_SCHEDULE_LOAD_DATA } from "../../graphql/appointments.queries"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {useApolloClient} from "@apollo/client"; +import {Button} from "antd"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_SCHEDULE_LOAD_DATA} from "../../graphql/appointments.queries"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScheduleVerifyIntegrity); -export function ScheduleVerifyIntegrity({ currentUser }) { - const [loading, setLoading] = useState(false); +export function ScheduleVerifyIntegrity({currentUser}) { + const [loading, setLoading] = useState(false); - const client = useApolloClient(); - const handleVerify = async () => { - setLoading(true); - const { - data: { arrJobs, compJobs, prodJobs }, - } = await client.query({ - query: QUERY_SCHEDULE_LOAD_DATA, - variables: { start: moment(), end: moment().add(180, "days") }, - }); + const client = useApolloClient(); + const handleVerify = async () => { + setLoading(true); + const { + data: {arrJobs, compJobs, prodJobs}, + } = await client.query({ + query: QUERY_SCHEDULE_LOAD_DATA, + variables: {start: dayjs(), end: dayjs().add(180, "day")}, + }); - //check that the leaving jobs are either in the arriving list, or in production. - const issues = []; + //check that the leaving jobs are either in the arriving list, or in production. + const issues = []; - compJobs.forEach((j) => { - const inProdJobs = prodJobs.find((p) => p.id === j.id); - const inArrJobs = arrJobs.find((p) => p.id === j.id); + compJobs.forEach((j) => { + const inProdJobs = prodJobs.find((p) => p.id === j.id); + const inArrJobs = arrJobs.find((p) => p.id === j.id); - if (!(inProdJobs || inArrJobs)) { - // NOT FOUND! - issues.push(j); - } - }); - console.log( - "The following completing jobs are not in production, or are arriving within the next 180 days. ", - issues - ); + if (!(inProdJobs || inArrJobs)) { + // NOT FOUND! + issues.push(j); + } + }); + console.log( + "The following completing jobs are not in production, or are arriving within the next 180 days. ", + issues + ); - setLoading(false); - }; + setLoading(false); + }; - if (currentUser.email === "patrick@imex.prod") - return ( - - ); - else return null; + if (currentUser.email === "patrick@imex.prod") + return ( + + ); + else return null; } diff --git a/client/src/components/scoreboard-chart/chart-custom-tooltip.jsx b/client/src/components/scoreboard-chart/chart-custom-tooltip.jsx index 826728439..461f7053e 100644 --- a/client/src/components/scoreboard-chart/chart-custom-tooltip.jsx +++ b/client/src/components/scoreboard-chart/chart-custom-tooltip.jsx @@ -1,39 +1,39 @@ import Dinero from "dinero.js"; -const CustomTooltip = ({ active, payload, label }) => { - if (active && payload && payload.length) { - return ( -
    -

    {label}

    - {payload.map((data, index) => { - if (data.dataKey === "sales" || data.dataKey === "accSales") - return ( -

    {`${data.name} : ${Dinero({ - amount: Math.round(data.value * 100), - }).toFormat()}`}

    - ); +const CustomTooltip = ({active, payload, label}) => { + if (active && payload && payload.length) { + return ( +
    +

    {label}

    + {payload.map((data, index) => { + if (data.dataKey === "sales" || data.dataKey === "accSales") + return ( +

    {`${data.name} : ${Dinero({ + amount: Math.round(data.value * 100), + }).toFormat()}`}

    + ); - return ( -

    {`${data.name} : ${data.value}`}

    - ); - })} -
    - ); - } + return ( +

    {`${data.name} : ${data.value}`}

    + ); + })} +
    + ); + } - return null; + return null; }; export default CustomTooltip; diff --git a/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx index 4e9aa85d0..e3dd3259b 100644 --- a/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx +++ b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx @@ -1,174 +1,174 @@ -import { Card } from "antd"; +import {Card} from "antd"; import Dinero from "dinero.js"; import _ from "lodash"; -import moment from "moment"; +import dayjs from "../../utils/day"; import React from "react"; -import { connect } from "react-redux"; +import {connect} from "react-redux"; import { - Area, - Bar, - CartesianGrid, - ComposedChart, - Legend, - Line, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, + Area, + Bar, + CartesianGrid, + ComposedChart, + Legend, + Line, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, } from "recharts"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util"; import CustomTooltip from "./chart-custom-tooltip"; const graphProps = { - strokeWidth: 3, + strokeWidth: 3, }; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardChart); -export function ScoreboardChart({ sbEntriesByDate, bodyshop }) { - const listOfBusDays = Utils.ListOfDaysInCurrentMonth(); +export function ScoreboardChart({sbEntriesByDate, bodyshop}) { + const listOfBusDays = Utils.ListOfDaysInCurrentMonth(); - const data = listOfBusDays.reduce((acc, val) => { - //Sum up the current day. - let dayhrs; - if (!!sbEntriesByDate[val]) { - dayhrs = sbEntriesByDate[val].reduce( - (dayAcc, dayVal) => { - return { - bodyhrs: dayAcc.bodyhrs + dayVal.bodyhrs, - painthrs: dayAcc.painthrs + dayVal.painthrs, - sales: - dayAcc.sales + dayVal.job.job_totals.totals.subtotal.amount / 100, - }; - }, - { bodyhrs: 0, painthrs: 0, sales: 0 } - ); - } else { - dayhrs = { - bodyhrs: 0, - painthrs: 0, - sales: 0, - }; - } + const data = listOfBusDays.reduce((acc, val) => { + //Sum up the current day. + let dayhrs; + if (!!sbEntriesByDate[val]) { + dayhrs = sbEntriesByDate[val].reduce( + (dayAcc, dayVal) => { + return { + bodyhrs: dayAcc.bodyhrs + dayVal.bodyhrs, + painthrs: dayAcc.painthrs + dayVal.painthrs, + sales: + dayAcc.sales + dayVal.job.job_totals.totals.subtotal.amount / 100, + }; + }, + {bodyhrs: 0, painthrs: 0, sales: 0} + ); + } else { + dayhrs = { + bodyhrs: 0, + painthrs: 0, + sales: 0, + }; + } - const theValue = { - date: moment(val).format("D ddd"), - paintHrs: _.round(dayhrs.painthrs, 1), - bodyHrs: _.round(dayhrs.bodyhrs, 1), - accTargetHrs: _.round( - Utils.AsOfDateTargetHours( - bodyshop.scoreboard_target.dailyBodyTarget + - bodyshop.scoreboard_target.dailyPaintTarget, - val - ) + - bodyshop.scoreboard_target.dailyBodyTarget + - bodyshop.scoreboard_target.dailyPaintTarget, - 1 - ), - accHrs: _.round( - acc.length > 0 - ? acc[acc.length - 1].accHrs + dayhrs.painthrs + dayhrs.bodyhrs - : dayhrs.painthrs + dayhrs.bodyhrs, - 1 - ), - sales: _.round(dayhrs.sales, 2), - accSales: _.round( - acc.length > 0 - ? acc[acc.length - 1].accSales + dayhrs.sales - : dayhrs.sales, - 2 - ), - }; + const theValue = { + date: dayjs(val).format("D ddd"), + paintHrs: _.round(dayhrs.painthrs, 1), + bodyHrs: _.round(dayhrs.bodyhrs, 1), + accTargetHrs: _.round( + Utils.AsOfDateTargetHours( + bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget, + val + ) + + bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget, + 1 + ), + accHrs: _.round( + acc.length > 0 + ? acc[acc.length - 1].accHrs + dayhrs.painthrs + dayhrs.bodyhrs + : dayhrs.painthrs + dayhrs.bodyhrs, + 1 + ), + sales: _.round(dayhrs.sales, 2), + accSales: _.round( + acc.length > 0 + ? acc[acc.length - 1].accSales + dayhrs.sales + : dayhrs.sales, + 2 + ), + }; - return [...acc, theValue]; - }, []); + return [...acc, theValue]; + }, []); - return ( - - - - - - - Dinero({ amount: Math.round(value * 100) }).toFormat() - } - orientation="right" - /> - - } /> - + return ( + + + + + + + Dinero({amount: Math.round(value * 100)}).toFormat() + } + orientation="right" + /> + + }/> + - - - + + + - - { - // - } - - - - - ); + + { + // + } + + + + + ); } diff --git a/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx b/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx index cfd6d945d..437983a69 100644 --- a/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx +++ b/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx @@ -1,50 +1,52 @@ -import { Card, Divider, Statistic } from "antd"; -import moment from "moment"; +import {Card, Divider, Statistic} from "antd"; +import dayjs from "../../utils/day"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ScoreboardDayStats({ bodyshop, date, entries }) { - const { dailyPaintTarget, dailyBodyTarget } = bodyshop.scoreboard_target; +export function ScoreboardDayStats({bodyshop, date, entries}) { + const {dailyPaintTarget, dailyBodyTarget} = bodyshop.scoreboard_target; - //let totalHrs = 0; - const paintHrs = entries.reduce((acc, value) => { - // totalHrs = +value.painthrs; - return acc + value.painthrs; - }, 0); + //let totalHrs = 0; + const paintHrs = entries.reduce((acc, value) => { + // totalHrs = +value.painthrs; + return acc + value.painthrs; + }, 0); - const bodyHrs = entries.reduce((acc, value) => { - //totalHrs = +value.bodyhrs; - return acc + value.bodyhrs; - }, 0); + const bodyHrs = entries.reduce((acc, value) => { + //totalHrs = +value.bodyhrs; + return acc + value.bodyhrs; + }, 0); - return ( - - bodyHrs ? "red" : "green" }} - label="B" - value={bodyHrs.toFixed(1)} - /> - paintHrs ? "red" : "green" }} - label="P" - value={paintHrs.toFixed(1)} - /> - + return ( + + bodyHrs ? "red" : "green"}} + label="B" + value={bodyHrs.toFixed(1)} + /> + paintHrs ? "red" : "green"}} + label="P" + value={paintHrs.toFixed(1)} + /> + - - - ); + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardDayStats); diff --git a/client/src/components/scoreboard-display/scoreboard-display.component.jsx b/client/src/components/scoreboard-display/scoreboard-display.component.jsx index a27b5c633..5479e0efb 100644 --- a/client/src/components/scoreboard-display/scoreboard-display.component.jsx +++ b/client/src/components/scoreboard-display/scoreboard-display.component.jsx @@ -1,125 +1,123 @@ -import { Col, Row } from "antd"; -import React, { useEffect } from "react"; +import {Col, Row} from "antd"; +import React, {useEffect} from "react"; import ScoreboardChart from "../scoreboard-chart/scoreboard-chart.component"; import ScoreboardLastDays from "../scoreboard-last-days/scoreboard-last-days.component"; import ScoreboardTargetsTable from "../scoreboard-targets-table/scoreboard-targets-table.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import moment from "moment"; -import { useApolloClient, useQuery } from "@apollo/client"; -import { - GET_BLOCKED_DAYS, - QUERY_SCOREBOARD, -} from "../../graphql/scoreboard.queries"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import {useApolloClient, useQuery} from "@apollo/client"; +import {GET_BLOCKED_DAYS, QUERY_SCOREBOARD,} from "../../graphql/scoreboard.queries"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScoreboardDisplayComponent); -export function ScoreboardDisplayComponent({ bodyshop }) { - const scoreboardSubscription = useQuery(QUERY_SCOREBOARD, { - variables: { - start: moment().startOf("month"), - end: moment().endOf("month"), - }, - pollInterval: 60000, - }); +export function ScoreboardDisplayComponent({bodyshop}) { + const scoreboardSubscription = useQuery(QUERY_SCOREBOARD, { + variables: { + start: dayjs().startOf("month"), + end: dayjs().endOf("month"), + }, + pollInterval: 60000, + }); - const { data } = scoreboardSubscription; - const client = useApolloClient(); - const scoreBoardlist = (data && data.scoreboard) || []; + const {data} = scoreboardSubscription; + const client = useApolloClient(); + const scoreBoardlist = (data && data.scoreboard) || []; - const sbEntriesByDate = {}; + const sbEntriesByDate = {}; - scoreBoardlist.forEach((i) => { - const entryDate = i.date; - if (!!!sbEntriesByDate[entryDate]) { - sbEntriesByDate[entryDate] = []; - } - sbEntriesByDate[entryDate].push(i); - }); + scoreBoardlist.forEach((i) => { + const entryDate = i.date; + if (!!!sbEntriesByDate[entryDate]) { + sbEntriesByDate[entryDate] = []; + } + sbEntriesByDate[entryDate].push(i); + }); - useEffect(() => { - //Update the locals. - async function setMomentSettings() { - let appointments; + useEffect(() => { + //Update the locals. + async function setDayJSSettings() { + let appointments; - if (!bodyshop.scoreboard_target.ignoreblockeddays) { - const { data } = await client.query({ - query: GET_BLOCKED_DAYS, - variables: { - start: moment().startOf("month"), - end: moment().endOf("month"), - }, - }); - appointments = data.appointments; - } - - moment.updateLocale("ca", { - workingWeekdays: translateSettingsToWorkingDays(bodyshop.workingdays), - ...(appointments - ? { - holidays: appointments.map((h) => - moment(h.start).format("MM-DD-YYYY") - ), + if (!bodyshop.scoreboard_target.ignoreblockeddays) { + const {data} = await client.query({ + query: GET_BLOCKED_DAYS, + variables: { + start: dayjs().startOf("month"), + end: dayjs().endOf("month"), + }, + }); + appointments = data.appointments; } - : {}), - holidayFormat: "MM-DD-YYYY", - }); - } - setMomentSettings(); - }, [client, bodyshop]); + dayjs.updateLocale("ca", { + workingWeekdays: translateSettingsToWorkingDays(bodyshop.workingdays), + ...(appointments + ? { + holidays: appointments.map((h) => + dayjs(h.start).format("MM-DD-YYYY") + ), + } + : {}), + holidayFormat: "MM-DD-YYYY", + }); + } - return ( - - - - + setDayJSSettings(); + }, [client, bodyshop]); - - - + return ( + + + + - - - - - ); + + + + + + + + + ); } function translateSettingsToWorkingDays(workingdays) { - const days = []; + const days = []; - if (workingdays.monday) { - days.push(1); - } - if (workingdays.tuesday) { - days.push(2); - } - if (workingdays.wednesday) { - days.push(3); - } - if (workingdays.thursday) { - days.push(4); - } - if (workingdays.friday) { - days.push(5); - } - if (workingdays.saturday) { - days.push(6); - } - if (workingdays.sunday) { - days.push(0); - } - return days; + if (workingdays.monday) { + days.push(1); + } + if (workingdays.tuesday) { + days.push(2); + } + if (workingdays.wednesday) { + days.push(3); + } + if (workingdays.thursday) { + days.push(4); + } + if (workingdays.friday) { + days.push(5); + } + if (workingdays.saturday) { + days.push(6); + } + if (workingdays.sunday) { + days.push(0); + } + return days; } diff --git a/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx b/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx index a8488e9dd..1d20ea88d 100644 --- a/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx +++ b/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx @@ -1,105 +1,113 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Dropdown, Form, InputNumber, notification } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { UPDATE_SCOREBOARD_ENTRY } from "../../graphql/scoreboard.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Dropdown, Form, InputNumber, notification} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {UPDATE_SCOREBOARD_ENTRY} from "../../graphql/scoreboard.queries"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; -export default function ScoreboardEntryEdit({ entry }) { - const [visible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const [updateScoreboardentry] = useMutation(UPDATE_SCOREBOARD_ENTRY); +export default function ScoreboardEntryEdit({entry}) { + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const [updateScoreboardentry] = useMutation(UPDATE_SCOREBOARD_ENTRY); - const handleFinish = async (values) => { - setLoading(true); - const result = await updateScoreboardentry({ - variables: { sbId: entry.id, sbInput: values }, - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateScoreboardentry({ + variables: {sbId: entry.id, sbInput: values}, + }); - if (!!result.errors) { - notification["error"]({ - message: t("scoreboard.errors.updating", { - message: JSON.stringify(result.errors), - }), - }); - return; - } else { - notification["success"]({ - message: t("scoreboard.successes.updated"), - }); - setVisible(false); + if (!!result.errors) { + notification["error"]({ + message: t("scoreboard.errors.updating", { + message: JSON.stringify(result.errors), + }), + }); + return; + } else { + notification["success"]({ + message: t("scoreboard.successes.updated"), + }); + setOpen(false); + } + setLoading(false); + }; + + + const menu = { + items: [ + { + key: '1', + label: ( + +
    e.stopPropagation()} + > + + + + + + + + + + + + +
    +
    + ) + } + ] } - setLoading(false); - }; - const popContent = ( - -
    e.stopPropagation()} - > - - - - - - - - - - - - -
    -
    - ); - - return ( -
    - - - -
    - ); + return ( +
    + + + +
    + ); } diff --git a/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx b/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx index 6b1c13ca3..7799a5473 100644 --- a/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx +++ b/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx @@ -1,166 +1,172 @@ -import { useQuery } from "@apollo/client"; -import { Button, Card, Input, Modal, Space, Table, Typography } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { QUERY_SCOREBOARD_PAGINATED } from "../../graphql/scoreboard.queries"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Input, Modal, Space, Table, Typography} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; +import {QUERY_SCOREBOARD_PAGINATED} from "../../graphql/scoreboard.queries"; +import {DateFormatter} from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import ScoreboardEntryEdit from "../scoreboard-entry-edit/scoreboard-entry-edit.component"; import ScoreboardRemoveButton from "../scoreboard-remove-button/scorebard-remove-button.component"; -import { SyncOutlined } from "@ant-design/icons"; +import {SyncOutlined} from "@ant-design/icons"; import {pageLimit} from "../../utils/config"; -export default function ScoreboardJobsList({ scoreBoardlist }) { - const { t } = useTranslation(); - const [state, setState] = useState({ - visible: false, - search: "", - current: 1, - pageSize: pageLimit, - }); - const { loading, error, data, refetch } = useQuery( - QUERY_SCOREBOARD_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: !state.visible, - variables: { - search: state.search !== "" ? `%${state.search}%` : null, - offset: state.current ? (state.current - 1) * state.pageSize : 0, - limit: state.pageSize, - order: [ - { - date: "desc", - }, - ], - }, - } - ); +export default function ScoreboardJobsList({scoreBoardlist}) { + const {t} = useTranslation(); + const [state, setState] = useState({ + open: false, + search: "", + current: 1, + pageSize: pageLimit, + }); - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - render: (text, record) => ( - - {record.job.ro_number || t("general.labels.na")} - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - ellipsis: true, - - render: (text, record) => , - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => ( - {`${record.job.v_model_yr || ""} ${ - record.job.v_make_desc || "" - } ${record.job.v_model_desc || ""}`} - ), - }, - { - title: t("scoreboard.fields.date"), - dataIndex: "date", - key: "date", - render: (text, record) => {record.date}, - }, - { - title: t("scoreboard.fields.painthrs"), - dataIndex: "painthrs", - key: "painthrs", - }, - { - title: t("scoreboard.fields.bodyhrs"), - dataIndex: "bodyhrs", - key: "bodyhrs", - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - - - - ), - }, - ]; - - return ( - <> - - setState((state) => ({ - ...state, - visible: false, - current: 1, - search: "", - })) + const {loading, error, data, refetch} = useQuery( + QUERY_SCOREBOARD_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !state.open, + variables: { + search: state.search !== "" ? `%${state.search}%` : null, + offset: state.current ? (state.current - 1) * state.pageSize : 0, + limit: state.pageSize, + order: [ + { + date: "desc", + }, + ], + }, } - > - {error && ( - - )} - - - - {t("general.labels.searchresults", { search: state.search })} - - { - setState((state) => ({ ...state, search: value })); + ); + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + render: (text, record) => ( + + {record.job.ro_number || t("general.labels.na")} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + + render: (text, record) => , + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => ( + {`${record.job.v_model_yr || ""} ${ + record.job.v_make_desc || "" + } ${record.job.v_model_desc || ""}`} + ), + }, + { + title: t("scoreboard.fields.date"), + dataIndex: "date", + key: "date", + render: (text, record) => {record.date}, + }, + { + title: t("scoreboard.fields.painthrs"), + dataIndex: "painthrs", + key: "painthrs", + }, + { + title: t("scoreboard.fields.bodyhrs"), + dataIndex: "bodyhrs", + key: "bodyhrs", + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + + + + ), + }, + ]; + + return ( + <> + { + setState((state) => ({...state, open: false})); }} - //value={state.search} - enterButton - /> - - } - > - e.stopPropagation()} - onChange={(tableArgs) => - setState((state) => ({ ...state, ...tableArgs })) - } - pagination={{ - position: "top", - pageSize: state.pageSize || pageLimit, - current: state.current || 1, - total: data ? data.scoreboard_aggregate.aggregate.count : 0, - }} - /> - - - - - ); + onCancel={() => + setState((state) => ({ + ...state, + open: false, + current: 1, + search: "", + })) + } + > + {error && ( + + )} + + + + {t("general.labels.searchresults", {search: state.search})} + + { + setState((state) => ({...state, search: value})); + }} + //value={state.search} + enterButton + /> + + } + > +
    e.stopPropagation()} + onChange={(tableArgs) => + setState((state) => ({...state, ...tableArgs})) + } + pagination={{ + position: "top", + pageSize: state.pageSize || pageLimit, + current: state.current || 1, + total: data ? data.scoreboard_aggregate.aggregate.count : 0, + }} + /> + + + + + ); } diff --git a/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx index f88b897ef..8430e6a00 100644 --- a/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx +++ b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx @@ -1,39 +1,41 @@ import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import moment from "moment"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; import ScoreboardDayStat from "../scoreboard-day-stats/scoreboard-day-stats.component"; -import { Row, Col } from "antd"; +import {Col, Row} from "antd"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ScoreboardLastDays({ bodyshop, sbEntriesByDate }) { - const { lastNumberWorkingDays } = bodyshop.scoreboard_target; +export function ScoreboardLastDays({bodyshop, sbEntriesByDate}) { - const ArrayOfDate = []; - for (var i = lastNumberWorkingDays - 1; i >= 0; i--) { - ArrayOfDate.push(moment().businessSubtract(i, "day").format("yyyy-MM-DD")); - } + const {lastNumberWorkingDays} = bodyshop.scoreboard_target; - return ( - - {ArrayOfDate.map((a) => ( - - {!!sbEntriesByDate ? ( - - ) : ( - - )} - - ))} - - ); + const ArrayOfDate = []; + for (var i = lastNumberWorkingDays - 1; i >= 0; i--) { + ArrayOfDate.push(dayjs().businessDaysSubtract(i, "day").format("YYYY-MM-DD")); + } + + return ( + + {ArrayOfDate.map((a) => ( + + {!!sbEntriesByDate ? ( + + ) : ( + + )} + + ))} + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardLastDays); diff --git a/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx b/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx index 833c9c502..b8a0c8276 100644 --- a/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx +++ b/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx @@ -1,42 +1,42 @@ -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Button, notification } from "antd"; -import { DeleteFilled } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { DELETE_SCOREBOARD_ENTRY } from "../../graphql/scoreboard.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Button, notification} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {DELETE_SCOREBOARD_ENTRY} from "../../graphql/scoreboard.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -export default function ScoreboardRemoveButton({ scoreboardId }) { - const { t } = useTranslation(); - const [deleteScoreboardEntry] = useMutation(DELETE_SCOREBOARD_ENTRY); - const [loading, setLoading] = useState(false); - const handleDelete = async (e) => { - logImEXEvent("scoreboard_remove_job"); +export default function ScoreboardRemoveButton({scoreboardId}) { + const {t} = useTranslation(); + const [deleteScoreboardEntry] = useMutation(DELETE_SCOREBOARD_ENTRY); + const [loading, setLoading] = useState(false); + const handleDelete = async (e) => { + logImEXEvent("scoreboard_remove_job"); - e.stopPropagation(); - setLoading(true); - const result = await deleteScoreboardEntry({ - variables: { sbId: scoreboardId }, - awaitRefetchQueries: true, - refetchQueries: ["QUERY_SCOREBOARD_PAGINATED"], - }); + e.stopPropagation(); + setLoading(true); + const result = await deleteScoreboardEntry({ + variables: {sbId: scoreboardId}, + awaitRefetchQueries: true, + refetchQueries: ["QUERY_SCOREBOARD_PAGINATED"], + }); - if (!!result.errors) { - notification["error"]({ - message: t("scoreboard.errors.removing", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("scoreboard.successes.removed"), - }); - } - setLoading(false); - }; - return ( - - ); + if (!!result.errors) { + notification["error"]({ + message: t("scoreboard.errors.removing", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("scoreboard.successes.removed"), + }); + } + setLoading(false); + }; + return ( + + ); } diff --git a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx index 112d441f6..3cfb5aeff 100644 --- a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx +++ b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx @@ -1,251 +1,252 @@ -import { CalendarOutlined } from "@ant-design/icons"; -import { Card, Col, Divider, Row, Statistic } from "antd"; +import {CalendarOutlined} from "@ant-design/icons"; +import {Card, Col, Divider, Row, Statistic} from "antd"; import _ from "lodash"; -import moment from "moment"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ScoreboardJobsList from "../scoreboard-jobs-list/scoreboard-jobs-list.component"; import * as Util from "./scoreboard-targets-table.util"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); const rowGutter = [16, 16]; -const statSpans = { xs: 24, sm: 3 }; +const statSpans = {xs: 24, sm: 3}; -export function ScoreboardTargetsTable({ bodyshop, scoreBoardlist }) { - const { t } = useTranslation(); +export function ScoreboardTargetsTable({bodyshop, scoreBoardlist}) { + const {t} = useTranslation(); - const values = useMemo(() => { - const dateHash = _.groupBy(scoreBoardlist, "date"); + const values = useMemo(() => { + const dateHash = _.groupBy(scoreBoardlist, "date"); - let ret = { - todayBody: 0, - todayPaint: 0, - weeklyPaint: 0, - weeklyBody: 0, - toDateBody: 0, - toDatePaint: 0, - }; + let ret = { + todayBody: 0, + todayPaint: 0, + weeklyPaint: 0, + weeklyBody: 0, + toDateBody: 0, + toDatePaint: 0, + }; - const today = moment(); - if (dateHash[today.format("YYYY-MM-DD")]) { - dateHash[today.format("YYYY-MM-DD")].forEach((d) => { - ret.todayBody = ret.todayBody + d.bodyhrs; - ret.todayPaint = ret.todayPaint + d.painthrs; - }); - } + const today = dayjs(); + if (dateHash[today.format("YYYY-MM-DD")]) { + dateHash[today.format("YYYY-MM-DD")].forEach((d) => { + ret.todayBody = ret.todayBody + d.bodyhrs; + ret.todayPaint = ret.todayPaint + d.painthrs; + }); + } - let StartOfWeek = moment().startOf("week"); - while (StartOfWeek.isSameOrBefore(today)) { - if (dateHash[StartOfWeek.format("YYYY-MM-DD")]) { - dateHash[StartOfWeek.format("YYYY-MM-DD")].forEach((d) => { - ret.weeklyBody = ret.weeklyBody + d.bodyhrs; - ret.weeklyPaint = ret.weeklyPaint + d.painthrs; - }); - } - StartOfWeek = StartOfWeek.add(1, "day"); - } + let StartOfWeek = dayjs().startOf("week"); + while (StartOfWeek.isSameOrBefore(today)) { + if (dateHash[StartOfWeek.format("YYYY-MM-DD")]) { + dateHash[StartOfWeek.format("YYYY-MM-DD")].forEach((d) => { + ret.weeklyBody = ret.weeklyBody + d.bodyhrs; + ret.weeklyPaint = ret.weeklyPaint + d.painthrs; + }); + } + StartOfWeek = StartOfWeek.add(1, "day"); + } - let startOfMonth = moment().startOf("month"); - while (startOfMonth.isSameOrBefore(today)) { - if (dateHash[startOfMonth.format("YYYY-MM-DD")]) { - dateHash[startOfMonth.format("YYYY-MM-DD")].forEach((d) => { - ret.toDateBody = ret.toDateBody + d.bodyhrs; - ret.toDatePaint = ret.toDatePaint + d.painthrs; - }); - } - startOfMonth = startOfMonth.add(1, "day"); - } + let startOfMonth = dayjs().startOf("month"); + while (startOfMonth.isSameOrBefore(today)) { + if (dateHash[startOfMonth.format("YYYY-MM-DD")]) { + dateHash[startOfMonth.format("YYYY-MM-DD")].forEach((d) => { + ret.toDateBody = ret.toDateBody + d.bodyhrs; + ret.toDatePaint = ret.toDatePaint + d.painthrs; + }); + } + startOfMonth = startOfMonth.add(1, "day"); + } - return ret; - }, [scoreBoardlist]); + return ret; + }, [scoreBoardlist]); - return ( - } - > - - - } - /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); + return ( + } + > + + + } + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScoreboardTargetsTable); diff --git a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js index c69493108..ffcd5cf55 100644 --- a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js +++ b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js @@ -1,88 +1,54 @@ -import moment from "moment-business-days"; +import dayjs from "../../utils/day"; -// moment.updateLocale("ca", { -// workingWeekdays: [1, 2, 3, 4, 5, 6], -// }); +export const CalculateWorkingDaysThisMonth = () => + dayjs().endOf("month").businessDaysInMonth().length; -export const CalculateWorkingDaysThisMonth = () => { - return moment().endOf("month").businessDaysIntoMonth(); -}; +export const CalculateWorkingDaysInPeriod = (start, end) => + dayjs(end).businessDiff(dayjs(start)); -export const CalculateWorkingDaysInPeriod = (start, end) => { - return moment(start).businessDiff(moment(end)); -}; +export const CalculateWorkingDaysAsOfToday = () => + dayjs().businessDaysInMonth().length; -export const CalculateWorkingDaysAsOfToday = () => { - return moment().businessDaysIntoMonth(); -}; +export const CalculateWorkingDaysLastMonth = () => + dayjs().subtract(1, "month").endOf("month").businessDaysInMonth().length; -export const CalculateWorkingDaysLastMonth = () => { - return moment().subtract(1, "month").endOf("month").businessDaysIntoMonth(); -}; +export const WeeklyTargetHrs = (dailyTargetHrs) => + dailyTargetHrs * CalculateWorkingDaysInPeriod(dayjs().startOf("week"), dayjs().endOf("week")); -export const WeeklyTargetHrs = (dailyTargetHrs, bodyshop) => { - return ( - dailyTargetHrs * - CalculateWorkingDaysInPeriod( - moment().startOf("week"), - moment().endOf("week") - ) - ); -}; +export const WeeklyTargetHrsInPeriod = (dailyTargetHrs, start, end) => + dailyTargetHrs * CalculateWorkingDaysInPeriod(start, end); -export const WeeklyTargetHrsInPeriod = ( - dailyTargetHrs, - start, - end, - bodyshop -) => { - return dailyTargetHrs * CalculateWorkingDaysInPeriod(start, end); -}; +export const MonthlyTargetHrs = (dailyTargetHrs) => + dailyTargetHrs * CalculateWorkingDaysThisMonth(); -export const MonthlyTargetHrs = (dailyTargetHrs, bodyshop) => { - return dailyTargetHrs * CalculateWorkingDaysThisMonth(); -}; +export const LastMonthTargetHrs = (dailyTargetHrs) => + dailyTargetHrs * CalculateWorkingDaysLastMonth(); -export const LastMonthTargetHrs = (dailyTargetHrs, bodyshop) => { - return dailyTargetHrs * CalculateWorkingDaysLastMonth(); -}; +export const AsOfTodayTargetHrs = (dailyTargetHrs) => + dailyTargetHrs * CalculateWorkingDaysAsOfToday(); -export const AsOfTodayTargetHrs = (dailyTargetHrs, bodyshop) => { - return dailyTargetHrs * CalculateWorkingDaysAsOfToday(); -}; - -export const AsOfDateTargetHours = (dailyTargetHours, date) => { - return ( - dailyTargetHours * moment().startOf("month").businessDiff(moment(date)) - ); -}; - -export const ListOfBusinessDaysInCurrentMonth = () => { - const momentListOfDays = moment().monthBusinessDays(); - - return momentListOfDays.map((i) => i.format("YYYY-MM-DD")); -}; +export const AsOfDateTargetHours = (dailyTargetHours, date) => + dailyTargetHours * dayjs(date).businessDiff(dayjs().startOf("month")); export const ListOfDaysInCurrentMonth = () => { - const days = []; - const dateStart = moment().startOf("month"); - const dateEnd = moment().endOf("month"); - while (dateEnd.diff(dateStart, "days") > 0) { - days.push(dateStart.format("YYYY-MM-DD")); - dateStart.add(1, "days"); - } - days.push(dateEnd.format("YYYY-MM-DD")); - return days; + const days = []; + let dateStart = dayjs().startOf("month"); + const dateEnd = dayjs().endOf("month"); + while (dateEnd.diff(dateStart, "day") > 0) { + days.push(dateStart.format("YYYY-MM-DD")); + dateStart = dateStart.add(1, "day"); + } + days.push(dateEnd.format("YYYY-MM-DD")); + return days; }; -export const ListDaysBetween = ({ start, end }) => { - const days = []; - const dateStart = moment(start); - const dateEnd = moment(end); - while (dateEnd.diff(dateStart, "days") > 0) { - days.push(dateStart.format("YYYY-MM-DD")); - dateStart.add(1, "days"); - } - days.push(dateEnd.format("YYYY-MM-DD")); - return days; -}; +export const ListDaysBetween = ({start, end}) => { + const days = []; + let dateStart = dayjs(start); + const dateEnd = dayjs(end); + while (dateEnd.diff(dateStart, "day") >= 0) { + days.push(dateStart.format("YYYY-MM-DD")); + dateStart = dateStart.add(1, "day"); + } + return days; +}; \ No newline at end of file diff --git a/client/src/components/scoreboard-timetickets-stats/chart-custom-tooltip.jsx b/client/src/components/scoreboard-timetickets-stats/chart-custom-tooltip.jsx index b351a60db..0145f2b49 100644 --- a/client/src/components/scoreboard-timetickets-stats/chart-custom-tooltip.jsx +++ b/client/src/components/scoreboard-timetickets-stats/chart-custom-tooltip.jsx @@ -1,26 +1,26 @@ -const CustomTooltip = ({ active, payload, label }) => { - if (active && payload && payload.length) { - return ( -
    -

    {label}

    - {payload.map((data, index) => { - return ( -

    {`${ - data.name - } : ${data.value.toFixed(1)}`}

    - ); - })} -
    - ); - } +const CustomTooltip = ({active, payload, label}) => { + if (active && payload && payload.length) { + return ( +
    +

    {label}

    + {payload.map((data, index) => { + return ( +

    {`${ + data.name + } : ${data.value.toFixed(1)}`}

    + ); + })} +
    + ); + } - return null; + return null; }; export default CustomTooltip; diff --git a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.chart.component.jsx b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.chart.component.jsx index 36c193c33..30d08761a 100644 --- a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.chart.component.jsx +++ b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.chart.component.jsx @@ -1,54 +1,44 @@ -import { Card } from "antd"; +import {Card} from "antd"; import React from "react"; -import { - Area, - CartesianGrid, - ComposedChart, - Legend, - Line, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from "recharts"; +import {Area, CartesianGrid, ComposedChart, Legend, Line, ResponsiveContainer, Tooltip, XAxis, YAxis,} from "recharts"; import CustomTooltip from "./chart-custom-tooltip"; const graphProps = { - strokeWidth: 3, + strokeWidth: 3, }; -export default function ScoreboardTimeTicketsChart({ data, chartTitle }) { - return ( - - - - - - - } /> - - +export default function ScoreboardTimeTicketsChart({data, chartTitle}) { + return ( + + + + + + + }/> + + - - - - - ); + + + + + ); } diff --git a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx index af4f28695..11cbebca9 100644 --- a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx +++ b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx @@ -1,13 +1,13 @@ -import { useQuery } from "@apollo/client"; -import { Col, Row } from "antd"; +import {useQuery} from "@apollo/client"; +import {Col, Row} from "antd"; import _ from "lodash"; -import moment from "moment"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_TIME_TICKETS_IN_RANGE_SB } from "../../graphql/timetickets.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_TIME_TICKETS_IN_RANGE_SB} from "../../graphql/timetickets.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util"; @@ -16,393 +16,396 @@ import ScoreboardTicketsStats from "./scoreboard-timetickets.stats.component"; import ScoreboardTimeticketsTargetsTable from "./scoreboard-timetickets.targets-table.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScoreboardTimeTicketsStats); -export function ScoreboardTimeTicketsStats({ bodyshop }) { - const { t } = useTranslation(); - const startDate = moment().startOf("month"); - const endDate = moment().endOf("month"); +export function ScoreboardTimeTicketsStats({bodyshop}) { + const {t} = useTranslation(); + const startDate = dayjs().startOf("month") + const endDate = dayjs().endOf("month"); - const fixedPeriods = useMemo(() => { - const endOfThisMonth = moment().endOf("month"); - const startofthisMonth = moment().startOf("month"); + const fixedPeriods = useMemo(() => { + const endOfThisMonth = dayjs().endOf("month"); + const startofthisMonth = dayjs().startOf("month"); - const endOfLastmonth = moment().subtract(1, "month").endOf("month"); - const startOfLastmonth = moment().subtract(1, "month").startOf("month"); + const endOfLastmonth = dayjs().subtract(1, "month").endOf("month"); + const startOfLastmonth = dayjs().subtract(1, "month").startOf("month"); - const endOfThisWeek = moment().endOf("week"); - const startOfThisWeek = moment().startOf("week"); + const endOfThisWeek = dayjs().endOf("week"); + const startOfThisWeek = dayjs().startOf("week"); - const endOfLastWeek = moment().subtract(1, "week").endOf("week"); - const startOfLastWeek = moment().subtract(1, "week").startOf("week"); + const endOfLastWeek = dayjs().subtract(1, "week").endOf("week"); + const startOfLastWeek = dayjs().subtract(1, "week").startOf("week"); - const endOfPriorWeek = moment().subtract(2, "week").endOf("week"); - const startOfPriorWeek = moment().subtract(2, "week").startOf("week"); + const endOfPriorWeek = dayjs().subtract(2, "week").endOf("week"); + const startOfPriorWeek = dayjs().subtract(2, "week").startOf("week"); - const allDates = [ - endOfThisMonth, - startofthisMonth, - endOfLastmonth, - startOfLastmonth, - endOfThisWeek, - startOfThisWeek, - endOfLastWeek, - startOfLastWeek, - endOfPriorWeek, - startOfPriorWeek, - ]; - const start = moment.min(allDates); - const end = moment.max(allDates); - return { - start, - end, - endOfThisMonth, - startofthisMonth, - endOfLastmonth, - startOfLastmonth, - endOfThisWeek, - startOfThisWeek, - endOfLastWeek, - startOfLastWeek, - endOfPriorWeek, - startOfPriorWeek, - }; - }, []); + const allDates = [ + endOfThisMonth, + startofthisMonth, + endOfLastmonth, + startOfLastmonth, + endOfThisWeek, + startOfThisWeek, + endOfLastWeek, + startOfLastWeek, + endOfPriorWeek, + startOfPriorWeek, + ]; + const start = dayjs.min(allDates); + const end = dayjs.max(allDates); + return { + start, + end, + endOfThisMonth, + startofthisMonth, + endOfLastmonth, + startOfLastmonth, + endOfThisWeek, + startOfThisWeek, + endOfLastWeek, + startOfLastWeek, + endOfPriorWeek, + startOfPriorWeek, + }; + }, []); - const { loading, error, data } = useQuery(QUERY_TIME_TICKETS_IN_RANGE_SB, { - variables: { - start: startDate.format("YYYY-MM-DD"), - end: endDate.format("YYYY-MM-DD"), - fixedStart: fixedPeriods.start.format("YYYY-MM-DD"), - fixedEnd: fixedPeriods.end.format("YYYY-MM-DD"), - jobStart: startDate, - jobEnd: endDate, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - pollInterval: 60000, - skip: !fixedPeriods, - }); - - const calculatedData = useMemo(() => { - if (!data) return []; - const ret = { - totalThisWeek: 0, - totalThisWeekLAB: 0, - totalThisWeekLAR: 0, - totalLastWeek: 0, - totalLastWeekLAB: 0, - totalLastWeekLAR: 0, - totalPriorWeek: 0, - totalPriorWeekLAB: 0, - totalPriorWeekLAR: 0, - totalThisMonth: 0, - totalThisMonthLAB: 0, - totalThisMonthLAR: 0, - totalLastMonth: 0, - totalLastMonthLAB: 0, - totalLastMonthLAR: 0, - actualTotalOverPeriod: 0, - actualTotalOverPeriodLAB: 0, - actualTotalOverPeriodLAR: 0, - totalEffieciencyOverPeriod: 0, - totalEffieciencyOverPeriodLAB: 0, - totalEffieciencyOverPeriodLAR: 0, - seperatedThisWeek: { - sunday: { - total: 0, - lab: 0, - lar: 0, + const {loading, error, data} = useQuery(QUERY_TIME_TICKETS_IN_RANGE_SB, { + variables: { + start: startDate.format("YYYY-MM-DD"), + end: endDate.format("YYYY-MM-DD"), + fixedStart: fixedPeriods.start.format("YYYY-MM-DD"), + fixedEnd: fixedPeriods.end.format("YYYY-MM-DD"), + jobStart: startDate, + jobEnd: endDate, }, - monday: { - total: 0, - lab: 0, - lar: 0, - }, - tuesday: { - total: 0, - lab: 0, - lar: 0, - }, - wednesday: { - total: 0, - lab: 0, - lar: 0, - }, - thursday: { - total: 0, - lab: 0, - lar: 0, - }, - friday: { - total: 0, - lab: 0, - lar: 0, - }, - saturday: { - total: 0, - lab: 0, - lar: 0, - }, - }, - }; - - data.fixedperiod.forEach((ticket) => { - const ticketDate = moment(ticket.date); - if ( - ticketDate.isBetween( - fixedPeriods.startOfThisWeek, - fixedPeriods.endOfThisWeek, - undefined, - "[]" - ) - ) { - ret.totalThisWeek = ret.totalThisWeek + ticket.productivehrs; - if (ticket.ciecacode !== "LAR") - ret.totalThisWeekLAB = ret.totalThisWeekLAB + ticket.productivehrs; - if (ticket.ciecacode === "LAR") - ret.totalThisWeekLAR = ret.totalThisWeekLAR + ticket.productivehrs; - - //Seperate out to Day of Week - ret.seperatedThisWeek[ - moment(ticket.date).format("dddd").toLowerCase() - ].total = - ret.seperatedThisWeek[ - moment(ticket.date).format("dddd").toLowerCase() - ].total + ticket.productivehrs; - if (ticket.ciecacode !== "LAR") - ret.seperatedThisWeek[ - moment(ticket.date).format("dddd").toLowerCase() - ].lab = - ret.seperatedThisWeek[ - moment(ticket.date).format("dddd").toLowerCase() - ].lab + ticket.productivehrs; - if (ticket.ciecacode === "LAR") - ret.seperatedThisWeek[ - moment(ticket.date).format("dddd").toLowerCase() - ].lar = - ret.seperatedThisWeek[ - moment(ticket.date).format("dddd").toLowerCase() - ].lar + ticket.productivehrs; - } else if ( - ticketDate.isBetween( - fixedPeriods.startOfLastWeek, - fixedPeriods.endOfLastWeek, - undefined, - "[]" - ) - ) { - ret.totalLastWeek = ret.totalLastWeek + ticket.productivehrs; - if (ticket.ciecacode !== "LAR") - ret.totalLastWeekLAB = ret.totalLastWeekLAB + ticket.productivehrs; - if (ticket.ciecacode === "LAR") - ret.totalLastWeekLAR = ret.totalLastWeekLAR + ticket.productivehrs; - } else if ( - ticketDate.isBetween( - fixedPeriods.startOfPriorWeek, - fixedPeriods.endOfPriorWeek, - undefined, - "[]" - ) - ) { - ret.totalPriorWeek = ret.totalPriorWeek + ticket.productivehrs; - if (ticket.ciecacode !== "LAR") - ret.totalPriorWeekLAB = ret.totalPriorWeekLAB + ticket.productivehrs; - if (ticket.ciecacode === "LAR") - ret.totalPriorWeekLAR = ret.totalPriorWeekLAR + ticket.productivehrs; - } - if ( - ticketDate.isBetween( - fixedPeriods.startofthisMonth, - fixedPeriods.endOfThisMonth, - undefined, - "[]" - ) - ) { - ret.totalThisMonth = ret.totalThisMonth + ticket.productivehrs; - ret.actualTotalOverPeriod = - ret.actualTotalOverPeriod + (ticket.actualhrs || 0); - if (ticket.ciecacode !== "LAR") { - ret.totalThisMonthLAB = ret.totalThisMonthLAB + ticket.productivehrs; - ret.actualTotalOverPeriodLAB = - ret.actualTotalOverPeriodLAB + (ticket.actualhrs || 0); - } - if (ticket.ciecacode === "LAR") { - ret.totalThisMonthLAR = ret.totalThisMonthLAR + ticket.productivehrs; - ret.actualTotalOverPeriodLAR = - ret.actualTotalOverPeriodLAR + (ticket.actualhrs || 0); - } - } else if ( - ticketDate.isBetween( - fixedPeriods.startOfLastmonth, - fixedPeriods.endOfLastmonth, - undefined, - "[]" - ) - ) { - ret.totalLastMonth = ret.totalLastMonth + ticket.productivehrs; - if (ticket.ciecacode !== "LAR") - ret.totalLastMonthLAB = ret.totalLastMonthLAB + ticket.productivehrs; - if (ticket.ciecacode === "LAR") - ret.totalLastMonthLAR = ret.totalLastMonthLAR + ticket.productivehrs; - } + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + pollInterval: 60000, + skip: !fixedPeriods, }); - ret.totalEffieciencyOverPeriod = ret.actualTotalOverPeriod - ? (ret.totalThisMonth / ret.actualTotalOverPeriod) * 100 - : 0; - ret.totalEffieciencyOverPeriodLAB = ret.actualTotalOverPeriodLAB - ? (ret.totalThisMonthLAB / ret.actualTotalOverPeriodLAB) * 100 - : 0; - ret.totalEffieciencyOverPeriodLAR = ret.actualTotalOverPeriodLAR - ? (ret.totalThisMonthLAR / ret.actualTotalOverPeriodLAR) * 100 - : 0; + const calculatedData = useMemo(() => { + if (!data) return []; + const ret = { + totalThisWeek: 0, + totalThisWeekLAB: 0, + totalThisWeekLAR: 0, + totalLastWeek: 0, + totalLastWeekLAB: 0, + totalLastWeekLAR: 0, + totalPriorWeek: 0, + totalPriorWeekLAB: 0, + totalPriorWeekLAR: 0, + totalThisMonth: 0, + totalThisMonthLAB: 0, + totalThisMonthLAR: 0, + totalLastMonth: 0, + totalLastMonthLAB: 0, + totalLastMonthLAR: 0, + actualTotalOverPeriod: 0, + actualTotalOverPeriodLAB: 0, + actualTotalOverPeriodLAR: 0, + totalEffieciencyOverPeriod: 0, + totalEffieciencyOverPeriodLAB: 0, + totalEffieciencyOverPeriodLAR: 0, + seperatedThisWeek: { + sunday: { + total: 0, + lab: 0, + lar: 0, + }, + monday: { + total: 0, + lab: 0, + lar: 0, + }, + tuesday: { + total: 0, + lab: 0, + lar: 0, + }, + wednesday: { + total: 0, + lab: 0, + lar: 0, + }, + thursday: { + total: 0, + lab: 0, + lar: 0, + }, + friday: { + total: 0, + lab: 0, + lar: 0, + }, + saturday: { + total: 0, + lab: 0, + lar: 0, + }, + }, + }; - roundObject(ret); + data.fixedperiod.forEach((ticket) => { + const ticketDate = dayjs(ticket.date); + if ( + ticketDate.isBetween( + fixedPeriods.startOfThisWeek, + fixedPeriods.endOfThisWeek, + undefined, + "[]" + ) + ) { + ret.totalThisWeek = ret.totalThisWeek + ticket.productivehrs; + if (ticket.ciecacode !== "LAR") + ret.totalThisWeekLAB = ret.totalThisWeekLAB + ticket.productivehrs; + if (ticket.ciecacode === "LAR") + ret.totalThisWeekLAR = ret.totalThisWeekLAR + ticket.productivehrs; - const ticketsGroupedByDate = _.groupBy(data.timetickets, "date"); - - const listOfDays = Utils.ListOfDaysInCurrentMonth(); - - const combinedData = [], - labData = [], - larData = []; - var acc_comb = 0; - var acc_lab = 0; - var acc_lar = 0; - - listOfDays.forEach((day) => { - const r = { - date: moment(day).format("MM/DD"), - actualhrs: 0, - productivehrs: 0, - }; - - const combined = { - accTargetHrs: _.round( - Utils.AsOfDateTargetHours( - bodyshop.scoreboard_target.dailyBodyTarget + - bodyshop.scoreboard_target.dailyPaintTarget, - day - ) + - (bodyshop.scoreboard_target.dailyBodyTarget + - bodyshop.scoreboard_target.dailyPaintTarget), - 1 - ), - accHrs: 0, - }; - const lab = { - accTargetHrs: _.round( - Utils.AsOfDateTargetHours( - bodyshop.scoreboard_target.dailyBodyTarget, - day - ) + bodyshop.scoreboard_target.dailyBodyTarget, - 1 - ), - accHrs: 0, - }; - const lar = { - accTargetHrs: _.round( - Utils.AsOfDateTargetHours( - bodyshop.scoreboard_target.dailyPaintTarget, - day - ) + bodyshop.scoreboard_target.dailyPaintTarget, - 1 - ), - accHrs: 0, - }; - - if (ticketsGroupedByDate[day]) { - ticketsGroupedByDate[day].forEach((ticket) => { - r.actualhrs = r.actualhrs + ticket.actualhrs; - r.productivehrs = r.productivehrs + ticket.productivehrs; - acc_comb = acc_comb + ticket.productivehrs; - - if (ticket.ciecacode !== "LAR") - acc_lab = acc_lab + ticket.productivehrs; - if (ticket.ciecacode === "LAR") - acc_lar = acc_lar + ticket.productivehrs; + //Seperate out to Day of Week + ret.seperatedThisWeek[ + dayjs(ticket.date).format("dddd").toLowerCase() + ].total = + ret.seperatedThisWeek[ + dayjs(ticket.date).format("dddd").toLowerCase() + ].total + ticket.productivehrs; + if (ticket.ciecacode !== "LAR") + ret.seperatedThisWeek[ + dayjs(ticket.date).format("dddd").toLowerCase() + ].lab = + ret.seperatedThisWeek[ + dayjs(ticket.date).format("dddd").toLowerCase() + ].lab + ticket.productivehrs; + if (ticket.ciecacode === "LAR") + ret.seperatedThisWeek[ + dayjs(ticket.date).format("dddd").toLowerCase() + ].lar = + ret.seperatedThisWeek[ + dayjs(ticket.date).format("dddd").toLowerCase() + ].lar + ticket.productivehrs; + } else if ( + ticketDate.isBetween( + fixedPeriods.startOfLastWeek, + fixedPeriods.endOfLastWeek, + undefined, + "[]" + ) + ) { + ret.totalLastWeek = ret.totalLastWeek + ticket.productivehrs; + if (ticket.ciecacode !== "LAR") + ret.totalLastWeekLAB = ret.totalLastWeekLAB + ticket.productivehrs; + if (ticket.ciecacode === "LAR") + ret.totalLastWeekLAR = ret.totalLastWeekLAR + ticket.productivehrs; + } else if ( + ticketDate.isBetween( + fixedPeriods.startOfPriorWeek, + fixedPeriods.endOfPriorWeek, + undefined, + "[]" + ) + ) { + ret.totalPriorWeek = ret.totalPriorWeek + ticket.productivehrs; + if (ticket.ciecacode !== "LAR") + ret.totalPriorWeekLAB = ret.totalPriorWeekLAB + ticket.productivehrs; + if (ticket.ciecacode === "LAR") + ret.totalPriorWeekLAR = ret.totalPriorWeekLAR + ticket.productivehrs; + } + if ( + ticketDate.isBetween( + fixedPeriods.startofthisMonth, + fixedPeriods.endOfThisMonth, + undefined, + "[]" + ) + ) { + ret.totalThisMonth = ret.totalThisMonth + ticket.productivehrs; + ret.actualTotalOverPeriod = + ret.actualTotalOverPeriod + (ticket.actualhrs || 0); + if (ticket.ciecacode !== "LAR") { + ret.totalThisMonthLAB = ret.totalThisMonthLAB + ticket.productivehrs; + ret.actualTotalOverPeriodLAB = + ret.actualTotalOverPeriodLAB + (ticket.actualhrs || 0); + } + if (ticket.ciecacode === "LAR") { + ret.totalThisMonthLAR = ret.totalThisMonthLAR + ticket.productivehrs; + ret.actualTotalOverPeriodLAR = + ret.actualTotalOverPeriodLAR + (ticket.actualhrs || 0); + } + } else if ( + ticketDate.isBetween( + fixedPeriods.startOfLastmonth, + fixedPeriods.endOfLastmonth, + undefined, + "[]" + ) + ) { + ret.totalLastMonth = ret.totalLastMonth + ticket.productivehrs; + if (ticket.ciecacode !== "LAR") + ret.totalLastMonthLAB = ret.totalLastMonthLAB + ticket.productivehrs; + if (ticket.ciecacode === "LAR") + ret.totalLastMonthLAR = ret.totalLastMonthLAR + ticket.productivehrs; + } }); - } - combined.accHrs = acc_comb; - lab.accHrs = acc_lab; - lar.accHrs = acc_lar; - combinedData.push({ ...r, ...combined }); - labData.push({ ...r, ...lab }); - larData.push({ ...r, ...lar }); - }); + ret.totalEffieciencyOverPeriod = ret.actualTotalOverPeriod + ? (ret.totalThisMonth / ret.actualTotalOverPeriod) * 100 + : 0; + ret.totalEffieciencyOverPeriodLAB = ret.actualTotalOverPeriodLAB + ? (ret.totalThisMonthLAB / ret.actualTotalOverPeriodLAB) * 100 + : 0; + ret.totalEffieciencyOverPeriodLAR = ret.actualTotalOverPeriodLAR + ? (ret.totalThisMonthLAR / ret.actualTotalOverPeriodLAR) * 100 + : 0; - const jobData = {}; - data.jobs.forEach((job) => { - job.tthrs = job.joblines.reduce((acc, val) => acc + val.mod_lb_hrs, 0); - }); - jobData.tthrs = data.jobs - .reduce((acc, val) => acc + val.tthrs, 0) - .toFixed(1); - jobData.count = data.jobs.length.toFixed(0); + roundObject(ret); - return { - fixed: ret, - combinedData: combinedData, - labData: labData, - larData: larData, - jobData: jobData, - }; - }, [fixedPeriods, data, bodyshop]); + const ticketsGroupedByDate = _.groupBy(data.timetickets, "date"); - if (error) return ; - if (loading) return ; - return ( - -
    - - - - - - - - - - - - - - - - ); + const listOfDays = Utils.ListOfDaysInCurrentMonth(); + + const combinedData = [], + labData = [], + larData = []; + var acc_comb = 0; + var acc_lab = 0; + var acc_lar = 0; + + listOfDays.forEach((day) => { + const r = { + date: dayjs(day).format("MM/DD"), + actualhrs: 0, + productivehrs: 0, + }; + + const combined = { + accTargetHrs: _.round( + Utils.AsOfDateTargetHours( + bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget, + day + ) + + (bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget), + 1 + ), + accHrs: 0, + }; + const lab = { + accTargetHrs: _.round( + Utils.AsOfDateTargetHours( + bodyshop.scoreboard_target.dailyBodyTarget, + day + ) + bodyshop.scoreboard_target.dailyBodyTarget, + 1 + ), + accHrs: 0, + }; + const lar = { + accTargetHrs: _.round( + Utils.AsOfDateTargetHours( + bodyshop.scoreboard_target.dailyPaintTarget, + day + ) + bodyshop.scoreboard_target.dailyPaintTarget, + 1 + ), + accHrs: 0, + }; + + if (ticketsGroupedByDate[day]) { + ticketsGroupedByDate[day].forEach((ticket) => { + r.actualhrs = r.actualhrs + ticket.actualhrs; + r.productivehrs = r.productivehrs + ticket.productivehrs; + acc_comb = acc_comb + ticket.productivehrs; + + if (ticket.ciecacode !== "LAR") + acc_lab = acc_lab + ticket.productivehrs; + if (ticket.ciecacode === "LAR") + acc_lar = acc_lar + ticket.productivehrs; + }); + } + combined.accHrs = acc_comb; + lab.accHrs = acc_lab; + lar.accHrs = acc_lar; + + combinedData.push({...r, ...combined}); + labData.push({...r, ...lab}); + larData.push({...r, ...lar}); + }); + + const jobData = {}; + + data.jobs.forEach((job) => { + job.tthrs = job.joblines.reduce((acc, val) => acc + val.mod_lb_hrs, 0); + }); + + jobData.tthrs = data.jobs + .reduce((acc, val) => acc + val.tthrs, 0) + .toFixed(1); + + jobData.count = data.jobs.length.toFixed(0); + + return { + fixed: ret, + combinedData: combinedData, + labData: labData, + larData: larData, + jobData: jobData, + }; + }, [fixedPeriods, data, bodyshop]); + + if (error) return ; + if (loading) return ; + return ( + + + + + + + + + + + + + + + + + + ); } function roundObject(inputObj) { - for (var key of Object.keys(inputObj)) { - if (typeof inputObj[key] === "number") { - inputObj[key] = inputObj[key].toFixed(1); - } else if (Array.isArray(inputObj[key])) { - inputObj[key].forEach((item) => roundObject(item)); - } else if (typeof inputObj[key] === "object") { - roundObject(inputObj[key]); + for (var key of Object.keys(inputObj)) { + if (typeof inputObj[key] === "number") { + inputObj[key] = inputObj[key].toFixed(1); + } else if (Array.isArray(inputObj[key])) { + inputObj[key].forEach((item) => roundObject(item)); + } else if (typeof inputObj[key] === "object") { + roundObject(inputObj[key]); + } } - } } diff --git a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.stats.component.jsx b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.stats.component.jsx index 1ed3bb8ec..cfd6f81d8 100644 --- a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.stats.component.jsx +++ b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.stats.component.jsx @@ -1,651 +1,642 @@ -import { - Card, - Col, - Form, - Row, - Space, - Statistic, - Switch, - Typography, -} from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Card, Col, Form, Row, Space, Statistic, Switch, Typography,} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import * as Util from "../scoreboard-targets-table/scoreboard-targets-table.util"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScoreboardTicketsStats); function useLocalStorage(key, initialValue) { - const [storedValue, setStoredValue] = useState(() => { - const item = localStorage.getItem(key); - return item ? JSON.parse(item) : initialValue; - }); + const [storedValue, setStoredValue] = useState(() => { + const item = localStorage.getItem(key); + return item ? JSON.parse(item) : initialValue; + }); - useEffect(() => { - localStorage.setItem(key, JSON.stringify(storedValue)); - }, [key, storedValue]); + useEffect(() => { + localStorage.setItem(key, JSON.stringify(storedValue)); + }, [key, storedValue]); - return [storedValue, setStoredValue]; + return [storedValue, setStoredValue]; } -export function ScoreboardTicketsStats({ data, jobData, bodyshop }) { - const { t } = useTranslation(); - const [isLarge, setIsLarge] = useLocalStorage("isLargeStatistic", false); +export function ScoreboardTicketsStats({data, jobData, bodyshop}) { + const {t} = useTranslation(); + const [isLarge, setIsLarge] = useLocalStorage("isLargeStatistic", false); - const statisticSize = isLarge ? 36 : 24; - const statisticWeight = isLarge ? 550 : "normal"; - const daySpan = - Util.CalculateWorkingDaysInPeriod( - moment().startOf("week"), - moment().endOf("week") - ) > 5 - ? 3 - : 4; + const statisticSize = isLarge ? 36 : 24; + const statisticWeight = isLarge ? 550 : "normal"; + const daySpan = + Util.CalculateWorkingDaysInPeriod( + dayjs().startOf("week"), + dayjs().endOf("week") + ) > 5 + ? 3 + : 4; - return ( - + setIsLarge(!isLarge)} + defaultChecked={isLarge} + /> + + } > - setIsLarge(!isLarge)} - defaultChecked={isLarge} - /> - - } - > - - - {/* Daily Stats */} - - - {[ - "sunday", - "monday", - "tuesday", - "wednesday", - "thursday", - "friday", - "saturday", - ].map((day) => { - if (bodyshop.workingdays[day] === true) { - return ( - - - - - = - bodyshop.scoreboard_target.dailyBodyTarget + - bodyshop.scoreboard_target.dailyPaintTarget - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - + + + {/* Daily Stats */} + + + {[ + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + ].map((day) => { + if (bodyshop.workingdays[day] === true) { + return ( + + + + + = + bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + {t("scoreboard.labels.body")} + + } + value={data.seperatedThisWeek[day].lab} + valueStyle={{ + color: + parseFloat(data.seperatedThisWeek[day].lab) >= + bodyshop.scoreboard_target.dailyBodyTarget + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={data.seperatedThisWeek[day].lar} + valueStyle={{ + color: + parseFloat(data.seperatedThisWeek[day].lar) >= + bodyshop.scoreboard_target.dailyPaintTarget + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + ); + } else { + return null; + } + })} + {/* Weekly Stats */} - - - {t("scoreboard.labels.body")} - - } - value={data.seperatedThisWeek[day].lab} - valueStyle={{ - color: - parseFloat(data.seperatedThisWeek[day].lab) >= - bodyshop.scoreboard_target.dailyBodyTarget - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={data.seperatedThisWeek[day].lar} - valueStyle={{ - color: - parseFloat(data.seperatedThisWeek[day].lar) >= - bodyshop.scoreboard_target.dailyPaintTarget - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - + {/* This Week */} + + + + + = + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyBodyTarget, + dayjs().startOf("week"), + dayjs().endOf("week"), + bodyshop + ) + + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyPaintTarget, + dayjs().startOf("week"), + dayjs().endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + {t("scoreboard.labels.body")} + + } + value={data.totalThisWeekLAB} + valueStyle={{ + color: + parseFloat(data.totalThisWeekLAB) >= + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyBodyTarget, + dayjs().startOf("week"), + dayjs().endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={data.totalThisWeekLAR} + valueStyle={{ + color: + parseFloat(data.totalThisWeekLAR) >= + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyPaintTarget, + dayjs().startOf("week"), + dayjs().endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + {/* Last Week */} + + + + + = + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyBodyTarget, + dayjs().subtract(1, "week").startOf("week"), + dayjs().subtract(1, "week").endOf("week"), + bodyshop + ) + + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyPaintTarget, + dayjs().subtract(1, "week").startOf("week"), + dayjs().subtract(1, "week").endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + {t("scoreboard.labels.body")} + + } + value={data.totalLastWeekLAB} + valueStyle={{ + color: + parseFloat(data.totalLastWeekLAB) >= + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyBodyTarget, + dayjs().subtract(1, "week").startOf("week"), + dayjs().subtract(1, "week").endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={data.totalLastWeekLAR} + valueStyle={{ + color: + parseFloat(data.totalLastWeekLAR) >= + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyPaintTarget, + dayjs().subtract(1, "week").startOf("week"), + dayjs().subtract(1, "week").endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + {/* Prior Week */} + + + + + = + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyBodyTarget, + dayjs().subtract(2, "week").startOf("week"), + dayjs().subtract(2, "week").endOf("week"), + bodyshop + ) + + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyPaintTarget, + dayjs().subtract(2, "week").startOf("week"), + dayjs().subtract(2, "week").endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + {t("scoreboard.labels.body")} + + } + value={data.totalPriorWeekLAB} + valueStyle={{ + color: + parseFloat(data.totalPriorWeekLAB) >= + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyBodyTarget, + dayjs().subtract(2, "week").startOf("week"), + dayjs().subtract(2, "week").endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={data.totalPriorWeekLAR} + valueStyle={{ + color: + parseFloat(data.totalPriorWeekLAR) >= + Util.WeeklyTargetHrsInPeriod( + bodyshop.scoreboard_target.dailyPaintTarget, + dayjs().subtract(2, "week").startOf("week"), + dayjs().subtract(2, "week").endOf("week"), + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + - - - ); - } else { - return null; - } - })} + {/* Monthly Stats */} + + {/* This Month */} + + + + + = + Util.MonthlyTargetHrs( + bodyshop.scoreboard_target.dailyBodyTarget, + bodyshop + ) + + Util.MonthlyTargetHrs( + bodyshop.scoreboard_target.dailyPaintTarget, + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + {t("scoreboard.labels.body")} + + } + value={data.totalThisMonthLAB} + valueStyle={{ + color: + parseFloat(data.totalThisMonthLAB) >= + Util.MonthlyTargetHrs( + bodyshop.scoreboard_target.dailyBodyTarget, + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={data.totalThisMonthLAR} + valueStyle={{ + color: + parseFloat(data.totalThisMonthLAR) >= + Util.MonthlyTargetHrs( + bodyshop.scoreboard_target.dailyPaintTarget, + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + {/* Last Month */} + + + + + = + Util.LastMonthTargetHrs( + bodyshop.scoreboard_target.dailyBodyTarget, + bodyshop + ) + + Util.LastMonthTargetHrs( + bodyshop.scoreboard_target.dailyPaintTarget, + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + {t("scoreboard.labels.body")} + + } + value={data.totalLastMonthLAB} + valueStyle={{ + color: + parseFloat(data.totalLastMonthLAB) >= + Util.LastMonthTargetHrs( + bodyshop.scoreboard_target.dailyBodyTarget, + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={data.totalLastMonthLAR} + valueStyle={{ + color: + parseFloat(data.totalLastMonthLAR) >= + Util.LastMonthTargetHrs( + bodyshop.scoreboard_target.dailyPaintTarget, + bodyshop + ) + ? "green" + : "red", + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + {/* Efficiency Over Period */} + + + + + + + + + + + {t("scoreboard.labels.body")} + + } + value={`${data.totalEffieciencyOverPeriodLAB || 0}%`} + valueStyle={{ + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + {t("scoreboard.labels.refinish")} + + } + value={`${data.totalEffieciencyOverPeriodLAR || 0}%`} + valueStyle={{ + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + + + + + + + + + + {t("scoreboard.labels.totalhrs")} + + } + value={jobData.tthrs} + valueStyle={{ + fontSize: statisticSize, + fontWeight: statisticWeight, + }} + /> + + + + + + + {/* Disclaimer */} + + *{t("scoreboard.labels.calendarperiod")} + + - {/* Weekly Stats */} - - {/* This Week */} - - - - - = - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyBodyTarget, - moment().startOf("week"), - moment().endOf("week"), - bodyshop - ) + - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyPaintTarget, - moment().startOf("week"), - moment().endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - {t("scoreboard.labels.body")} - - } - value={data.totalThisWeekLAB} - valueStyle={{ - color: - parseFloat(data.totalThisWeekLAB) >= - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyBodyTarget, - moment().startOf("week"), - moment().endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={data.totalThisWeekLAR} - valueStyle={{ - color: - parseFloat(data.totalThisWeekLAR) >= - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyPaintTarget, - moment().startOf("week"), - moment().endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - {/* Last Week */} - - - - - = - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyBodyTarget, - moment().subtract(1, "week").startOf("week"), - moment().subtract(1, "week").endOf("week"), - bodyshop - ) + - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyPaintTarget, - moment().subtract(1, "week").startOf("week"), - moment().subtract(1, "week").endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - {t("scoreboard.labels.body")} - - } - value={data.totalLastWeekLAB} - valueStyle={{ - color: - parseFloat(data.totalLastWeekLAB) >= - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyBodyTarget, - moment().subtract(1, "week").startOf("week"), - moment().subtract(1, "week").endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={data.totalLastWeekLAR} - valueStyle={{ - color: - parseFloat(data.totalLastWeekLAR) >= - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyPaintTarget, - moment().subtract(1, "week").startOf("week"), - moment().subtract(1, "week").endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - {/* Prior Week */} - - - - - = - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyBodyTarget, - moment().subtract(2, "week").startOf("week"), - moment().subtract(2, "week").endOf("week"), - bodyshop - ) + - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyPaintTarget, - moment().subtract(2, "week").startOf("week"), - moment().subtract(2, "week").endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - {t("scoreboard.labels.body")} - - } - value={data.totalPriorWeekLAB} - valueStyle={{ - color: - parseFloat(data.totalPriorWeekLAB) >= - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyBodyTarget, - moment().subtract(2, "week").startOf("week"), - moment().subtract(2, "week").endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={data.totalPriorWeekLAR} - valueStyle={{ - color: - parseFloat(data.totalPriorWeekLAR) >= - Util.WeeklyTargetHrsInPeriod( - bodyshop.scoreboard_target.dailyPaintTarget, - moment().subtract(2, "week").startOf("week"), - moment().subtract(2, "week").endOf("week"), - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - {/* Monthly Stats */} - - {/* This Month */} - - - - - = - Util.MonthlyTargetHrs( - bodyshop.scoreboard_target.dailyBodyTarget, - bodyshop - ) + - Util.MonthlyTargetHrs( - bodyshop.scoreboard_target.dailyPaintTarget, - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - {t("scoreboard.labels.body")} - - } - value={data.totalThisMonthLAB} - valueStyle={{ - color: - parseFloat(data.totalThisMonthLAB) >= - Util.MonthlyTargetHrs( - bodyshop.scoreboard_target.dailyBodyTarget, - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={data.totalThisMonthLAR} - valueStyle={{ - color: - parseFloat(data.totalThisMonthLAR) >= - Util.MonthlyTargetHrs( - bodyshop.scoreboard_target.dailyPaintTarget, - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - {/* Last Month */} - - - - - = - Util.LastMonthTargetHrs( - bodyshop.scoreboard_target.dailyBodyTarget, - bodyshop - ) + - Util.LastMonthTargetHrs( - bodyshop.scoreboard_target.dailyPaintTarget, - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - {t("scoreboard.labels.body")} - - } - value={data.totalLastMonthLAB} - valueStyle={{ - color: - parseFloat(data.totalLastMonthLAB) >= - Util.LastMonthTargetHrs( - bodyshop.scoreboard_target.dailyBodyTarget, - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={data.totalLastMonthLAR} - valueStyle={{ - color: - parseFloat(data.totalLastMonthLAR) >= - Util.LastMonthTargetHrs( - bodyshop.scoreboard_target.dailyPaintTarget, - bodyshop - ) - ? "green" - : "red", - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - {/* Efficiency Over Period */} - - - - - - - - - - - {t("scoreboard.labels.body")} - - } - value={`${data.totalEffieciencyOverPeriodLAB || 0}%`} - valueStyle={{ - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - {t("scoreboard.labels.refinish")} - - } - value={`${data.totalEffieciencyOverPeriodLAR || 0}%`} - valueStyle={{ - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - - - - - - - - - - {t("scoreboard.labels.totalhrs")} - - } - value={jobData.tthrs} - valueStyle={{ - fontSize: statisticSize, - fontWeight: statisticWeight, - }} - /> - - - - - - - {/* Disclaimer */} - - *{t("scoreboard.labels.calendarperiod")} - - - - - ); + + ); } diff --git a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.targets-table.component.jsx b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.targets-table.component.jsx index d7bab48ad..493c50117 100644 --- a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.targets-table.component.jsx +++ b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.targets-table.component.jsx @@ -1,285 +1,286 @@ -import { CalendarOutlined } from "@ant-design/icons"; -import { Card, Col, Divider, Row, Statistic } from "antd"; -import moment from "moment"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {CalendarOutlined} from "@ant-design/icons"; +import {Card, Col, Divider, Row, Statistic} from "antd"; +import dayjs from "../../utils/day"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import * as Util from "../scoreboard-targets-table/scoreboard-targets-table.util"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); const rowGutter = [16, 16]; -const statSpans = { xs: 24, sm: 3 }; +const statSpans = {xs: 24, sm: 3}; -export function ScoreboardTimeticketsTargetsTable({ bodyshop }) { - const { t } = useTranslation(); +export function ScoreboardTimeTicketsTargetsTable({bodyshop}) { + const {t} = useTranslation(); - return ( - - - - } - /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); + return ( + + + + } + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps -)(ScoreboardTimeticketsTargetsTable); + mapStateToProps, + mapDispatchToProps +)(ScoreboardTimeTicketsTargetsTable); diff --git a/client/src/components/scoreboard-timetickets/scoreboard-timetickets.bar.component.jsx b/client/src/components/scoreboard-timetickets/scoreboard-timetickets.bar.component.jsx index 3ce77c42f..fc1af1324 100644 --- a/client/src/components/scoreboard-timetickets/scoreboard-timetickets.bar.component.jsx +++ b/client/src/components/scoreboard-timetickets/scoreboard-timetickets.bar.component.jsx @@ -1,77 +1,78 @@ -import { Card } from "antd"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import {Card} from "antd"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import { - Bar, - CartesianGrid, - ComposedChart, - Legend, - ReferenceLine, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, + Bar, + CartesianGrid, + ComposedChart, + Legend, + ReferenceLine, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, } from "recharts"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import TimeTicketsDatesSelector from "../ticket-tickets-dates-selector/time-tickets-dates-selector.component"; + const graphProps = { - strokeWidth: 3, + strokeWidth: 3, }; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScoreboardTicketsBar); -export function ScoreboardTicketsBar({ data, bodyshop }) { - const { t } = useTranslation(); - return ( - } - > - - } > - - - - - - - {data && - data.employees.map((e, idx) => ( - - {/* */} - - ))} - - - - ); + + + + + + + + + {data && + data.employees.map((e, idx) => ( + + {/* */} + + ))} + + + + ); } diff --git a/client/src/components/scoreboard-timetickets/scoreboard-timetickets.component.jsx b/client/src/components/scoreboard-timetickets/scoreboard-timetickets.component.jsx index 9fdb384d1..9a7d9fbf5 100644 --- a/client/src/components/scoreboard-timetickets/scoreboard-timetickets.component.jsx +++ b/client/src/components/scoreboard-timetickets/scoreboard-timetickets.component.jsx @@ -1,11 +1,11 @@ -import { useQuery } from "@apollo/client"; -import { Col, Row } from "antd"; +import {useQuery} from "@apollo/client"; +import {Col, Row} from "antd"; import _ from "lodash"; -import moment from "moment"; +import dayjs from "../../utils/day"; import queryString from "query-string"; -import React, { useMemo } from "react"; -import { useLocation } from "react-router-dom"; -import { QUERY_TIME_TICKETS_IN_RANGE_SB } from "../../graphql/timetickets.queries"; +import React, {useMemo} from "react"; +import {useLocation} from "react-router-dom"; +import {QUERY_TIME_TICKETS_IN_RANGE_SB} from "../../graphql/timetickets.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util"; @@ -13,273 +13,273 @@ import ScoreboardTicketsBar from "./scoreboard-timetickets.bar.component"; import ScoreboardTicketsStats from "./scoreboard-timetickets.stats.component"; export default function ScoreboardTimeTickets() { - const searchParams = queryString.parse(useLocation().search); - const { start, end } = searchParams; - const startDate = start - ? moment(start) - : moment().startOf("week").subtract(7, "days"); - const endDate = end ? moment(end) : moment().endOf("week"); + const searchParams = queryString.parse(useLocation().search); + const {start, end} = searchParams; + const startDate = start + ? dayjs(start) + : dayjs().startOf("week").subtract(7, "day"); + const endDate = end ? dayjs(end) : dayjs().endOf("week"); - const fixedPeriods = useMemo(() => { - const endOfThisMonth = moment().endOf("month"); - const startofthisMonth = moment().startOf("month"); + const fixedPeriods = useMemo(() => { + const endOfThisMonth = dayjs().endOf("month"); + const startofthisMonth = dayjs().startOf("month"); - const endOfLastmonth = moment().subtract(1, "month").endOf("month"); - const startOfLastmonth = moment().subtract(1, "month").startOf("month"); + const endOfLastmonth = dayjs().subtract(1, "month").endOf("month"); + const startOfLastmonth = dayjs().subtract(1, "month").startOf("month"); - const endOfThisWeek = moment().endOf("week"); - const startOfThisWeek = moment().startOf("week"); + const endOfThisWeek = dayjs().endOf("week"); + const startOfThisWeek = dayjs().startOf("week"); - const endOfLastWeek = moment().subtract(1, "week").endOf("week"); - const startOfLastWeek = moment().subtract(1, "week").startOf("week"); + const endOfLastWeek = dayjs().subtract(1, "week").endOf("week"); + const startOfLastWeek = dayjs().subtract(1, "week").startOf("week"); - const allDates = [ - endOfThisMonth, - startofthisMonth, - endOfLastmonth, - startOfLastmonth, - endOfThisWeek, - startOfThisWeek, - endOfLastWeek, - startOfLastWeek, - ]; - const start = moment.min(allDates); - const end = moment.max(allDates); - return { - start, - end, - endOfThisMonth, - startofthisMonth, - endOfLastmonth, - startOfLastmonth, - endOfThisWeek, - startOfThisWeek, - endOfLastWeek, - startOfLastWeek, - }; - }, []); - - const { loading, error, data } = useQuery(QUERY_TIME_TICKETS_IN_RANGE_SB, { - variables: { - start: startDate.format("YYYY-MM-DD"), - end: endDate.format("YYYY-MM-DD"), - fixedStart: fixedPeriods.start.format("YYYY-MM-DD"), - fixedEnd: fixedPeriods.end.format("YYYY-MM-DD"), - jobStart: startDate, - jobEnd: endDate, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - pollInterval: 60000, - skip: !fixedPeriods, - }); - - const calculatedData = useMemo(() => { - if (!data) return []; - const ret = { - totalThisWeek: 0, - totalLastWeek: 0, - totalThisMonth: 0, - totalLastMonth: 0, - totalOverPeriod: 0, - actualTotalOverPeriod: 0, - totalEffieciencyOverPeriod: 0, - employees: {}, - }; - data.fixedperiod.forEach((ticket) => { - const ticketDate = moment(ticket.date); - - if (!ret.employees[ticket.employee.employee_number]) { - ret.employees[ticket.employee.employee_number] = { - totalThisWeek: 0, - totalLastWeek: 0, - totalThisMonth: 0, - totalLastMonth: 0, - totalOverPeriod: 0, - actualTotalOverPeriod: 0, - totalEffieciencyOverPeriod: 0, + const allDates = [ + endOfThisMonth, + startofthisMonth, + endOfLastmonth, + startOfLastmonth, + endOfThisWeek, + startOfThisWeek, + endOfLastWeek, + startOfLastWeek, + ]; + const start = dayjs.min(allDates); + const end = dayjs.max(allDates); + return { + start, + end, + endOfThisMonth, + startofthisMonth, + endOfLastmonth, + startOfLastmonth, + endOfThisWeek, + startOfThisWeek, + endOfLastWeek, + startOfLastWeek, }; - } + }, []); - if ( - ticketDate.isBetween( - fixedPeriods.startOfThisWeek, - fixedPeriods.endOfThisWeek, - undefined, - "[]" - ) - ) { - ret.totalThisWeek = ret.totalThisWeek + ticket.productivehrs; - ret.employees[ticket.employee.employee_number].totalThisWeek = - ret.employees[ticket.employee.employee_number].totalThisWeek + - ticket.productivehrs; - } else if ( - ticketDate.isBetween( - fixedPeriods.startOfLastWeek, - fixedPeriods.endOfLastWeek, - undefined, - "[]" - ) - ) { - ret.totalLastWeek = ret.totalLastWeek + ticket.productivehrs; - ret.employees[ticket.employee.employee_number].totalLastWeek = - ret.employees[ticket.employee.employee_number].totalLastWeek + - ticket.productivehrs; - } - if ( - ticketDate.isBetween( - fixedPeriods.startofthisMonth, - fixedPeriods.endOfThisMonth, - undefined, - "[]" - ) - ) { - ret.totalThisMonth = ret.totalThisMonth + ticket.productivehrs; - ret.employees[ticket.employee.employee_number].totalThisMonth = - ret.employees[ticket.employee.employee_number].totalThisMonth + - ticket.productivehrs; - } else if ( - ticketDate.isBetween( - fixedPeriods.startOfLastmonth, - fixedPeriods.endOfLastmonth, - undefined, - "[]" - ) - ) { - ret.totalLastMonth = ret.totalLastMonth + ticket.productivehrs; - ret.employees[ticket.employee.employee_number].totalLastMonth = - ret.employees[ticket.employee.employee_number].totalLastMonth + - ticket.productivehrs; - } - }); - - const ticketsGroupedByDate = _.groupBy(data.timetickets, "date"); - const listOfDays = Utils.ListDaysBetween({ - start: startDate, - end: endDate, - }); - - const employees = []; - const ret2 = []; - let totals = { - totalproductive: 0, - totalactual: 0, - employees: {}, - }; - - listOfDays.forEach((day) => { - const r = { - date: moment(day).format("MM/DD"), - actualtotal: 0, - productivetotal: 0, - employees: {}, - }; - - if (ticketsGroupedByDate[day]) { - ticketsGroupedByDate[day].forEach((ticket) => { - r.actualtotal = r.actualtotal + ticket.actualhrs; - r.productivetotal = r.productivetotal + ticket.productivehrs; - totals.totalactual = totals.totalactual + ticket.actualhrs; - totals.totalproductive = - totals.totalproductive + ticket.productivehrs; - - employees.push(ticket.employee.employee_number); - //Add to table data. - ret.employees[ticket.employee.employee_number].totalOverPeriod = - ret.employees[ticket.employee.employee_number].totalOverPeriod + - ticket.productivehrs; - ret.employees[ticket.employee.employee_number].actualTotalOverPeriod = - ret.employees[ticket.employee.employee_number] - .actualTotalOverPeriod + (ticket.actualhrs || 0); - - if (!totals.employees[ticket.employee.employee_number]) - totals.employees[ticket.employee.employee_number] = { - totalactual: 0, - totalproductive: 0, - }; - - if (!r.employees[ticket.employee.employee_number]) - r.employees[ticket.employee.employee_number] = { - actual: 0, - productive: 0, - }; - - //Add to totals. - totals.employees[ticket.employee.employee_number].totalproductive = - totals.employees[ticket.employee.employee_number].totalproductive + - ticket.productivehrs; - - totals.employees[ticket.employee.employee_number].totalactual = - totals.employees[ticket.employee.employee_number].totalactual + - ticket.actualhrs; - //Add to dailys. - r.employees[ticket.employee.employee_number].productive = - r.employees[ticket.employee.employee_number].productive + - ticket.productivehrs; - - r.employees[ticket.employee.employee_number].actual = - r.employees[ticket.employee.employee_number].actual + - ticket.actualhrs; - }); - } - - ret2.push(r); - }); - - // Add total efficiency of employees - const totalActualAndProductive = Object.keys(ret.employees) - .map((key) => { - return { employee_number: key, ...ret.employees[key] }; - }) - .reduce( - (acc, e) => { - return { - totalOverPeriod: acc.totalOverPeriod + e.totalOverPeriod, - actualTotalOverPeriod: - acc.actualTotalOverPeriod + e.actualTotalOverPeriod, - }; + const {loading, error, data} = useQuery(QUERY_TIME_TICKETS_IN_RANGE_SB, { + variables: { + start: startDate.format("YYYY-MM-DD"), + end: endDate.format("YYYY-MM-DD"), + fixedStart: fixedPeriods.start.format("YYYY-MM-DD"), + fixedEnd: fixedPeriods.end.format("YYYY-MM-DD"), + jobStart: startDate, + jobEnd: endDate, }, - { totalOverPeriod: 0, actualTotalOverPeriod: 0 } - ); + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + pollInterval: 60000, + skip: !fixedPeriods, + }); - ret.totalEffieciencyOverPeriod = - totalActualAndProductive.actualTotalOverPeriod - ? (totalActualAndProductive.totalOverPeriod / - totalActualAndProductive.actualTotalOverPeriod) * - 100 - : 0; + const calculatedData = useMemo(() => { + if (!data) return []; + const ret = { + totalThisWeek: 0, + totalLastWeek: 0, + totalThisMonth: 0, + totalLastMonth: 0, + totalOverPeriod: 0, + actualTotalOverPeriod: 0, + totalEffieciencyOverPeriod: 0, + employees: {}, + }; + data.fixedperiod.forEach((ticket) => { + const ticketDate = dayjs(ticket.date); - roundObject(ret); - roundObject(totals); - roundObject(ret2); + if (!ret.employees[ticket.employee.employee_number]) { + ret.employees[ticket.employee.employee_number] = { + totalThisWeek: 0, + totalLastWeek: 0, + totalThisMonth: 0, + totalLastMonth: 0, + totalOverPeriod: 0, + actualTotalOverPeriod: 0, + totalEffieciencyOverPeriod: 0, + }; + } - return { - fixed: ret, - timeperiod: { - totals, - chartData: ret2, - employees: _.uniq(employees), - colors: getColorArray(employees.length), - }, - }; - }, [fixedPeriods, data, startDate, endDate]); + if ( + ticketDate.isBetween( + fixedPeriods.startOfThisWeek, + fixedPeriods.endOfThisWeek, + undefined, + "[]" + ) + ) { + ret.totalThisWeek = ret.totalThisWeek + ticket.productivehrs; + ret.employees[ticket.employee.employee_number].totalThisWeek = + ret.employees[ticket.employee.employee_number].totalThisWeek + + ticket.productivehrs; + } else if ( + ticketDate.isBetween( + fixedPeriods.startOfLastWeek, + fixedPeriods.endOfLastWeek, + undefined, + "[]" + ) + ) { + ret.totalLastWeek = ret.totalLastWeek + ticket.productivehrs; + ret.employees[ticket.employee.employee_number].totalLastWeek = + ret.employees[ticket.employee.employee_number].totalLastWeek + + ticket.productivehrs; + } + if ( + ticketDate.isBetween( + fixedPeriods.startofthisMonth, + fixedPeriods.endOfThisMonth, + undefined, + "[]" + ) + ) { + ret.totalThisMonth = ret.totalThisMonth + ticket.productivehrs; + ret.employees[ticket.employee.employee_number].totalThisMonth = + ret.employees[ticket.employee.employee_number].totalThisMonth + + ticket.productivehrs; + } else if ( + ticketDate.isBetween( + fixedPeriods.startOfLastmonth, + fixedPeriods.endOfLastmonth, + undefined, + "[]" + ) + ) { + ret.totalLastMonth = ret.totalLastMonth + ticket.productivehrs; + ret.employees[ticket.employee.employee_number].totalLastMonth = + ret.employees[ticket.employee.employee_number].totalLastMonth + + ticket.productivehrs; + } + }); - if (error) return ; - if (loading) return ; - return ( - - - - - - - - - ); + const ticketsGroupedByDate = _.groupBy(data.timetickets, "date"); + const listOfDays = Utils.ListDaysBetween({ + start: startDate, + end: endDate, + }); + + const employees = []; + const ret2 = []; + let totals = { + totalproductive: 0, + totalactual: 0, + employees: {}, + }; + + listOfDays.forEach((day) => { + const r = { + date: dayjs(day).format("MM/DD"), + actualtotal: 0, + productivetotal: 0, + employees: {}, + }; + + if (ticketsGroupedByDate[day]) { + ticketsGroupedByDate[day].forEach((ticket) => { + r.actualtotal = r.actualtotal + ticket.actualhrs; + r.productivetotal = r.productivetotal + ticket.productivehrs; + totals.totalactual = totals.totalactual + ticket.actualhrs; + totals.totalproductive = + totals.totalproductive + ticket.productivehrs; + + employees.push(ticket.employee.employee_number); + //Add to table data. + ret.employees[ticket.employee.employee_number].totalOverPeriod = + ret.employees[ticket.employee.employee_number].totalOverPeriod + + ticket.productivehrs; + ret.employees[ticket.employee.employee_number].actualTotalOverPeriod = + ret.employees[ticket.employee.employee_number] + .actualTotalOverPeriod + (ticket.actualhrs || 0); + + if (!totals.employees[ticket.employee.employee_number]) + totals.employees[ticket.employee.employee_number] = { + totalactual: 0, + totalproductive: 0, + }; + + if (!r.employees[ticket.employee.employee_number]) + r.employees[ticket.employee.employee_number] = { + actual: 0, + productive: 0, + }; + + //Add to totals. + totals.employees[ticket.employee.employee_number].totalproductive = + totals.employees[ticket.employee.employee_number].totalproductive + + ticket.productivehrs; + + totals.employees[ticket.employee.employee_number].totalactual = + totals.employees[ticket.employee.employee_number].totalactual + + ticket.actualhrs; + //Add to dailys. + r.employees[ticket.employee.employee_number].productive = + r.employees[ticket.employee.employee_number].productive + + ticket.productivehrs; + + r.employees[ticket.employee.employee_number].actual = + r.employees[ticket.employee.employee_number].actual + + ticket.actualhrs; + }); + } + + ret2.push(r); + }); + + // Add total efficiency of employees + const totalActualAndProductive = Object.keys(ret.employees) + .map((key) => { + return {employee_number: key, ...ret.employees[key]}; + }) + .reduce( + (acc, e) => { + return { + totalOverPeriod: acc.totalOverPeriod + e.totalOverPeriod, + actualTotalOverPeriod: + acc.actualTotalOverPeriod + e.actualTotalOverPeriod, + }; + }, + {totalOverPeriod: 0, actualTotalOverPeriod: 0} + ); + + ret.totalEffieciencyOverPeriod = + totalActualAndProductive.actualTotalOverPeriod + ? (totalActualAndProductive.totalOverPeriod / + totalActualAndProductive.actualTotalOverPeriod) * + 100 + : 0; + + roundObject(ret); + roundObject(totals); + roundObject(ret2); + + return { + fixed: ret, + timeperiod: { + totals, + chartData: ret2, + employees: _.uniq(employees), + colors: getColorArray(employees.length), + }, + }; + }, [fixedPeriods, data, startDate, endDate]); + + if (error) return ; + if (loading) return ; + return ( + + + + + + + + + ); } //Include a filter by employee. @@ -290,63 +290,63 @@ export default function ScoreboardTimeTickets() { //Hours produced by employee by day for time period. function getColorArray(num) { - return [ - "#3366cc", - "#dc3912", - "#ff9900", - "#109618", - "#990099", - "#0099c6", - "#dd4477", - "#66aa00", - "#b82e2e", - "#316395", - "#3366cc", - "#994499", - "#22aa99", - "#aaaa11", - "#6633cc", - "#e67300", - "#8b0707", - "#651067", - "#329262", - "#5574a6", - "#3b3eac", - "#b77322", - "#16d620", - "#b91383", - "#f4359e", - "#9c5935", - "#a9c413", - "#2a778d", - "#668d1c", - "#bea413", - "#0c5922", - "#743411", - ]; - // var result = []; - // for (var i = 0; i < num; i += 1) { - // var letters = "0123456789ABCDEF".split(""); - // var color = "#"; - // for (var j = 0; j < 6; j += 1) { - // color += letters[Math.floor(Math.random() * 16)]; - // } - // result.push(color); - // } - // return result; + return [ + "#3366cc", + "#dc3912", + "#ff9900", + "#109618", + "#990099", + "#0099c6", + "#dd4477", + "#66aa00", + "#b82e2e", + "#316395", + "#3366cc", + "#994499", + "#22aa99", + "#aaaa11", + "#6633cc", + "#e67300", + "#8b0707", + "#651067", + "#329262", + "#5574a6", + "#3b3eac", + "#b77322", + "#16d620", + "#b91383", + "#f4359e", + "#9c5935", + "#a9c413", + "#2a778d", + "#668d1c", + "#bea413", + "#0c5922", + "#743411", + ]; + // var result = []; + // for (var i = 0; i < num; i += 1) { + // var letters = "0123456789ABCDEF".split(""); + // var color = "#"; + // for (var j = 0; j < 6; j += 1) { + // color += letters[Math.floor(Math.random() * 16)]; + // } + // result.push(color); + // } + // return result; } function roundObject(inputObj) { - for (var key of Object.keys(inputObj)) { - if (typeof inputObj[key] === "number" && inputObj[key] !== 0) { - inputObj[key] = - inputObj[key] && inputObj[key].toFixed - ? inputObj[key].toFixed(1) - : inputObj[key]; //Math.round(inputObj[key] * 100) / 100; - } else if (Array.isArray(inputObj[key])) { - inputObj[key].forEach((item) => roundObject(item)); - } else if (typeof inputObj[key] === "object") { - roundObject(inputObj[key]); + for (var key of Object.keys(inputObj)) { + if (typeof inputObj[key] === "number" && inputObj[key] !== 0) { + inputObj[key] = + inputObj[key] && inputObj[key].toFixed + ? inputObj[key].toFixed(1) + : inputObj[key]; //Math.round(inputObj[key] * 100) / 100; + } else if (Array.isArray(inputObj[key])) { + inputObj[key].forEach((item) => roundObject(item)); + } else if (typeof inputObj[key] === "object") { + roundObject(inputObj[key]); + } } - } } diff --git a/client/src/components/scoreboard-timetickets/scoreboard-timetickets.stats.component.jsx b/client/src/components/scoreboard-timetickets/scoreboard-timetickets.stats.component.jsx index 40f3ed32c..6240ff64c 100644 --- a/client/src/components/scoreboard-timetickets/scoreboard-timetickets.stats.component.jsx +++ b/client/src/components/scoreboard-timetickets/scoreboard-timetickets.stats.component.jsx @@ -1,139 +1,139 @@ -import { Card, Col, Row, Statistic, Table, Typography } from "antd"; +import {Card, Col, Row, Statistic, Table, Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ScoreboardTicketsStats); -export function ScoreboardTicketsStats({ data, bodyshop }) { - const { t } = useTranslation(); - const columns = [ - { - title: t("employees.fields.employee_number"), - dataIndex: "employee_number", - key: "employee_number", - sorter: (a, b) => a.employee_number - b.employee_number, - }, - { - title: t("scoreboard.labels.thisweek"), - dataIndex: "totalThisWeek", - key: "totalThisWeek", - sorter: (a, b) => a.totalThisWeek - b.totalThisWeek, - }, - { - title: t("scoreboard.labels.lastweek"), - dataIndex: "totalLastWeek", - key: "totalLastWeek", - sorter: (a, b) => a.totalLastWeek - b.totalLastWeek, - }, - { - title: t("scoreboard.labels.thismonth"), - dataIndex: "totalThisMonth", - key: "totalThisMonth", - sorter: (a, b) => a.totalThisMonth - b.totalThisMonth, - }, - { - title: t("scoreboard.labels.lastmonth"), - dataIndex: "totalLastMonth", - key: "totalLastMonth", - sorter: (a, b) => a.totalLastMonth - b.totalLastMonth, - }, - { - title: t("scoreboard.labels.totaloverperiod"), - dataIndex: "totalOverPeriod", - key: "totalOverPeriod", - sorter: (a, b) => a.totalOverPeriod - b.totalOverPeriod, - }, - { - title: t("scoreboard.labels.efficiencyoverperiod"), - dataIndex: "efficiencyoverperiod", - key: "efficiencyoverperiod", - render: (text, record) => - `${( - (record.totalOverPeriod / (record.actualTotalOverPeriod || 0.1)) * - 100 - ).toFixed(1)} %`, - }, - ]; +export function ScoreboardTicketsStats({data, bodyshop}) { + const {t} = useTranslation(); + const columns = [ + { + title: t("employees.fields.employee_number"), + dataIndex: "employee_number", + key: "employee_number", + sorter: (a, b) => a.employee_number - b.employee_number, + }, + { + title: t("scoreboard.labels.thisweek"), + dataIndex: "totalThisWeek", + key: "totalThisWeek", + sorter: (a, b) => a.totalThisWeek - b.totalThisWeek, + }, + { + title: t("scoreboard.labels.lastweek"), + dataIndex: "totalLastWeek", + key: "totalLastWeek", + sorter: (a, b) => a.totalLastWeek - b.totalLastWeek, + }, + { + title: t("scoreboard.labels.thismonth"), + dataIndex: "totalThisMonth", + key: "totalThisMonth", + sorter: (a, b) => a.totalThisMonth - b.totalThisMonth, + }, + { + title: t("scoreboard.labels.lastmonth"), + dataIndex: "totalLastMonth", + key: "totalLastMonth", + sorter: (a, b) => a.totalLastMonth - b.totalLastMonth, + }, + { + title: t("scoreboard.labels.totaloverperiod"), + dataIndex: "totalOverPeriod", + key: "totalOverPeriod", + sorter: (a, b) => a.totalOverPeriod - b.totalOverPeriod, + }, + { + title: t("scoreboard.labels.efficiencyoverperiod"), + dataIndex: "efficiencyoverperiod", + key: "efficiencyoverperiod", + render: (text, record) => + `${( + (record.totalOverPeriod / (record.actualTotalOverPeriod || 0.1)) * + 100 + ).toFixed(1)} %`, + }, + ]; - const tableData = data - ? Object.keys(data.employees).map((key) => { - return { employee_number: key, ...data.employees[key] }; - }) - : []; + const tableData = data + ? Object.keys(data.employees).map((key) => { + return {employee_number: key, ...data.employees[key]}; + }) + : []; - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {t("scoreboard.labels.calendarperiod")} - - - -
    - - - - ); + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {t("scoreboard.labels.calendarperiod")} + + + +
    + + + + ); } diff --git a/client/src/components/shop-csi-config-form/shop-csi-config-form.component.jsx b/client/src/components/shop-csi-config-form/shop-csi-config-form.component.jsx index 4ed0c6033..95e882fdd 100644 --- a/client/src/components/shop-csi-config-form/shop-csi-config-form.component.jsx +++ b/client/src/components/shop-csi-config-form/shop-csi-config-form.component.jsx @@ -1,23 +1,24 @@ import React from "react"; -import { Form } from "antd"; +import {Form} from "antd"; import ConfigFormComponents from "../config-form-components/config-form-components.component"; -export default function ShopCsiConfigForm({ selectedCsi }) { - const readOnly = !!selectedCsi; - const [form] = Form.useForm(); - const handleFinish = (values) => {}; +export default function ShopCsiConfigForm({selectedCsi}) { + const readOnly = !!selectedCsi; + const [form] = Form.useForm(); + const handleFinish = (values) => { + }; - return ( -
    - The Config Form {readOnly} - {selectedCsi && ( -
    - - - )} -
    - ); + return ( +
    + The Config Form {readOnly} + {selectedCsi && ( +
    + + + )} +
    + ); } diff --git a/client/src/components/shop-csi-config/shop-csi-config.component.jsx b/client/src/components/shop-csi-config/shop-csi-config.component.jsx index 4f194c830..eccd202be 100644 --- a/client/src/components/shop-csi-config/shop-csi-config.component.jsx +++ b/client/src/components/shop-csi-config/shop-csi-config.component.jsx @@ -1,51 +1,51 @@ -import { CheckCircleFilled } from "@ant-design/icons"; -import { Button, Col, List, Row } from "antd"; -import React, { useState } from "react"; -import { useQuery } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { GET_ALL_QUESTION_SETS } from "../../graphql/csi.queries"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {CheckCircleFilled} from "@ant-design/icons"; +import {Button, Col, List, Row} from "antd"; +import React, {useState} from "react"; +import {useQuery} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {GET_ALL_QUESTION_SETS} from "../../graphql/csi.queries"; +import {DateFormatter} from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import ShopCsiConfigForm from "../shop-csi-config-form/shop-csi-config-form.component"; export default function ShopCsiConfig() { - const { loading, error, data } = useQuery(GET_ALL_QUESTION_SETS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const [selectedCsi, setselectedCsi] = useState(null); - const { t } = useTranslation(); + const {loading, error, data} = useQuery(GET_ALL_QUESTION_SETS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const [selectedCsi, setselectedCsi] = useState(null); + const {t} = useTranslation(); - if (loading) return ; - if (error) return ; - return ( -
    - The Config Form - -
    - ( - - {item.created_at} - {item.csis_aggregate.aggregate.count} - - {item.current ? ( - - ) : ( - - )} - - )} - /> - - - - - - - ); + if (loading) return ; + if (error) return ; + return ( +
    + The Config Form + +
    + ( + + {item.created_at} + {item.csis_aggregate.aggregate.count} + + {item.current ? ( + + ) : ( + + )} + + )} + /> + + + + + + + ); } diff --git a/client/src/components/shop-employees/shop-employees-add-vacation.component.jsx b/client/src/components/shop-employees/shop-employees-add-vacation.component.jsx index d1bffeb91..1365f1e04 100644 --- a/client/src/components/shop-employees/shop-employees-add-vacation.component.jsx +++ b/client/src/components/shop-employees/shop-employees-add-vacation.component.jsx @@ -1,125 +1,125 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Form, notification, Popover, Space } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { INSERT_VACATION } from "../../graphql/employees.queries"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Form, notification, Popover, Space} from "antd"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_VACATION} from "../../graphql/employees.queries"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; -export default function ShopEmployeeAddVacation({ employee }) { - const { t } = useTranslation(); - const [insertVacation] = useMutation(INSERT_VACATION); +export default function ShopEmployeeAddVacation({employee}) { + const {t} = useTranslation(); + const [insertVacation] = useMutation(INSERT_VACATION); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [visibility, setVisibility] = useState(false); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [visibility, setVisibility] = useState(false); - const handleFinish = async (values) => { - logImEXEvent("employee_add_vacation"); + const handleFinish = async (values) => { + logImEXEvent("employee_add_vacation"); - setLoading(true); - let result; + setLoading(true); + let result; - result = await insertVacation({ - variables: { vacation: { ...values, employeeid: employee.id } }, - update(cache, { data }) { - cache.modify({ - id: cache.identify({ id: employee.id, __typename: "employees" }), - fields: { - employee_vacations(ex) { - return [data.insert_employee_vacation_one, ...ex]; + result = await insertVacation({ + variables: {vacation: {...values, employeeid: employee.id}}, + update(cache, {data}) { + cache.modify({ + id: cache.identify({id: employee.id, __typename: "employees"}), + fields: { + employee_vacations(ex) { + return [data.insert_employee_vacation_one, ...ex]; + }, + }, + }); }, - }, }); - }, - }); - if (!!result.errors) { - notification["error"]({ - message: t("employees.errors.adding", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("employees.successes.vacationadded"), - }); - } - form.resetFields(); - setLoading(false); - setVisibility(false); - }; + if (!!result.errors) { + notification["error"]({ + message: t("employees.errors.adding", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("employees.successes.vacationadded"), + }); + } + form.resetFields(); + setLoading(false); + setVisibility(false); + }; - const overlay = ( - -
    - - - - ({ - async validator(rule, value) { - if (value) { - const { start } = form.getFieldsValue(); - if (moment(start).isAfter(moment(value))) { - return Promise.reject( - t("employees.labels.endmustbeafterstart") - ); - } else { - return Promise.resolve(); - } - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - + const overlay = ( + + + + + + ({ + async validator(rule, value) { + if (value) { + const {start} = form.getFieldsValue(); + if (dayjs(start).isAfter(dayjs(value))) { + return Promise.reject( + t("employees.labels.endmustbeafterstart") + ); + } else { + return Promise.resolve(); + } + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + - - - - - - - ); + + + + + +
    + ); - const handleClick = (e) => { - setVisibility(true); - }; + const handleClick = (e) => { + setVisibility(true); + }; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/shop-employees/shop-employees-form.component.jsx b/client/src/components/shop-employees/shop-employees-form.component.jsx index 3cedf6512..472da39e1 100644 --- a/client/src/components/shop-employees/shop-employees-form.component.jsx +++ b/client/src/components/shop-employees/shop-employees-form.component.jsx @@ -1,438 +1,431 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useApolloClient, useMutation, useQuery } from "@apollo/client"; +import {DeleteFilled} from "@ant-design/icons"; +import {useApolloClient, useMutation, useQuery} from "@apollo/client"; +import {Button, Card, Form, Input, InputNumber, notification, Select, Switch, Table,} from "antd"; +import {useForm} from "antd/es/form/Form"; +import dayjs from "../../utils/day"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import { - Button, - Card, - Form, - Input, - InputNumber, - notification, - Select, - Switch, - Table, -} from "antd"; - -import moment from "moment"; -import querystring from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - CHECK_EMPLOYEE_NUMBER, - DELETE_VACATION, - INSERT_EMPLOYEES, - QUERY_EMPLOYEE_BY_ID, - QUERY_USERS_BY_EMAIL, - UPDATE_EMPLOYEE, + CHECK_EMPLOYEE_NUMBER, + DELETE_VACATION, + INSERT_EMPLOYEES, + QUERY_EMPLOYEE_BY_ID, + QUERY_USERS_BY_EMAIL, + UPDATE_EMPLOYEE, } from "../../graphql/employees.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CiecaSelect from "../../utils/Ciecaselect"; -import { DateFormatter } from "../../utils/DateFormatter"; +import {DateFormatter} from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import ShopEmployeeAddVacation from "./shop-employees-add-vacation.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import queryString from "query-string"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ShopEmployeesFormComponent({ bodyshop }) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const history = useHistory(); - const search = querystring.parse(useLocation().search); - const [deleteVacation] = useMutation(DELETE_VACATION); - const { error, data } = useQuery(QUERY_EMPLOYEE_BY_ID, { - variables: { id: search.employeeId }, - skip: !search.employeeId || search.employeeId === "new", - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const client = useApolloClient(); - useEffect(() => { - if (data && data.employees_by_pk) form.setFieldsValue(data.employees_by_pk); - else { - form.resetFields(); - } - }, [form, data, search.employeeId]); +export function ShopEmployeesFormComponent({bodyshop}) { + const {t} = useTranslation(); + const [form] = useForm(); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const [deleteVacation] = useMutation(DELETE_VACATION); + const {error, data} = useQuery(QUERY_EMPLOYEE_BY_ID, { + variables: {id: search.employeeId}, + skip: !search.employeeId || search.employeeId === "new", + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const [updateEmployee] = useMutation(UPDATE_EMPLOYEE); - const [insertEmployees] = useMutation(INSERT_EMPLOYEES); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); - const handleFinish = (values) => { - if (search.employeeId && search.employeeId !== "new") { - //Update a record. - logImEXEvent("shop_employee_update"); + const client = useApolloClient(); + useEffect(() => { + if (data && data.employees_by_pk) form.setFieldsValue(data.employees_by_pk); + else { + form.resetFields(); + } + }, [form, data, search.employeeId]); - updateEmployee({ - variables: { - id: search.employeeId, - employee: { - ...values, - user_email: values.user_email === "" ? null : values.user_email, - }, - }, - }) - .then((r) => { - notification["success"]({ - message: t("employees.successes.save"), - }); - }) - .catch((error) => { - notification["error"]({ - message: t("employees.errors.save", { - message: JSON.stringify(error), - }), - }); - }); - } else { - //New record, insert it. - logImEXEvent("shop_employee_insert"); + const [updateEmployee] = useMutation(UPDATE_EMPLOYEE); + const [insertEmployees] = useMutation(INSERT_EMPLOYEES); - insertEmployees({ - variables: { employees: [{ ...values, shopid: bodyshop.id }] }, - refetchQueries: ["QUERY_EMPLOYEES"], - }).then((r) => { - search.employeeId = r.data.insert_employees.returning[0].id; - history.push({ search: querystring.stringify(search) }); - notification["success"]({ - message: t("employees.successes.save"), - }); - }); - } - }; + const handleFinish = (values) => { + if (search.employeeId && search.employeeId !== "new") { + //Update a record. + logImEXEvent("shop_employee_update"); - if (!search.employeeId) return null; - if (error) return ; - - const columns = [ - { - title: t("employees.fields.vacation.start"), - dataIndex: "start", - key: "start", - render: (text, record) => {text}, - }, - { - title: t("employees.fields.vacation.end"), - dataIndex: "end", - key: "end", - render: (text, record) => {text}, - }, - { - title: t("employees.fields.vacation.length"), - dataIndex: "length", - key: "length", - render: (text, record) => - moment(record.end).diff(moment(record.start), "days", true).toFixed(1), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - ), - }, - ]; + } + }; - return ( - form.submit()}> - {t("general.actions.save")} - - } - > -
    - - - - - - - - ({ - async validator(rule, value) { - if (value) { - const response = await client.query({ - query: CHECK_EMPLOYEE_NUMBER, - variables: { - employeenumber: value, - }, - }); + if (!search.employeeId) return null; + if (error) return ; - if ( - response.data.employees_aggregate.aggregate.count === 0 - ) { - return Promise.resolve(); - } else if ( - response.data.employees_aggregate.nodes.length === 1 && - response.data.employees_aggregate.nodes[0].id === - form.getFieldValue("id") - ) { - return Promise.resolve(); - } - return Promise.reject( - t("employees.validation.unique_employee_number") - ); - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - - - - - - - - - - - - - - - - - - ({ - async validator(rule, value) { - const user_email = getFieldValue("user_email"); + const columns = [ + { + title: t("employees.fields.vacation.start"), + dataIndex: "start", + key: "start", + render: (text, record) => {text}, + }, + { + title: t("employees.fields.vacation.end"), + dataIndex: "end", + key: "end", + render: (text, record) => {text}, + }, + { + title: t("employees.fields.vacation.length"), + dataIndex: "length", + key: "length", + render: (text, record) => + dayjs(record.end).diff(dayjs(record.start), "day", true).toFixed(1), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + - - - ); - }} - - + > + + + ), + }, + ]; -
    ( - - )} - columns={columns} - rowKey={"id"} - dataSource={data ? data.employees_by_pk.employee_vacations : []} - /> - - ); + return ( + form.submit()}> + {t("general.actions.save")} + + } + > +
    + + + + + + + + ({ + async validator(rule, value) { + if (value) { + const response = await client.query({ + query: CHECK_EMPLOYEE_NUMBER, + variables: { + employeenumber: value, + }, + }); + + if ( + response.data.employees_aggregate.aggregate.count === 0 + ) { + return Promise.resolve(); + } else if ( + response.data.employees_aggregate.nodes.length === 1 && + response.data.employees_aggregate.nodes[0].id === + form.getFieldValue("id") + ) { + return Promise.resolve(); + } + return Promise.reject( + t("employees.validation.unique_employee_number") + ); + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + + + + + + + + + + + + + + + + + + ({ + async validator(rule, value) { + const user_email = getFieldValue("user_email"); + + if (user_email && value) { + const response = await client.query({ + query: QUERY_USERS_BY_EMAIL, + variables: { + email: user_email, + }, + }); + + if (response.data.users.length === 1) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.useremailmustexist") + ); + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + + + + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + { + remove(field.name); + }} + /> + + + + ))} + + + +
    + ); + }} +
    + + +
    ( + + )} + columns={columns} + rowKey={"id"} + dataSource={data ? data.employees_by_pk.employee_vacations : []} + /> + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopEmployeesFormComponent); diff --git a/client/src/components/shop-employees/shop-employees-list.component.jsx b/client/src/components/shop-employees/shop-employees-list.component.jsx index 416e875f9..87651a28c 100644 --- a/client/src/components/shop-employees/shop-employees-list.component.jsx +++ b/client/src/components/shop-employees/shop-employees-list.component.jsx @@ -1,87 +1,86 @@ -import { Button, Table } from "antd"; +import {Button, Table} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { useHistory, useLocation } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {useLocation, useNavigate} from "react-router-dom"; -export default function ShopEmployeesListComponent({ loading, employees }) { - const { t } = useTranslation(); - const history = useHistory(); - const search = queryString.parse(useLocation().search); +export default function ShopEmployeesListComponent({loading, employees}) { + const {t} = useTranslation(); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const handleOnRowClick = (record) => { + if (record) { + search.employeeId = record.id; + history({search: queryString.stringify(search)}); + } else { + delete search.employeeId; + history({search: queryString.stringify(search)}); + } + }; + const columns = [ + { + title: t("employees.fields.employee_number"), + dataIndex: "employee_number", + key: "employee_number", + }, + { + title: t("employees.fields.first_name"), + dataIndex: "first_name", + key: "first_name", + }, + { + title: t("employees.fields.last_name"), + dataIndex: "last_name", + key: "last_name", + }, - const handleOnRowClick = (record) => { - if (record) { - search.employeeId = record.id; - history.push({ search: queryString.stringify(search) }); - } else { - delete search.employeeId; - history.push({ search: queryString.stringify(search) }); - } - }; - const columns = [ - { - title: t("employees.fields.employee_number"), - dataIndex: "employee_number", - key: "employee_number", - }, - { - title: t("employees.fields.first_name"), - dataIndex: "first_name", - key: "first_name", - }, - { - title: t("employees.fields.last_name"), - dataIndex: "last_name", - key: "last_name", - }, - - { - title: t("employees.labels.rate_type"), - dataIndex: "rate_type", - key: "rate_type", - render: (text, record) => - record.flat_rate - ? t("employees.labels.flat_rate") - : t("employees.labels.straight_time"), - }, - ]; - return ( -
    -
    { - return ( - - ); - }} - loading={loading} - pagination={{ position: "top" }} - columns={columns} - rowKey="id" - dataSource={employees} - rowSelection={{ - onSelect: (props) => { - search.employeeId = props.id; - history.push({ search: queryString.stringify(search) }); - }, - type: "radio", - selectedRowKeys: [search.employeeId], - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, - }; - }} - /> - - ); + { + title: t("employees.labels.rate_type"), + dataIndex: "rate_type", + key: "rate_type", + render: (text, record) => + record.flat_rate + ? t("employees.labels.flat_rate") + : t("employees.labels.straight_time"), + }, + ]; + return ( +
    +
    { + return ( + + ); + }} + loading={loading} + pagination={{position: "top"}} + columns={columns} + rowKey="id" + dataSource={employees} + rowSelection={{ + onSelect: (props) => { + search.employeeId = props.id; + history({search: queryString.stringify(search)}); + }, + type: "radio", + selectedRowKeys: [search.employeeId], + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/shop-employees/shop-employees.container.jsx b/client/src/components/shop-employees/shop-employees.container.jsx index 7df31181d..919222538 100644 --- a/client/src/components/shop-employees/shop-employees.container.jsx +++ b/client/src/components/shop-employees/shop-employees.container.jsx @@ -1,36 +1,37 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_EMPLOYEES } from "../../graphql/employees.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_EMPLOYEES} from "../../graphql/employees.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import ShopEmployeesFormComponent from "./shop-employees-form.component"; import ShopEmployeesListComponent from "./shop-employees-list.component"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -function ShopEmployeesContainer({ bodyshop }) { - const { loading, error, data } = useQuery(QUERY_EMPLOYEES, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +function ShopEmployeesContainer({bodyshop}) { + const {loading, error, data} = useQuery(QUERY_EMPLOYEES, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (error) return ; + if (error) return ; - return ( -
    - - - - -
    - ); + return ( +
    + + + + +
    + ); } + export default connect(mapStateToProps, null)(ShopEmployeesContainer); diff --git a/client/src/components/shop-info/shop-info.component.jsx b/client/src/components/shop-info/shop-info.component.jsx index ac3be4bde..07a3de82c 100644 --- a/client/src/components/shop-info/shop-info.component.jsx +++ b/client/src/components/shop-info/shop-info.component.jsx @@ -1,10 +1,10 @@ -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Button, Card, Tabs } from "antd"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Card, Tabs} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ShopInfoGeneral from "./shop-info.general.component"; import ShopInfoIntakeChecklistComponent from "./shop-info.intake.component"; import ShopInfoLaborRates from "./shop-info.laborrates.component"; @@ -15,95 +15,114 @@ import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycen import ShopInfoROStatusComponent from "./shop-info.rostatus.component"; import ShopInfoSchedulingComponent from "./shop-info.scheduling.component"; import ShopInfoSpeedPrint from "./shop-info.speedprint.component"; +import {useLocation, useNavigate} from "react-router-dom"; import ShopInfoTaskPresets from "./shop-info.task-presets.component"; -import { useHistory, useLocation } from "react-router-dom"; import queryString from "query-string"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoComponent); -export function ShopInfoComponent({ bodyshop, form, saveLoading }) { - const { CriticalPartsScanning } = useTreatments( - ["CriticalPartsScanning"], - {}, - bodyshop.imexshopid - ); - const { t } = useTranslation(); - const history = useHistory(); - const location = useLocation(); - const search = queryString.parse(location.search); +export function ShopInfoComponent({bodyshop, form, saveLoading}) { - return ( - form.submit()} - > - {t("general.actions.save")} - - } - > - - history.push({ - search: `?tab=${search.tab}&subtab=${key}`, - }) + const {treatments: {CriticalPartsScanning}} = useSplitTreatments({ + attributes: {}, + names: ["CriticalPartsScanning"], + splitKey: bodyshop.imexshopid, + }); + + const {t} = useTranslation(); + const history = useNavigate(); + const location = useLocation(); + const search = queryString.parse(location.search); + + const tabItems = [ + { + key: "general", + label: t("bodyshop.labels.shopinfo"), + children: , + }, + { + key: "speedprint", + label: t("bodyshop.labels.speedprint"), + children: , + }, + { + key: "rbac", + label: t("bodyshop.labels.rbac"), + children: , + }, + { + key: "roStatus", + label: t("bodyshop.labels.jobstatuses"), + children: , + }, + { + key: "scheduling", + label: t("bodyshop.labels.scheduling"), + children: , + }, + { + key: "orderStatus", + label: t("bodyshop.labels.orderstatuses"), + children: , + }, + { + key: "responsibilityCenters", + label: t("bodyshop.labels.responsibilitycenters.title"), + children: , + }, + { + key: "checklists", + label: t("bodyshop.labels.checklists"), + children: , + }, + { + key: "laborrates", + label: t("bodyshop.labels.laborrates"), + children: , + }, + ...(CriticalPartsScanning.treatment === "on" + ? [ + { + key: "partsscan", + label: t("bodyshop.labels.partsscan"), + children: , + }, + ] + : []), + { + key: 'task-presets', + label: t("bodyshop.labels.task-presets"), + children: } - > - - - - - - - - - - - - - - - - - - - - - + ]; - - - - - - - {CriticalPartsScanning.treatment === "on" && ( - - - - )} - form.submit()} + > + {t("general.actions.save")} + + } > - - - - - ); + + history({ + search: `?tab=${search.tab}&subtab=${key}`, + }) + } + items={tabItems} + /> + + ); } diff --git a/client/src/components/shop-info/shop-info.container.jsx b/client/src/components/shop-info/shop-info.container.jsx index dd254a4cb..368e5f438 100644 --- a/client/src/components/shop-info/shop-info.container.jsx +++ b/client/src/components/shop-info/shop-info.container.jsx @@ -1,84 +1,86 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Form, notification } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { QUERY_BODYSHOP, UPDATE_SHOP } from "../../graphql/bodyshop.queries"; +import {useMutation, useQuery} from "@apollo/client"; +import {Form, notification} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {QUERY_BODYSHOP, UPDATE_SHOP} from "../../graphql/bodyshop.queries"; import AlertComponent from "../alert/alert.component"; import FormsFieldChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import ShopInfoComponent from "./shop-info.component"; + export default function ShopInfoContainer() { - const [form] = Form.useForm(); - const { t } = useTranslation(); - const [saveLoading, setSaveLoading] = useState(false); - const [updateBodyshop] = useMutation(UPDATE_SHOP); - const { loading, error, data, refetch } = useQuery(QUERY_BODYSHOP, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const [form] = Form.useForm(); + const {t} = useTranslation(); + const [saveLoading, setSaveLoading] = useState(false); + const [updateBodyshop] = useMutation(UPDATE_SHOP); + const {loading, error, data, refetch} = useQuery(QUERY_BODYSHOP, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const handleFinish = (values) => { - setSaveLoading(true); - logImEXEvent("shop_update"); - updateBodyshop({ - variables: { id: data.bodyshops[0].id, shop: values }, - }) - .then((r) => { - notification["success"]({ message: t("bodyshop.successes.save") }); - refetch().then((_) => form.resetFields()); - }) - .catch((error) => { - notification["error"]({ - message: t("bodyshop.errors.saving", { message: error }), - }); - }); - setSaveLoading(false); - }; + const handleFinish = (values) => { + setSaveLoading(true); + logImEXEvent("shop_update"); - useEffect(() => { - if (data) form.resetFields(); - }, [form, data]); + updateBodyshop({ + variables: {id: data.bodyshops[0].id, shop: values}, + }) + .then((r) => { + notification["success"]({message: t("bodyshop.successes.save")}); + refetch().then((_) => form.resetFields()); + }) + .catch((error) => { + notification["error"]({ + message: t("bodyshop.errors.saving", {message: error}), + }); + }); + setSaveLoading(false); + }; - if (error) return ; - if (loading) return ; - return ( -
    - - - - ); + useEffect(() => { + if (data) form.resetFields(); + }, [form, data]); + + if (error) return ; + if (loading) return ; + return ( +
    + + + + ); } diff --git a/client/src/components/shop-info/shop-info.general.component.jsx b/client/src/components/shop-info/shop-info.general.component.jsx index 28bad48e8..5f6c50a14 100644 --- a/client/src/components/shop-info/shop-info.general.component.jsx +++ b/client/src/components/shop-info/shop-info.general.component.jsx @@ -1,1643 +1,1631 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Button, - DatePicker, - Form, - Input, - InputNumber, - Radio, - Select, - Space, - Switch, -} from "antd"; -import momentTZ from "moment-timezone"; +import {DeleteFilled} from "@ant-design/icons"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, DatePicker, Form, Input, InputNumber, Radio, Select, Space, Switch,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import DatePickerRanges from "../../utils/DatePickerRanges"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import PhoneFormItem, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import PhoneFormItem, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -const timeZonesList = momentTZ.tz.names(); +// TODO: Client Update, this might break +const timeZonesList = Intl.supportedValuesOf('timeZone'); const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoGeneral); -export function ShopInfoGeneral({ form, bodyshop }) { - const { t } = useTranslation(); - const { ClosingPeriod } = useTreatments( - ["ClosingPeriod"], - {}, - bodyshop && bodyshop.imexshopid - ); +export function ShopInfoGeneral({form, bodyshop}) { + const {t} = useTranslation(); - return ( -
    - - - - - - - - - - - - - - - - - - - - - - - - - + const {treatments: {ClosingPeriod}} = useSplitTreatments({ + attributes: {}, + names: ["ClosingPeriod"], + splitKey: bodyshop && bodyshop.imexshopid, + }); - - PhoneItemFormatterValidation(getFieldValue, "phone"), - ]} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // {() => ( - // - // - // - // )} - // - } - - - - - - 2 - 3 - - - - {() => { - return ( - - - {t("bodyshop.labels.2tiername")} - - {t("bodyshop.labels.2tiersource")} - - - - ); - }} - - - - - - - - - - - - - - { - // - // - // - } - - - - { - // - // - // - } - - - - - - - - - - - - - - {ReceivableCustomFieldSelect} - - - {ReceivableCustomFieldSelect} - - - {ReceivableCustomFieldSelect} - - { - return { - required: getFieldValue("enforce_class"), - //message: t("general.validation.required"), - type: "array", - }; - }, - ]} - > - + + + + + + + + + + + + + + + + + + + + + + - - - + + PhoneItemFormatterValidation(getFieldValue, "phone"), + ]} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + 2 + 3 + + + + {() => { + return ( + + + {t("bodyshop.labels.2tiername")} + + {t("bodyshop.labels.2tiersource")} + + + + ); + }} + + + + + + + + + + + + + + { + // + // + // } - return Promise.reject(t("bodyshop.validation.larsplit")); - }, - }), - ]} - > - - - ({ - validator(rule, value) { - if (!value && !getFieldValue(["md_hour_split", "paint"])) { - return Promise.resolve(); + + + + { + // + // + // } - if (value + getFieldValue(["md_hour_split", "prep"]) === 1) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.larsplit")); - }, - }), - ]} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + }, + ]} + > + -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + }, + ]} + > + -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + type: "array", + }, + ]} + > + + + + + + + {ReceivableCustomFieldSelect} + + + {ReceivableCustomFieldSelect} + + + {ReceivableCustomFieldSelect} + + { + return { + required: getFieldValue("enforce_class"), + //message: t("general.validation.required"), + type: "array", + }; + }, + ]} + > + - - - - - - - - - - - - - - - - - - - + }, + ]} + > + + - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - - - PhoneItemFormatterValidation(getFieldValue, [ - field.name, - "est_ph", - ]), - ]} - > - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - PhoneItemFormatterValidation(getFieldValue, [ - field.name, - "ins_ph", - ]), - ]} - > - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - + + + + - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + }, + ]} + > + -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - + + + + + + + + + + + + + + + + + ({ + validator(rule, value) { + if (!value && !getFieldValue(["md_hour_split", "paint"])) { + return Promise.resolve(); + } + if (value + getFieldValue(["md_hour_split", "paint"]) === 1) { + return Promise.resolve(); + } + return Promise.reject(t("bodyshop.validation.larsplit")); + }, + }), + ]} + > + + + ({ + validator(rule, value) { + if (!value && !getFieldValue(["md_hour_split", "paint"])) { + return Promise.resolve(); + } + if (value + getFieldValue(["md_hour_split", "prep"]) === 1) { + return Promise.resolve(); + } + return Promise.reject(t("bodyshop.validation.larsplit")); + }, + }), + ]} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + PhoneItemFormatterValidation(getFieldValue, [ + field.name, + "est_ph", + ]), + ]} + > + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + PhoneItemFormatterValidation(getFieldValue, [ + field.name, + "ins_ph", + ]), + ]} + > + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + - VIN - Claim No. - Deductible Amount - + ); diff --git a/client/src/components/shop-info/shop-info.intake.component.jsx b/client/src/components/shop-info/shop-info.intake.component.jsx index e202dc724..f2bcd11ca 100644 --- a/client/src/components/shop-info/shop-info.intake.component.jsx +++ b/client/src/components/shop-info/shop-info.intake.component.jsx @@ -1,9 +1,9 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { Button, Form, Input, InputNumber, Select, Space, Switch } from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Form, Input, InputNumber, Select, Space, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import styled from "styled-components"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {TemplateList} from "../../utils/TemplateConstants"; import ConfigFormTypes from "../config-form-components/config-form-types"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; @@ -14,356 +14,356 @@ const SelectorDiv = styled.div` } `; -export default function ShopInfoIntakeChecklistComponent({ form }) { - const { t } = useTranslation(); +export default function ShopInfoIntakeChecklistComponent({form}) { + const {t} = useTranslation(); - const TemplateListGenerated = TemplateList(); - return ( -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - + const TemplateListGenerated = TemplateList(); + return ( +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + - - {() => { - if ( - form.getFieldValue([ - "intakechecklist", - "form", - index, - "type", - ]) !== "slider" - ) - return null; - return ( - <> - - - - - - - - ); - }} - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + +
    + ); }} - style={{ width: "100%" }} - > - {t("general.actions.add")} - - -
    - ); - }} - -
    - - - - - - - - - - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - + + + - - - - - + {Object.keys(TemplateListGenerated).map((i) => ( + + {TemplateListGenerated[i].title} - ))} - - + ))} + + + + + + - + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + {() => { + if ( + form.getFieldValue([ + "deliverchecklist", + "form", + index, + "type", + ]) !== "slider" + ) + return null; + return ( + <> + + + + + + + + ); + }} + + + + + { + remove(field.name); + }} + /> + + + + ))} + + + +
    + ); + }} +
    + + + - - - - - {() => { - if ( - form.getFieldValue([ - "deliverchecklist", - "form", - index, - "type", - ]) !== "slider" - ) - return null; - return ( - <> - - - - - - - - ); - }} - - - - - { - remove(field.name); - }} - /> - - -
    - ))} - - + type: "array", + }, + ]} + > + -
    - ); - }} -
    -
    - - - - - -
    - ); + +
    + ); } diff --git a/client/src/components/shop-info/shop-info.laborrates.component.jsx b/client/src/components/shop-info/shop-info.laborrates.component.jsx index f91273fd6..42e3dc56c 100644 --- a/client/src/components/shop-info/shop-info.laborrates.component.jsx +++ b/client/src/components/shop-info/shop-info.laborrates.component.jsx @@ -1,339 +1,339 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { Button, Form, Input } from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Form, Input} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -export default function ShopInfoLaborRates({ form }) { - const { t } = useTranslation(); +export default function ShopInfoLaborRates({form}) { + const {t} = useTranslation(); - return ( -
    - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // - // - // - // - // - } - - - - - - - { - remove(field.name); - }} - /> - - - - ))} - - - -
    - ); - }} -
    -
    - ); + return ( +
    + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // + // + // + // + // + } + + + + + + + { + remove(field.name); + }} + /> + + + + ))} + + + +
    + ); + }} +
    +
    + ); } diff --git a/client/src/components/shop-info/shop-info.orderstatus.component.jsx b/client/src/components/shop-info/shop-info.orderstatus.component.jsx index 0e6fff22b..1f9f070da 100644 --- a/client/src/components/shop-info/shop-info.orderstatus.component.jsx +++ b/client/src/components/shop-info/shop-info.orderstatus.component.jsx @@ -1,94 +1,97 @@ -import { Form, Input } from "antd"; +import {Form, Input} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoOrderStatusComponent); -export function ShopInfoOrderStatusComponent({ bodyshop, form }) { - const { t } = useTranslation(); - const { OEConnection } = useTreatments( - ["OEConnection"], - {}, - bodyshop.imexshopid - ); - return ( - - - - - - - +export function ShopInfoOrderStatusComponent({bodyshop, form}) { + const {t} = useTranslation(); - - - - - - - {OEConnection.treatment === "on" && ( - - - - )} - - ); + const {treatments: {OEConnection}} = useSplitTreatments({ + attributes: {}, + names: ["OEConnection"], + splitKey: bodyshop.imexshopid, + }); + + return ( + + + + + + + + + + + + + + + {OEConnection.treatment === "on" && ( + + + + )} + + ); } diff --git a/client/src/components/shop-info/shop-info.parts-scan.jsx b/client/src/components/shop-info/shop-info.parts-scan.jsx index 317be28f2..3ab0c600d 100644 --- a/client/src/components/shop-info/shop-info.parts-scan.jsx +++ b/client/src/components/shop-info/shop-info.parts-scan.jsx @@ -1,81 +1,81 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { Button, Form, Input, Space } from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Form, Input, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -export default function ShopInfoPartsScan({ form }) { - const { t } = useTranslation(); +export default function ShopInfoPartsScan({form}) { + const {t} = useTranslation(); - return ( -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - + return ( +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + - - { - remove(field.name); - }} - /> - - - - - ))} - - + +
    + ); }} - style={{ width: "100%" }} - > - {t("bodyshop.actions.addpartsrule")} - - -
    - ); - }} - -
    -
    - ); +
    +
    +
    + ); } diff --git a/client/src/components/shop-info/shop-info.rbac.component.jsx b/client/src/components/shop-info/shop-info.rbac.component.jsx index 9af03c94b..1fb2c78c6 100644 --- a/client/src/components/shop-info/shop-info.rbac.component.jsx +++ b/client/src/components/shop-info/shop-info.rbac.component.jsx @@ -1,794 +1,796 @@ -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Form, InputNumber } from "antd"; +import {Form, InputNumber} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoRbacComponent); -export function ShopInfoRbacComponent({ form, bodyshop }) { - const { t } = useTranslation(); - const { Simple_Inventory } = useTreatments( - ["Simple_Inventory"], - {}, - bodyshop && bodyshop.imexshopid - ); - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {Simple_Inventory.treatment === "on" && ( - <> - - - - - - - - )} - - - ); +export function ShopInfoRbacComponent({form, bodyshop}) { + const {t} = useTranslation(); + const {treatments: {Simple_Inventory}} = useSplitTreatments({ + attributes: {}, + names: ["Simple_Inventory"], + splitKey: bodyshop && bodyshop.imexshopid, + }); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {Simple_Inventory.treatment === "on" && ( + <> + + + + + + + + )} + + + ); } diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx index e548b54f0..13df2f882 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx @@ -1,386 +1,375 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { - Button, - Form, - Input, - InputNumber, - Select, - Switch, - Typography, -} from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Form, Input, InputNumber, Select, Switch, Typography,} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; import styled from "styled-components"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import DataLabel from "../data-label/data-label.component"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component"; const SelectorDiv = styled.div` - .ant-form-item .ant-select { - width: 125px; - } + .ant-form-item .ant-select { + width: 125px; + } `; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoResponsibilityCenterComponent); -export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { - const { t } = useTranslation(); - const { Qb_Multi_Ar } = useTreatments( - ["Qb_Multi_Ar"], - {}, - bodyshop && bodyshop.imexshopid - ); - const { DmsAp } = useTreatments( - ["DmsAp"], - {}, - bodyshop && bodyshop.imexshopid - ); - const [costOptions, setCostOptions] = useState( - [ - ...((form.getFieldValue(["md_responsibility_centers", "costs"]) && - form - .getFieldValue(["md_responsibility_centers", "costs"]) - .map((i) => i && i.name)) || - []), - ] || [] - ); +export function ShopInfoResponsibilityCenterComponent({bodyshop, form}) { + const {t} = useTranslation(); - const [profitOptions, setProfitOptions] = useState( - [ - ...((form.getFieldValue(["md_responsibility_centers", "profits"]) && - form - .getFieldValue(["md_responsibility_centers", "profits"]) - .map((i) => i && i.name)) || - []), - ] || [] - ); + const {treatments: {Qb_Multi_Ar, DmsAp}} = useSplitTreatments({ + attributes: {}, + names: ["Qb_Multi_Ar", "DmsAp"], + splitKey: bodyshop && bodyshop.imexshopid, + }); - const handleBlur = () => { - setCostOptions([ - ...(form - .getFieldValue(["md_responsibility_centers", "costs"]) - .map((i) => i && i.name) || []), - ]); - setProfitOptions([ - ...(form - .getFieldValue(["md_responsibility_centers", "profits"]) - .map((i) => i && i.name) || []), - ]); - }; + const [costOptions, setCostOptions] = useState( + [ + ...((form.getFieldValue(["md_responsibility_centers", "costs"]) && + form + .getFieldValue(["md_responsibility_centers", "costs"]) + .map((i) => i && i.name)) || + []), + ] || [] + ); - return ( -
    - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - <> - {bodyshop.cdk_dealerid && ( - - {form.getFieldValue("cdk_dealerid")} - - )} - {bodyshop.pbs_serialnumber && ( - - {form.getFieldValue("pbs_serialnumber")} - - )} - - - - - - - - - - - - - - - - - {bodyshop.pbs_serialnumber && ( - - - - )} - {bodyshop.pbs_serialnumber && ( - - - - )} - {bodyshop.pbs_serialnumber && ( - - - - )} - - - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - i && i.name)) || + []), + ] || [] + ); + + const handleBlur = () => { + setCostOptions([ + ...(form + .getFieldValue(["md_responsibility_centers", "costs"]) + .map((i) => i && i.name) || []), + ]); + setProfitOptions([ + ...(form + .getFieldValue(["md_responsibility_centers", "profits"]) + .map((i) => i && i.name) || []), + ]); + }; + + return ( +
    + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + <> + {bodyshop.cdk_dealerid && ( + + {form.getFieldValue("cdk_dealerid")} + + )} + {bodyshop.pbs_serialnumber && ( + + {form.getFieldValue("pbs_serialnumber")} + + )} + + - - - + + + - - - - - - - { - remove(field.name); - }} - /> - - - ))} - - - -
    - ); - }} - -
    - - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - + + + + + + - - - - - - - { - remove(field.name); - }} - /> - - - ))} - - - -
    - ); - }} -
    -
    - - )} - - {bodyshop.pbs_serialnumber && ( - <> - - {form.getFieldValue("pbs_serialnumber")} - - - )} - - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - + + + + + + {bodyshop.pbs_serialnumber && ( + + + )} - key={`${index}accountname`} - name={[field.name, "accountname"]} - rules={[ - { - required: true, - //message: t("general.validation.required"), - }, - ]} - > - - - {/* + + + )} + {bodyshop.pbs_serialnumber && ( + + + + )} + + + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
    + ); + }} +
    +
    + + )} + + {bodyshop.pbs_serialnumber && ( + <> + + {form.getFieldValue("pbs_serialnumber")} + + + )} + + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + {/* */} - - - - {/* + + + {/* */} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - {bodyshop.cdk_dealerid && ( - - - - )} + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + {bodyshop.cdk_dealerid && ( + + + + )} - { - remove(field.name); - }} - /> - - - ))} - - + +
    + ); }} - style={{ width: "100%" }} - > - {t("general.actions.add")} - - -
    - ); - }} -
    -
    + + - - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - {/* + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + {/* */} - - - - - - - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - {bodyshop.cdk_dealerid && ( - - - - )} - { - remove(field.name); - }} - /> - - - ))} - - + +
    + ); }} - style={{ width: "100%" }} - > - {t("general.actions.add")} - -
    -
    - ); - }} -
    -
    + + - - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - <> - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - -
    - - - - - - - - { - remove(field.name); - }} - /> - - - ({ - validator(rule, value) { + + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + <> + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + +
    + + + + + + + + { + remove(field.name); + }} + /> + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-ats`} + name={[field.name, "costs", "ATS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAA`} + name={[field.name, "costs", "LAA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAB`} + name={[field.name, "costs", "LAB"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAD`} + name={[field.name, "costs", "LAD"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAE`} + name={[field.name, "costs", "LAE"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAF`} + name={[field.name, "costs", "LAF"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAG`} + name={[field.name, "costs", "LAG"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAM`} + name={[field.name, "costs", "LAM"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAR`} + name={[field.name, "costs", "LAR"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAS`} + name={[field.name, "costs", "LAS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LAU`} + name={[field.name, "costs", "LAU"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LA1`} + name={[field.name, "costs", "LA1"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LA2`} + name={[field.name, "costs", "LA2"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LA3`} + name={[field.name, "costs", "LA3"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-LA4`} + name={[field.name, "costs", "LA4"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAA`} + name={[field.name, "costs", "PAA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAC`} + name={[field.name, "costs", "PAC"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAG`} + name={[field.name, "costs", "PAG"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAL`} + name={[field.name, "costs", "PAL"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAM`} + name={[field.name, "costs", "PAM"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAN`} + name={[field.name, "costs", "PAN"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAO`} + name={[field.name, "costs", "PAO"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAP`} + name={[field.name, "costs", "PAP"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAR`} + name={[field.name, "costs", "PAR"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PAS`} + name={[field.name, "costs", "PAS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-PASL`} + name={[field.name, "costs", "PASL"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-TOW`} + name={[field.name, "costs", "TOW"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-MAPA`} + name={[field.name, "costs", "MAPA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}costs-MASH`} + name={[field.name, "costs", "MASH"]} + > + + + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-ATS`} + name={[field.name, "profits", "ATS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAA`} + name={[field.name, "profits", "LAA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAB`} + name={[field.name, "profits", "LAB"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAD`} + name={[field.name, "profits", "LAD"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAE`} + name={[field.name, "profits", "LAE"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAF`} + name={[field.name, "profits", "LAF"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAG`} + name={[field.name, "profits", "LAG"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAM`} + name={[field.name, "profits", "LAM"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAR`} + name={[field.name, "profits", "LAR"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAS`} + name={[field.name, "profits", "LAS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LAU`} + name={[field.name, "profits", "LAU"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LA1`} + name={[field.name, "profits", "LA1"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LA2`} + name={[field.name, "profits", "LA2"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LA3`} + name={[field.name, "profits", "LA3"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-LA4`} + name={[field.name, "profits", "LA4"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAA`} + name={[field.name, "profits", "PAA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAC`} + name={[field.name, "profits", "PAC"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAG`} + name={[field.name, "profits", "PAG"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAL`} + name={[field.name, "profits", "PAL"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAM`} + name={[field.name, "profits", "PAM"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAN`} + name={[field.name, "profits", "PAN"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAO`} + name={[field.name, "profits", "PAO"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAP`} + name={[field.name, "profits", "PAP"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAR`} + name={[field.name, "profits", "PAR"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PAS`} + name={[field.name, "profits", "PAS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-PASL`} + name={[field.name, "profits", "PASL"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-TOW`} + name={[field.name, "profits", "TOW"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-MAPA`} + name={[field.name, "profits", "MAPA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + key={`${index}profits-MASH`} + name={[field.name, "profits", "MASH"]} + > + + + +
    +
    + ))} + + + +
    + ); + }} +
    + + )} + + + ({ + validator(rule, value) { if (costOptions.includes(value)) { - return Promise.resolve(); + return Promise.resolve(); } return Promise.reject( - t("bodyshop.validation.centermustexist") + t("bodyshop.validation.centermustexist") ); - }, - }), - ]} - key={`${index}costs-ats`} - name={[field.name, "costs", "ATS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAA`} - name={[field.name, "costs", "LAA"]} - > - + {costOptions.map((item, idx) => ( + {item} - - ))} - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAB`} - name={[field.name, "costs", "LAB"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAD`} - name={[field.name, "costs", "LAD"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAE`} - name={[field.name, "costs", "LAE"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAF`} - name={[field.name, "costs", "LAF"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAG`} - name={[field.name, "costs", "LAG"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAM`} - name={[field.name, "costs", "LAM"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAR`} - name={[field.name, "costs", "LAR"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAS`} - name={[field.name, "costs", "LAS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LAU`} - name={[field.name, "costs", "LAU"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LA1`} - name={[field.name, "costs", "LA1"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LA2`} - name={[field.name, "costs", "LA2"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LA3`} - name={[field.name, "costs", "LA3"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-LA4`} - name={[field.name, "costs", "LA4"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAA`} - name={[field.name, "costs", "PAA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAC`} - name={[field.name, "costs", "PAC"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAG`} - name={[field.name, "costs", "PAG"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAL`} - name={[field.name, "costs", "PAL"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAM`} - name={[field.name, "costs", "PAM"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAN`} - name={[field.name, "costs", "PAN"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAO`} - name={[field.name, "costs", "PAO"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAP`} - name={[field.name, "costs", "PAP"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAR`} - name={[field.name, "costs", "PAR"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PAS`} - name={[field.name, "costs", "PAS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-PASL`} - name={[field.name, "costs", "PASL"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-TOW`} - name={[field.name, "costs", "TOW"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-MAPA`} - name={[field.name, "costs", "MAPA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}costs-MASH`} - name={[field.name, "costs", "MASH"]} - > - - - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-ATS`} - name={[field.name, "profits", "ATS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAA`} - name={[field.name, "profits", "LAA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAB`} - name={[field.name, "profits", "LAB"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAD`} - name={[field.name, "profits", "LAD"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAE`} - name={[field.name, "profits", "LAE"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAF`} - name={[field.name, "profits", "LAF"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAG`} - name={[field.name, "profits", "LAG"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAM`} - name={[field.name, "profits", "LAM"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAR`} - name={[field.name, "profits", "LAR"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAS`} - name={[field.name, "profits", "LAS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LAU`} - name={[field.name, "profits", "LAU"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LA1`} - name={[field.name, "profits", "LA1"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LA2`} - name={[field.name, "profits", "LA2"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LA3`} - name={[field.name, "profits", "LA3"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-LA4`} - name={[field.name, "profits", "LA4"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAA`} - name={[field.name, "profits", "PAA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAC`} - name={[field.name, "profits", "PAC"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAG`} - name={[field.name, "profits", "PAG"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAL`} - name={[field.name, "profits", "PAL"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAM`} - name={[field.name, "profits", "PAM"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAN`} - name={[field.name, "profits", "PAN"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAO`} - name={[field.name, "profits", "PAO"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAP`} - name={[field.name, "profits", "PAP"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAR`} - name={[field.name, "profits", "PAR"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PAS`} - name={[field.name, "profits", "PAS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-PASL`} - name={[field.name, "profits", "PASL"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-TOW`} - name={[field.name, "profits", "TOW"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-MAPA`} - name={[field.name, "profits", "MAPA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - key={`${index}profits-MASH`} - name={[field.name, "profits", "MASH"]} - > - - - -
    -
    - ))} - - + + ))} + -
    - ); - }} -
    - - )} + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAB"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAD"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAE"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAF"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAG"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAM"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAR"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LAU"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LA1"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LA2"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LA3"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "LA4"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAC"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAG"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAL"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAM"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAN"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAO"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAP"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAR"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PAS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "PASL"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "TOW"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "MAPA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "costs", "MASH"]} + > + + + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "ATS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAB"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAD"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAE"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAF"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAG"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAM"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAR"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LAU"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LA1"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LA2"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LA3"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "LA4"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAC"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAG"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAL"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAM"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAN"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAO"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAP"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAR"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PAS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "PASL"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "TOW"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "MAPA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject( + t("bodyshop.validation.centermustexist") + ); + }, + }), + ]} + name={["md_responsibility_centers", "defaults", "profits", "MASH"]} + > + + + +
    - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "ATS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAB"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAD"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAE"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAF"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAG"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAM"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAR"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LAU"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LA1"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LA2"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LA3"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "LA4"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAC"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAG"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAL"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAM"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAN"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAO"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAP"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAR"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PAS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "PASL"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "TOW"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "MAPA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "costs", "MASH"]} - > - - - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "ATS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAB"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAD"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAE"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAF"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAG"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAM"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAR"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LAU"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LA1"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LA2"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LA3"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "LA4"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAC"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAG"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAL"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAM"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAN"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAO"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAP"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAR"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PAS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "PASL"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "TOW"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "MAPA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject( - t("bodyshop.validation.centermustexist") - ); - }, - }), - ]} - name={["md_responsibility_centers", "defaults", "profits", "MASH"]} - > - - - - - - { - // - // - // - // - // {/* - // - // */} - // {/* - // - // */} - // - // - // - // - // - // - // {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - // - // - // - // )} - // - // - // - // - } - {DmsAp.treatment === "on" && ( - - - - - {/* + + + + {/* + + */} + {/* + + */} + + + + + + + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + + + + + {DmsAp.treatment === "on" && ( + + + + + {/* */} - {/* */} - - - - - - - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + + + + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + + + + + )} + {/**/} + {/* */} + {/* */} + {/*
    */} + {/* /!* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* *!/*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (*/} + {/* */} + {/* */} + {/* */} + {/* )}*/} + {/* */} + {/* */} + {/* */} + {/**/} + - + - )} - - - - - )} - { - // - // - // - // - // {/* - // - // - // - // - // */} - // - // - // - // - // - // - // {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - // - // - // - // )} - // - // - // - // - } - - - - - - - - - { - // - // - // - // - // {/* - // - // - // - // - // */} - // - // - // - // - // - // - // {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - // - // - // - // )} - // - // - // - // - } - AR
    } id="AR"> - {/* + + + {/**/} + {/* */} + {/* */} + {/* */} + {/* /!* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* *!/*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (*/} + {/* */} + {/* */} + {/* */} + {/* )}*/} + {/* */} + {/* */} + {/* */} + {/**/} + AR
    } id="AR"> + {/* */} - - - - {/* + + + {/* */} -
    + - {DmsAp.treatment === "on" && ( - - {/* + {/* */} - {/* */} - - - - - - - - - - - )} - Refund
    } id="refund"> - {/* + + + + + + + + +
    + )} + Refund
    } id="refund"> + {/* */} - {/* */} - {/* */} - - - -
    - {Qb_Multi_Ar.treatment === "on" && ( - Multiple Payers Item
    } - id="accountitem" - > - - - - - )} - - {t("bodyshop.labels.responsibilitycenters.sales_tax_codes")} - - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - - - - - - - - { - remove(field.name); - }} - /> - - - ))} - - - -
    - ); - }} -
    - - ); + + + + {Qb_Multi_Ar.treatment === "on" && ( + Multiple Payers Item} + id="accountitem" + > + + + + + )} + + {t("bodyshop.labels.responsibilitycenters.sales_tax_codes")} + + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
    + ); + }} +
    + + ); } diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx index 9499a5dc7..6df72ab0c 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx @@ -1,3050 +1,3042 @@ -import { - Collapse, - Divider, - Form, - Input, - InputNumber, - Space, - Switch, -} from "antd"; +import {Collapse, Divider, Form, Input, InputNumber, Space, Switch,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoResponsibilityCenters); -export function ShopInfoResponsibilityCenters({ bodyshop, form }) { - const { t } = useTranslation(); - //Iteratively build the form items. - const formItems = []; - for (let tyCounter = 1; tyCounter <= 5; tyCounter++) { - const section = []; +export function ShopInfoResponsibilityCenters({bodyshop, form}) { + const {t} = useTranslation(); + //Iteratively build the form items. + const formItems = []; + for (let tyCounter = 1; tyCounter <= 5; tyCounter++) { + const section = []; - section.push( - TaxFormItems({ - typeNum: tyCounter, - rootElements: true, - bodyshop, - }) - ); - for (let iterator = 1; iterator <= 5; iterator++) { - section.push( - TaxFormItems({ - typeNum: tyCounter, - typeNumIterator: iterator, - rootElements: false, - }) - ); + section.push( + TaxFormItems({ + typeNum: tyCounter, + rootElements: true, + bodyshop, + }) + ); + for (let iterator = 1; iterator <= 5; iterator++) { + section.push( + TaxFormItems({ + typeNum: tyCounter, + typeNumIterator: iterator, + rootElements: false, + }) + ); + } + formItems.push(Space({children: section, wrap: true})); + formItems.push(); } - formItems.push(Space({ children: section, wrap: true })); - formItems.push(); - } - return ( - <> - - {t("jobs.labels.cieca_pft")} - - {formItems} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {() => { - return ( - - - - ); - }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -function TaxFormItems({ typeNum, typeNumIterator, rootElements, bodyshop }) { - const { t } = useTranslation(); - - if (rootElements) return ( - <> - - - + <> + + {t("jobs.labels.cieca_pft")} + + {formItems} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + + + ); + }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +function TaxFormItems({typeNum, typeNumIterator, rootElements, bodyshop}) { + const {t} = useTranslation(); + + if (rootElements) + return ( + <> + + + + + + + + + + + + + + + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + + ); + return ( + <> + + + + + + + + + + + + + ); - return ( - <> - - - - - - - - - - - - - - ); } diff --git a/client/src/components/shop-info/shop-info.rostatus.component.jsx b/client/src/components/shop-info/shop-info.rostatus.component.jsx index 7fab39746..782b7920f 100644 --- a/client/src/components/shop-info/shop-info.rostatus.component.jsx +++ b/client/src/components/shop-info/shop-info.rostatus.component.jsx @@ -1,411 +1,415 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { Button, Form, Select, Space } from "antd"; -import React, { useState } from "react"; -import { ChromePicker } from "react-color"; -import { useTranslation } from "react-i18next"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Form, Select, Space} from "antd"; +import React, {useState} from "react"; +import {ChromePicker} from "react-color"; +import {useTranslation} from "react-i18next"; import styled from "styled-components"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoROStatusComponent); const SelectorDiv = styled.div` - .ant-form-item .ant-select { - width: 200px; - } + .ant-form-item .ant-select { + width: 200px; + } `; -export function ShopInfoROStatusComponent({ bodyshop, form }) { - const { t } = useTranslation(); - const { Production_List_Status_Colors } = useTreatments( - ["Production_List_Status_Colors"], - {}, - bodyshop.imexshopid - ); - const [options, setOptions] = useState( - form.getFieldValue(["md_ro_statuses", "statuses"]) || [] - ); +export function ShopInfoROStatusComponent({bodyshop, form}) { - const handleBlur = () => { - setOptions(form.getFieldValue(["md_ro_statuses", "statuses"])); - }; + const {t} = useTranslation(); - return ( - - - - {options.map((item, idx) => ( - - {item} - - ))} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {Production_List_Status_Colors.treatment === "on" && ( - - - {(fields, { add, remove, move }) => { - return ( -
    - - {fields.map((field, index) => ( - - -
    - - - - { - remove(field.name); - }} - /> -
    - - - -
    -
    + const {treatments: {Production_List_Status_Colors}} = useSplitTreatments({ + attributes: {}, + names: ["Production_List_Status_Colors"], + splitKey: bodyshop.imexshopid, + }); + + const [options, setOptions] = useState( + form.getFieldValue(["md_ro_statuses", "statuses"]) || [] + ); + + const handleBlur = () => { + setOptions(form.getFieldValue(["md_ro_statuses", "statuses"])); + }; + + return ( + + + + {options.map((item, idx) => ( + + {item} + ))} -
    - - - -
    - ); - }} -
    -
    - )} -
    - ); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {Production_List_Status_Colors.treatment === "on" && ( + + + {(fields, {add, remove, move}) => { + return ( +
    + + {fields.map((field, index) => ( + + +
    + + + + { + remove(field.name); + }} + /> +
    + + + +
    +
    + ))} +
    + + + +
    + ); + }} +
    +
    + )} + + ); } -export const ColorPicker = ({ value, onChange, style, ...restProps }) => { - const handleChange = (color) => { - if (onChange) onChange(color.rgb); - }; - return ( - - ); +export const ColorPicker = ({value, onChange, style, ...restProps}) => { + const handleChange = (color) => { + if (onChange) onChange(color.rgb); + }; + return ( + + ); }; diff --git a/client/src/components/shop-info/shop-info.scheduling.component.jsx b/client/src/components/shop-info/shop-info.scheduling.component.jsx index c4160a367..46f6d2336 100644 --- a/client/src/components/shop-info/shop-info.scheduling.component.jsx +++ b/client/src/components/shop-info/shop-info.scheduling.component.jsx @@ -1,347 +1,337 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { - Button, - Divider, - Form, - Input, - InputNumber, - Select, - Space, - Switch, - TimePicker, -} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Divider, Form, Input, InputNumber, Select, Space, Switch, TimePicker,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import ColorpickerFormItemComponent from "../form-items-formatted/colorpicker-form-item.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { ColorPicker } from "./shop-info.rostatus.component"; +import {ColorPicker} from "./shop-info.rostatus.component"; -export default function ShopInfoSchedulingComponent({ form }) { - const { t } = useTranslation(); +export default function ShopInfoSchedulingComponent({form}) { + const {t} = useTranslation(); - return ( -
    - - - - - - - - - - - - - - - {t("bodyshop.labels.workingdays")} - - - - - - - - - - - - - - - - - - - - - - - - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - + + - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + }, + ]} + > + -
    - ); - }} -
    -
    - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - - - - - - - - - - - - - - {t("bodyshop.fields.ssbuckets.color")} - - - } - key={`${index}color`} - name={[field.name, "color"]} - > - - - - { - remove(field.name); - }} - /> - - - - - - ))} - - + }, + ]} + > + -
    - ); - }} -
    -
    -
    - ); + + + + + + + + {t("bodyshop.labels.workingdays")} + + + + + + + + + + + + + + + + + + + + + + + + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
    + ); + }} +
    +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + + + + + + + {t("bodyshop.fields.ssbuckets.color")} + + + } + key={`${index}color`} + name={[field.name, "color"]} + > + + + + { + remove(field.name); + }} + /> + + + + + + ))} + + + +
    + ); + }} +
    +
    + + ); } diff --git a/client/src/components/shop-info/shop-info.speedprint.component.jsx b/client/src/components/shop-info/shop-info.speedprint.component.jsx index 8b857eaec..45efcee31 100644 --- a/client/src/components/shop-info/shop-info.speedprint.component.jsx +++ b/client/src/components/shop-info/shop-info.speedprint.component.jsx @@ -1,101 +1,101 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { Button, Form, Input, Select, Space } from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Form, Input, Select, Space} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {useTranslation} from "react-i18next"; +import {TemplateList} from "../../utils/TemplateConstants"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -export default function ShopInfoSpeedPrint({ bodyshop, form }) { - const { t } = useTranslation(); - const TemplateListGenerated = TemplateList("job"); - return ( - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - +export default function ShopInfoSpeedPrint({bodyshop, form}) { + const {t} = useTranslation(); + const TemplateListGenerated = TemplateList("job"); + return ( + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + - - - + + + - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
    - ); - }} -
    - ); + + { + remove(field.name); + }} + /> + + +
    +
    + ))} + + + +
    + ); + }} +
    + ); } diff --git a/client/src/components/shop-info/shop-info.task-presets.component.jsx b/client/src/components/shop-info/shop-info.task-presets.component.jsx index 0ebdf5815..4b7f59a5a 100644 --- a/client/src/components/shop-info/shop-info.task-presets.component.jsx +++ b/client/src/components/shop-info/shop-info.task-presets.component.jsx @@ -1,269 +1,259 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { - Button, - Checkbox, - Col, - Form, - Input, - InputNumber, - Row, - Select, - Space, - Switch, -} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {Button, Checkbox, Col, Form, Input, InputNumber, Row, Select, Space, Switch,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoTaskPresets); -export function ShopInfoTaskPresets({ bodyshop, form }) { - const { t } = useTranslation(); +export function ShopInfoTaskPresets({bodyshop, form}) { + const {t} = useTranslation(); - return ( - <> - - - - - - - - - - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - -
    - - {t("joblines.fields.lbr_types.LAA")} - - - - - {t("joblines.fields.lbr_types.LAB")} - - - - - {t("joblines.fields.lbr_types.LAD")} - - - - - {t("joblines.fields.lbr_types.LAE")} - - - - - {t("joblines.fields.lbr_types.LAF")} - - - - - {t("joblines.fields.lbr_types.LAG")} - - - - - {t("joblines.fields.lbr_types.LAM")} - - - - - {t("joblines.fields.lbr_types.LAR")} - - - - - {t("joblines.fields.lbr_types.LAS")} - - - - - {t("joblines.fields.lbr_types.LAU")} - - - - - {t("joblines.fields.lbr_types.LA1")} - - - - - {t("joblines.fields.lbr_types.LA2")} - - - - - {t("joblines.fields.lbr_types.LA3")} - - - - - {t("joblines.fields.lbr_types.LA4")} - - - - - - - - - - - - - + + + + + + + {t("joblines.fields.lbr_types.LAA")} + + + + + {t("joblines.fields.lbr_types.LAB")} + + + + + {t("joblines.fields.lbr_types.LAD")} + + + + + {t("joblines.fields.lbr_types.LAE")} + + + + + {t("joblines.fields.lbr_types.LAF")} + + + + + {t("joblines.fields.lbr_types.LAG")} + + + + + {t("joblines.fields.lbr_types.LAM")} + + + + + {t("joblines.fields.lbr_types.LAR")} + + + + + {t("joblines.fields.lbr_types.LAS")} + + + + + {t("joblines.fields.lbr_types.LAU")} + + + + + {t("joblines.fields.lbr_types.LA1")} + + + + + {t("joblines.fields.lbr_types.LA2")} + + + + + {t("joblines.fields.lbr_types.LA3")} + + + + + {t("joblines.fields.lbr_types.LA4")} + + + + + + + + + + + + + - - - - - - - - - - {(fields, { add, remove, move }) => { - return ( -
    - {fields.map((field, index) => ( - + return ( + form.submit()}> + {t("general.actions.save")} + + } + > +
    + - - + + + - - - - - - - - - - - - - - - - - + > + +
    + + + {(fields, {add, remove, move}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - + +
    + ); }} - style={{ width: "100%" }} - > - {t("employee_teams.actions.newmember")} - - -
    - ); - }} -
    - - - ); + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopEmployeeTeamsFormComponent); diff --git a/client/src/components/shop-teams/shop-employee-teams.list.jsx b/client/src/components/shop-teams/shop-employee-teams.list.jsx index 402f8c9bf..edeb776f6 100644 --- a/client/src/components/shop-teams/shop-employee-teams.list.jsx +++ b/client/src/components/shop-teams/shop-employee-teams.list.jsx @@ -1,71 +1,71 @@ -import { Button, Table } from "antd"; +import {Button, Table} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { useHistory, useLocation } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {useNavigate, useLocation} from "react-router-dom"; export default function ShopEmployeeTeamsListComponent({ - loading, - employee_teams, -}) { - const { t } = useTranslation(); - const history = useHistory(); - const search = queryString.parse(useLocation().search); + loading, + employee_teams, + }) { + const {t} = useTranslation(); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); - const handleOnRowClick = (record) => { - if (record) { - search.employeeTeamId = record.id; - history.push({ search: queryString.stringify(search) }); - } else { - delete search.employeeTeamId; - history.push({ search: queryString.stringify(search) }); - } - }; - const columns = [ - { - title: t("employee_teams.fields.name"), - dataIndex: "name", - key: "name", - }, - ]; + const handleOnRowClick = (record) => { + if (record) { + search.employeeTeamId = record.id; + history({search: queryString.stringify(search)}); + } else { + delete search.employeeTeamId; + history({search: queryString.stringify(search)}); + } + }; + const columns = [ + { + title: t("employee_teams.fields.name"), + dataIndex: "name", + key: "name", + }, + ]; - return ( -
    -
    { - return ( - - ); - }} - loading={loading} - pagination={{ position: "top" }} - columns={columns} - rowKey="id" - dataSource={employee_teams} - rowSelection={{ - onSelect: (props) => { - search.employeeTeamId = props.id; - history.push({ search: queryString.stringify(search) }); - }, - type: "radio", - selectedRowKeys: [search.employeeTeamId], - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, - }; - }} - /> - - ); + return ( +
    +
    { + return ( + + ); + }} + loading={loading} + pagination={{position: "top"}} + columns={columns} + rowKey="id" + dataSource={employee_teams} + rowSelection={{ + onSelect: (props) => { + search.employeeTeamId = props.id; + history({search: queryString.stringify(search)}); + }, + type: "radio", + selectedRowKeys: [search.employeeTeamId], + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/shop-teams/shop-teams.container.jsx b/client/src/components/shop-teams/shop-teams.container.jsx index 702f15e37..95f1ce400 100644 --- a/client/src/components/shop-teams/shop-teams.container.jsx +++ b/client/src/components/shop-teams/shop-teams.container.jsx @@ -1,43 +1,44 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_TEAMS } from "../../graphql/employee_teams.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_TEAMS} from "../../graphql/employee_teams.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; import ShopEmployeeTeamsListComponent from "./shop-employee-teams.list"; import ShopEmployeeTeamsFormComponent from "./shop-employee-teams.form.component"; -import { Col, Row } from "antd"; +import {Col, Row} from "antd"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -function ShopTeamsContainer({ bodyshop }) { - const { loading, error, data } = useQuery(QUERY_TEAMS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +function ShopTeamsContainer({bodyshop}) { + const {loading, error, data} = useQuery(QUERY_TEAMS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (error) return ; + if (error) return ; - return ( -
    - - -
    - - - - - - - - - ); + return ( +
    + + +
    + + + + + + + + + ); } + export default connect(mapStateToProps, null)(ShopTeamsContainer); diff --git a/client/src/components/shop-template-add/shop-template-add.component.jsx b/client/src/components/shop-template-add/shop-template-add.component.jsx index 5fb45635a..c917fd663 100644 --- a/client/src/components/shop-template-add/shop-template-add.component.jsx +++ b/client/src/components/shop-template-add/shop-template-add.component.jsx @@ -1,90 +1,88 @@ -import { DownOutlined } from "@ant-design/icons"; -import { useMutation } from "@apollo/client"; -import { Dropdown, Menu } from "antd"; +import {DownOutlined} from "@ant-design/icons"; +import {useMutation} from "@apollo/client"; +import {Dropdown} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { - INSERT_TEMPLATE, - QUERY_TEMPLATES_BY_NAME_FOR_DUPE, -} from "../../graphql/templates.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {INSERT_TEMPLATE, QUERY_TEMPLATES_BY_NAME_FOR_DUPE,} from "../../graphql/templates.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import client from "../../utils/GraphQLClient"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {TemplateList} from "../../utils/TemplateConstants"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); export default connect(mapStateToProps, null)(ShopTemplateAddComponent); -export function ShopTemplateAddComponent({ - bodyshop, - shopTemplateList, - refetch, -}) { - const { t } = useTranslation(); - const search = queryString.parse(useLocation().search); - const history = useHistory(); - const [insertTemplate] = useMutation(INSERT_TEMPLATE); +export function ShopTemplateAddComponent({bodyshop, shopTemplateList, refetch}) { + const {t} = useTranslation(); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); + const [insertTemplate] = useMutation(INSERT_TEMPLATE); - const shopTemplateKeys = shopTemplateList.map((template) => template.name); - const availableTemplateKeys = Object.keys(TemplateList()).filter( - (tkey) => !shopTemplateKeys.includes(tkey) - ); + const shopTemplateKeys = shopTemplateList.map((template) => template.name); + const availableTemplateKeys = Object.keys(TemplateList()).filter( + (tkey) => !shopTemplateKeys.includes(tkey) + ); - const handleAdd = async (item) => { - logImEXEvent("shop_template_add"); + const handleAdd = async (item) => { + logImEXEvent("shop_template_add"); - const defaultTemplateData = await client.query({ - query: QUERY_TEMPLATES_BY_NAME_FOR_DUPE, - variables: { name: item.key }, - }); + const defaultTemplateData = await client.query({ + query: QUERY_TEMPLATES_BY_NAME_FOR_DUPE, + variables: {name: item.key}, + }); - const template = defaultTemplateData.data.templates.filter( - (t) => t.bodyshopid === null - )[0]; + const template = defaultTemplateData.data.templates.filter( + (t) => t.bodyshopid === null + )[0]; - const result = await insertTemplate({ - variables: { - template: { - name: item.key, - bodyshopid: bodyshop.id, - jsontemplate: template && template.jsontemplate, - html: template && template.html, - query: template && template.query, - }, - }, - }); + const result = await insertTemplate({ + variables: { + template: { + name: item.key, + bodyshopid: bodyshop.id, + jsontemplate: template && template.jsontemplate, + html: template && template.html, + query: template && template.query, + }, + }, + }); - const returningId = result.data.insert_templates.returning[0].id; - search.customTemplateId = returningId; - history.push({ search: queryString.stringify(search) }); - if (!!refetch) refetch(); - }; - const TemplateListGenerated = TemplateList(); - const menu = ( - - {availableTemplateKeys.length > 0 ? ( - availableTemplateKeys.map((tkey) => ( - {TemplateListGenerated[tkey].title} - )) - ) : ( -
    {t("bodyshop.labels.notemplatesavailable")}
    - )} -
    - ); + const returningId = result.data.insert_templates.returning[0].id; + search.customTemplateId = returningId; + history({search: queryString.stringify(search)}); + if (!!refetch) refetch(); + }; + const TemplateListGenerated = TemplateList(); + const menu = { + onClick: handleAdd, - return ( - - - {t("bodyshop.actions.addtemplate")} - - - ); + items: availableTemplateKeys.length > 0 + ? availableTemplateKeys.map((tkey) => ({ + key: tkey, + label: TemplateListGenerated[tkey].title, + })) + : [ + { + key: "no-templates", + label: t("bodyshop.labels.notemplatesavailable"), + disabled: true, + }, + ] + }; + + return ( + + + {t("bodyshop.actions.addtemplate")} + + + ); } diff --git a/client/src/components/shop-template-delete/shop-template-delete.component.jsx b/client/src/components/shop-template-delete/shop-template-delete.component.jsx index 763fd571a..68f156091 100644 --- a/client/src/components/shop-template-delete/shop-template-delete.component.jsx +++ b/client/src/components/shop-template-delete/shop-template-delete.component.jsx @@ -1,48 +1,48 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification, Popconfirm } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, notification, Popconfirm} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { useHistory, useLocation } from "react-router-dom"; -import { DELETE_TEMPLATE } from "../../graphql/templates.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {useTranslation} from "react-i18next"; +import {useLocation, useNavigate} from "react-router-dom"; +import {DELETE_TEMPLATE} from "../../graphql/templates.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; -export default function ShopTemplateDeleteComponent({ templateId, refetch }) { - const { t } = useTranslation(); - const search = queryString.parse(useLocation().search); - const history = useHistory(); - const [deleteTemplate] = useMutation(DELETE_TEMPLATE); +export default function ShopTemplateDeleteComponent({templateId, refetch}) { + const {t} = useTranslation(); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); + const [deleteTemplate] = useMutation(DELETE_TEMPLATE); - const handleDelete = async () => { - logImEXEvent("shop_template_delete"); + const handleDelete = async () => { + logImEXEvent("shop_template_delete"); - const result = await deleteTemplate({ - variables: { - templateId: templateId, - }, - }); + const result = await deleteTemplate({ + variables: { + templateId: templateId, + }, + }); - if (!!result.errors) { - notification["error"]({ - message: t("bodyshop.errors.deletingtemplate", { - message: JSON.stringify(result.errors), - }), - }); - } else { - delete search.customTemplateId; - history.push({ search: queryString.stringify(search) }); - if (!!refetch) refetch(); - } - }; + if (!!result.errors) { + notification["error"]({ + message: t("bodyshop.errors.deletingtemplate", { + message: JSON.stringify(result.errors), + }), + }); + } else { + delete search.customTemplateId; + history({search: queryString.stringify(search)}); + if (!!refetch) refetch(); + } + }; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx index 28f285602..fc7cf5366 100644 --- a/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx +++ b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx @@ -1,56 +1,57 @@ -import React, { useState } from "react"; -import { Button, notification } from "antd"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { UPDATE_TEMPLATE } from "../../graphql/templates.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import React, {useState} from "react"; +import {Button, notification} from "antd"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {UPDATE_TEMPLATE} from "../../graphql/templates.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; import axios from "axios"; + export default function ShopTemplateSaveButton({ - templateId, - gql, - emailEditorRef, -}) { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const [updateTemplate] = useMutation(UPDATE_TEMPLATE); + templateId, + gql, + emailEditorRef, + }) { + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const [updateTemplate] = useMutation(UPDATE_TEMPLATE); - const handleSave = async () => { - logImEXEvent("shop_template_update"); - setLoading(true); - emailEditorRef.current.exportHtml(async (data) => { - const response = await axios.post("/render/inlinecss", { - html: data.html, - url: `${window.location.protocol}://${window.location.host}/`, - }); + const handleSave = async () => { + logImEXEvent("shop_template_update"); + setLoading(true); + emailEditorRef.current.exportHtml(async (data) => { + const response = await axios.post("/render/inlinecss", { + html: data.html, + url: `${window.location.protocol}://${window.location.host}/`, + }); - const result = await updateTemplate({ - variables: { - templateId: templateId, - template: { - query: gql, - html: response.data, - jsontemplate: data.design, - }, - }, - }); - if (!!!result.errors) { - notification["success"]({ - message: t("templates.successes.updated"), + const result = await updateTemplate({ + variables: { + templateId: templateId, + template: { + query: gql, + html: response.data, + jsontemplate: data.design, + }, + }, + }); + if (!!!result.errors) { + notification["success"]({ + message: t("templates.successes.updated"), + }); + } else { + notification["error"]({ + message: t("templates.errors.updating", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); }); - } else { - notification["error"]({ - message: t("templates.errors.updating", { - error: JSON.stringify(result.errors), - }), - }); - } - setLoading(false); - }); - }; + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx b/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx index e60f20b71..6f7b8f496 100644 --- a/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx +++ b/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx @@ -1,76 +1,77 @@ -import { Button } from "antd"; -import { JsonEditor as Editor } from "jsoneditor-react"; +import {Button} from "antd"; +import {JsonEditor as Editor} from "jsoneditor-react"; import "jsoneditor-react/es/editor.min.css"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function ShopTemplateTestRender({ - bodyshop, - query, - emailEditorRef, - style, -}) { - const [variables, setVariables] = useState({ id: "uuid" }); - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); + bodyshop, + query, + emailEditorRef, + style, + }) { + const [variables, setVariables] = useState({id: "uuid"}); + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); - const handleTestRender = async () => { - try { - setLoading(true); - - emailEditorRef.current.exportHtml(async (data) => { + const handleTestRender = async () => { try { - // const inlineHtml = await axios.post("/render/inlinecss", { - // html: data.html, - // url: `${window.location.protocol}://${window.location.host}/`, - // }); + setLoading(true); - // const { data: contextData } = await client.query({ - // query: gql(query), - // variables: variables, - // - // }); + emailEditorRef.current.exportHtml(async (data) => { + try { + // const inlineHtml = await axios.post("/render/inlinecss", { + // html: data.html, + // url: `${window.location.protocol}://${window.location.host}/`, + // }); - // const renderResponse = await axios.post("/render", { - // view: inlineHtml.data, - // context: { ...contextData, bodyshop: bodyshop }, - // }); - // displayTemplateInWindowNoprint(renderResponse.data); + // const { data: contextData } = await client.query({ + // query: gql(query), + // variables: variables, + // + // }); - setLoading(false); + // const renderResponse = await axios.post("/render", { + // view: inlineHtml.data, + // context: { ...contextData, bodyshop: bodyshop }, + // }); + // displayTemplateInWindowNoprint(renderResponse.data); + + setLoading(false); + } catch (error) { + setLoading(false); + alert(error); + } + }); } catch (error) { - setLoading(false); - alert(error); + setLoading(false); + alert(error); } - }); - } catch (error) { - setLoading(false); - alert(error); - } - }; + }; - return ( -
    -
    - setVariables(e)} /> -
    - -
    - ); + return ( +
    +
    + setVariables(e)}/> +
    + +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopTemplateTestRender); diff --git a/client/src/components/shop-templates-list/shop-templates-list.container.jsx b/client/src/components/shop-templates-list/shop-templates-list.container.jsx index 3b6331906..87d47f9f7 100644 --- a/client/src/components/shop-templates-list/shop-templates-list.container.jsx +++ b/client/src/components/shop-templates-list/shop-templates-list.container.jsx @@ -1,79 +1,79 @@ -import { useQuery } from "@apollo/client"; -import { List, Button, Drawer } from "antd"; +import {useQuery} from "@apollo/client"; +import {Button, Drawer, List} from "antd"; import React from "react"; -import { QUERY_CUSTOM_TEMPLATES } from "../../graphql/templates.queries"; +import {QUERY_CUSTOM_TEMPLATES} from "../../graphql/templates.queries"; import AlertComponent from "../alert/alert.component"; import Skeleton from "../loading-skeleton/loading-skeleton.component"; -import { useTranslation } from "react-i18next"; -import { useHistory, useLocation } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {useLocation, useNavigate} from "react-router-dom"; import queryString from "query-string"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {TemplateList} from "../../utils/TemplateConstants"; import ShopTemplateAdd from "../shop-template-add/shop-template-add.component"; import ShopTemplateDeleteComponent from "../shop-template-delete/shop-template-delete.component"; -export default function ShopTemplatesListContainer({ visibleState }) { - const [visible, setVisible] = visibleState; - const { loading, error, data, refetch } = useQuery(QUERY_CUSTOM_TEMPLATES, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { t } = useTranslation(); - const search = queryString.parse(useLocation().search); - const history = useHistory(); - if (error) return ; +export default function ShopTemplatesListContainer({openState}) { + const [open, setOpen] = openState; + const {loading, error, data, refetch} = useQuery(QUERY_CUSTOM_TEMPLATES, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const {t} = useTranslation(); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); + if (error) return ; - const handleEdit = (record) => { - if (record) { - if (record.id) { - search.customTemplateId = record.id; - history.push({ search: queryString.stringify(search) }); - } - } else { - delete search.customTemplateId; - history.push({ search: queryString.stringify(search) }); - } - }; + const handleEdit = (record) => { + if (record) { + if (record.id) { + search.customTemplateId = record.id; + history({search: queryString.stringify(search)}); + } + } else { + delete search.customTemplateId; + history({search: queryString.stringify(search)}); + } + }; - return ( - setVisible(false)} - > -
    -
    {t("bodyshop.labels.customtemplates")}
    - - ( - handleEdit(item)}> - {t("general.actions.edit")} - , - , - ]} - > - -
    -
    {TemplateList()[item.name].title}
    -
    {TemplateList()[item.name].description}
    -
    {TemplateList()[item.name].drivingid}
    -
    -
    -
    - )} - /> -
    -
    - ); + return ( + ( setOpen(false)} + > +
    +
    {t("bodyshop.labels.customtemplates")}
    + + ( + handleEdit(item)}> + {t("general.actions.edit")} + , + , + ]} + > + +
    +
    {TemplateList()[item.name].title}
    +
    {TemplateList()[item.name].description}
    +
    {TemplateList()[item.name].drivingid}
    +
    +
    +
    + )} + /> +
    +
    ) + ); } diff --git a/client/src/components/shop-users-auth-edit/shop-users-auth-edit.component.jsx b/client/src/components/shop-users-auth-edit/shop-users-auth-edit.component.jsx index d99387fe7..2154ae4b2 100644 --- a/client/src/components/shop-users-auth-edit/shop-users-auth-edit.component.jsx +++ b/client/src/components/shop-users-auth-edit/shop-users-auth-edit.component.jsx @@ -1,53 +1,51 @@ -import { InputNumber, notification } from "antd"; -import React, { useState } from "react"; -import { useMutation } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { UPDATE_ASSOCIATION } from "../../graphql/user.queries"; +import {InputNumber, notification} from "antd"; +import React, {useState} from "react"; +import {useMutation} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {UPDATE_ASSOCIATION} from "../../graphql/user.queries"; -export default function ShopUsersAuthEdit({ association }) { - const { t } = useTranslation(); - const [updateAssociation] = useMutation(UPDATE_ASSOCIATION); - const [visible, setVisible] = useState(false); - const [value, setValue] = useState(association.authlevel); +export default function ShopUsersAuthEdit({association}) { + const {t} = useTranslation(); + const [updateAssociation] = useMutation(UPDATE_ASSOCIATION); + const [open, setOpen] = useState(false); + const [value, setValue] = useState(association.authlevel); - const handleSave = async () => { - setVisible(false); - const result = await updateAssociation({ - variables: { - assocId: association.id, - assoc: { authlevel: value }, - }, - }); + const handleSave = async () => { + setOpen(false); + const result = await updateAssociation({ + variables: { + assocId: association.id, + assoc: {authlevel: value}, + }, + }); - if (!!result.errors) { - notification["error"]({ - message: t("user.errors.updating", { - message: JSON.stringify(result.errors), - }), - }); - } - }; + if (!!result.errors) { + notification["error"]({ + message: t("user.errors.updating", { + message: JSON.stringify(result.errors), + }), + }); + } + }; - return ( -
    - {visible && ( + return (
    - setValue(val)} - defaultValue={association.authlevel} - onBlur={handleSave} - /> + {open && ( +
    + setValue(val)} + defaultValue={association.authlevel} + onBlur={handleSave} + /> +
    + )} + {!open && ( +
    + {association.authlevel || t("general.labels.na")} +
    + )}
    - )} - {!visible && ( -
    setVisible(true)} - > - {association.authlevel || t("general.labels.na")} -
    - )} -
    - ); + ); } diff --git a/client/src/components/shop-users/shop-users.component.jsx b/client/src/components/shop-users/shop-users.component.jsx index 65dd9e653..5de8b6b27 100644 --- a/client/src/components/shop-users/shop-users.component.jsx +++ b/client/src/components/shop-users/shop-users.component.jsx @@ -1,77 +1,78 @@ -import { useQuery } from "@apollo/client"; -import { Button, Table } from "antd"; +import {useQuery} from "@apollo/client"; +import {Button, Table} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_SHOP_ASSOCIATIONS } from "../../graphql/user.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_SHOP_ASSOCIATIONS} from "../../graphql/user.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; import ShopUsersAuthEdit from "../shop-users-auth-edit/shop-users-auth-edit.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopInfoUsersComponent); -export function ShopInfoUsersComponent({ bodyshop }) { - const { t } = useTranslation(); - const { loading, error, data } = useQuery(QUERY_SHOP_ASSOCIATIONS, { - variables: { shopid: bodyshop.id }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const columns = [ - { - title: t("user.fields.email"), - dataIndex: "email", - key: "email", - render: (text, record) => record.user.email, - }, - { - title: t("user.fields.authlevel"), - dataIndex: "authlevel", - key: "authlevel", - render: (text, record) => ( - - - - ), - }, - { - title: t("user.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( -
    - -
    - ), - }, - ]; +export function ShopInfoUsersComponent({bodyshop}) { + const {t} = useTranslation(); + const {loading, error, data} = useQuery(QUERY_SHOP_ASSOCIATIONS, { + variables: {shopid: bodyshop.id}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const columns = [ + { + title: t("user.fields.email"), + dataIndex: "email", + key: "email", + render: (text, record) => record.user.email, + }, + { + title: t("user.fields.authlevel"), + dataIndex: "authlevel", + key: "authlevel", + render: (text, record) => ( + + + + ), + }, + { + title: t("user.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( +
    + +
    + ), + }, + ]; - if (error) { - return ; - } - return ( -
    -
    - - ); + if (error) { + return ; + } + return ( +
    +
    + + ); } diff --git a/client/src/components/sign-in-form/sign-in-form.component.jsx b/client/src/components/sign-in-form/sign-in-form.component.jsx index 6db25387d..4bd58ea1d 100644 --- a/client/src/components/sign-in-form/sign-in-form.component.jsx +++ b/client/src/components/sign-in-form/sign-in-form.component.jsx @@ -1,110 +1,108 @@ -import { LockOutlined, UserOutlined } from "@ant-design/icons"; -import { Button, Form, Input } from "antd"; +import {LockOutlined, UserOutlined} from "@ant-design/icons"; +import {Button, Form, Input} from "antd"; import queryString from "query-string"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, Redirect, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import RomeLogo from "../../assets/RomeOnlineBlue.png"; -import { - emailSignInStart, - sendPasswordReset, -} from "../../redux/user/user.actions"; -import { - selectCurrentUser, - selectLoginLoading, - selectSignInError, -} from "../../redux/user/user.selectors"; +import {emailSignInStart, sendPasswordReset,} from "../../redux/user/user.actions"; +import {selectCurrentUser, selectLoginLoading, selectSignInError,} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import "./sign-in-form.styles.scss"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - signInError: selectSignInError, - loginLoading: selectLoginLoading, + currentUser: selectCurrentUser, + signInError: selectSignInError, + loginLoading: selectLoginLoading, }); const mapDispatchToProps = (dispatch) => ({ - emailSignInStart: (email, password) => - dispatch(emailSignInStart({ email, password })), - sendPasswordReset: (email) => dispatch(sendPasswordReset(email)), + emailSignInStart: (email, password) => + dispatch(emailSignInStart({email, password})), + sendPasswordReset: (email) => dispatch(sendPasswordReset(email)), }); export function SignInComponent({ - emailSignInStart, - currentUser, - signInError, - sendPasswordReset, - loginLoading, -}) { - const { redirect } = queryString.parse(useLocation().search); + emailSignInStart, + currentUser, + signInError, + sendPasswordReset, + loginLoading, + }) { + const {redirect} = queryString.parse(useLocation().search); + const navigate = useNavigate(); - const { t } = useTranslation(); - const handleFinish = (values) => { - const { email, password } = values; - emailSignInStart(email, password); - }; - const [form] = Form.useForm(); + const {t} = useTranslation(); + const handleFinish = (values) => { + const {email, password} = values; + emailSignInStart(email, password); + }; + const [form] = Form.useForm(); - if (currentUser.authorized === true) - return ; + useEffect(() => { + if (currentUser.authorized === true) { + navigate(redirect || "/manage/"); + } + }, [currentUser, redirect, navigate]); - return ( -
    -
    - Rome Online -
    -
    - - } - placeholder={t("general.labels.username")} - /> - - - } - type="password" - placeholder={t("general.labels.password")} - /> - - {signInError ? ( - - ) : null} - - - - - -
    - ); + + return ( +
    +
    + Rome Online +
    +
    + + } + placeholder={t("general.labels.username")} + /> + + + } + type="password" + placeholder={t("general.labels.password")} + /> + + {signInError ? ( + + ) : null} + + + + + +
    + ); } export default connect(mapStateToProps, mapDispatchToProps)(SignInComponent); diff --git a/client/src/components/sign-in-form/sign-in-form.styles.scss b/client/src/components/sign-in-form/sign-in-form.styles.scss index e24a3a038..0c449251a 100644 --- a/client/src/components/sign-in-form/sign-in-form.styles.scss +++ b/client/src/components/sign-in-form/sign-in-form.styles.scss @@ -3,6 +3,7 @@ align-items: center; flex-direction: column; padding: 2rem; + form { width: 75vw; max-width: 20rem; @@ -13,6 +14,7 @@ display: flex; align-items: center; margin-bottom: 2rem; + h1 { text-align: center; margin: 1rem; diff --git a/client/src/components/tech-header/tech-header.component.jsx b/client/src/components/tech-header/tech-header.component.jsx index e5fb02f9b..26ce84883 100644 --- a/client/src/components/tech-header/tech-header.component.jsx +++ b/client/src/components/tech-header/tech-header.component.jsx @@ -1,31 +1,32 @@ -import { Layout, Typography } from "antd"; +import {Layout, Typography} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { useTranslation } from "react-i18next"; -const { Header } = Layout; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {useTranslation} from "react-i18next"; + +const {Header} = Layout; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function TechHeader({ technician }) { - const { t } = useTranslation(); - return ( -
    - - {!!technician - ? t("tech.labels.loggedin", { - name: `${technician.first_name} ${technician.last_name}`, - }) - : t("tech.labels.notloggedin")} - -
    - ); +export function TechHeader({technician}) { + const {t} = useTranslation(); + return ( +
    + + {!!technician + ? t("tech.labels.loggedin", { + name: `${technician.first_name} ${technician.last_name}`, + }) + : t("tech.labels.notloggedin")} + +
    + ); } export default connect(mapStateToProps, mapDispatchToProps)(TechHeader); diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx index aeae354ae..abfda8993 100644 --- a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx @@ -1,91 +1,96 @@ -import { Divider, Form, Select } from "antd"; +import {Divider, Form, Select} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import JobSearchSelect from "../job-search-select/job-search-select.component"; import JobsDetailLaborContainer from "../jobs-detail-labor/jobs-detail-labor.container"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); -export function TechClockInComponent({ form, bodyshop, technician }) { - const { t } = useTranslation(); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const emps = bodyshop.employees.filter((e) => e.id === technician.id)[0]; - return ( -
    - - - - +export function TechClockInComponent({form, bodyshop, technician}) { + const {t} = useTranslation(); - - - - - - - prevValues.jobid !== curValues.jobid - } - > - {() => { - if (!form.getFieldValue("jobid")) return null; - return ( - - ); - }} - -
    - ); + + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); + + const emps = bodyshop.employees.filter((e) => e.id === technician.id)[0]; + + return ( +
    + + + + + + + + + + + + prevValues.jobid !== curValues.jobid + } + > + {() => { + if (!form.getFieldValue("jobid")) return null; + return ( + + ); + }} + +
    + ); } + export default connect(mapStateToProps, null)(TechClockInComponent); diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx index aac44a3b9..0b630220d 100644 --- a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx @@ -1,160 +1,168 @@ -import { useMutation } from "@apollo/client"; -import { Button, Card, Form, notification, Space } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, Card, Form, notification, Space} from "antd"; import axios from "axios"; -import moment from "moment"; -import momenttz from "moment-timezone"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_NEW_TIME_TICKET} from "../../graphql/timetickets.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import TechJobPrintTickets from "../tech-job-print-tickets/tech-job-print-tickets.component"; import TechClockInComponent from "./tech-job-clock-in-form.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + technician: selectTechnician, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setTimeTicketContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicket" })), + setTimeTicketContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicket"})), }); + export function TechClockInContainer({ - setTimeTicketContext, - technician, - bodyshop, - currentUser, -}) { - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const [insertTimeTicket] = useMutation(INSERT_NEW_TIME_TICKET, { - refetchQueries: ["QUERY_ACTIVE_TIME_TICKETS"], - }); - const { t } = useTranslation(); - - const emps = bodyshop.employees.filter( - (e) => e.id === (technician && technician.id) - )[0]; - - const handleFinish = async (values) => { - setLoading(true); - const theTime = (await axios.post("/utils/time")).data; - const result = await insertTimeTicket({ - variables: { - timeTicketInput: [ - { - bodyshopid: bodyshop.id, - employeeid: technician.id, - date: - typeof bodyshop.timezone === "string" - ? momenttz.tz(theTime, bodyshop.timezone).format("YYYY-MM-DD") - : typeof bodyshop.timezone === "number" - ? moment(theTime) - .format("YYYY-MM-DD") - .utcOffset(bodyshop.timezone) - : moment(theTime).format("YYYY-MM-DD"), - clockon: moment(theTime), - jobid: values.jobid, - cost_center: values.cost_center, - ciecacode: - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === 'on' - ? values.cost_center - : Object.keys( - bodyshop.md_responsibility_centers.defaults.costs - ).find((key) => { - return ( - bodyshop.md_responsibility_centers.defaults.costs[key] === - values.cost_center - ); - }), - created_by: currentUser.email.concat( - " | ", - technician.employee_number - .concat(" ", technician.first_name, " ", technician.last_name) - .trim() - ), - }, - ], - }, + setTimeTicketContext, + technician, + bodyshop, + currentUser, + }) { + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, }); - if (!!result.errors) { - notification["error"]({ - message: t("timetickets.errors.clockingin", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("timetickets.successes.clockedin"), - }); - } - form.resetFields(); - setLoading(false); - }; + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [insertTimeTicket] = useMutation(INSERT_NEW_TIME_TICKET, { + refetchQueries: ["QUERY_ACTIVE_TIME_TICKETS"], + }); + const {t} = useTranslation(); - return ( - - - - - - } - > -
    - - -
    - ); + const emps = bodyshop.employees.filter( + (e) => e.id === (technician && technician.id) + )[0]; + + const TechForm = () => { + if (technician) { + return
    + + + } else { + return
    + } + } + + const handleFinish = async (values) => { + setLoading(true); + const theTime = (await axios.post("/utils/time")).data; + const result = await insertTimeTicket({ + variables: { + timeTicketInput: [ + { + bodyshopid: bodyshop.id, + employeeid: technician.id, + date: + typeof bodyshop.timezone === "string" + // TODO: Client Update - This may be broken + ? dayjs.tz(theTime, bodyshop.timezone).format("YYYY-MM-DD") + : typeof bodyshop.timezone === "number" + ? dayjs(theTime) + .format("YYYY-MM-DD") + .utcOffset(bodyshop.timezone) + : dayjs(theTime).format("YYYY-MM-DD"), + clockon: dayjs(theTime), + jobid: values.jobid, + cost_center: values.cost_center, + ciecacode: + bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === 'on' + ? values.cost_center + : Object.keys( + bodyshop.md_responsibility_centers.defaults.costs + ).find((key) => { + return ( + bodyshop.md_responsibility_centers.defaults.costs[key] === + values.cost_center + ); + }), + created_by: currentUser.email.concat( + " | ", + technician.employee_number + .concat(" ", technician.first_name, " ", technician.last_name) + .trim() + ), + }, + ], + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.clockingin", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.clockedin"), + }); + } + form.resetFields(); + setLoading(false); + }; + + return ( + + + + + + } + > + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TechClockInContainer); diff --git a/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx b/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx index 321ef903d..6db770386 100644 --- a/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx +++ b/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx @@ -1,316 +1,304 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { - Button, - Card, - Col, - Form, - InputNumber, - Popover, - Row, - Select, - notification, -} from "antd"; +import {useMutation, useQuery} from "@apollo/client"; +import {Button, Card, Col, Form, InputNumber, notification, Popover, Row, Select,} from "antd"; import axios from "axios"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { GET_LINE_TICKET_BY_PK } from "../../graphql/jobs-lines.queries"; -import { UPDATE_JOB_STATUS } from "../../graphql/jobs.queries"; -import { UPDATE_TIME_TICKET } from "../../graphql/timetickets.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { CalculateAllocationsTotals } from "../labor-allocations-table/labor-allocations-table.utility"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {GET_LINE_TICKET_BY_PK} from "../../graphql/jobs-lines.queries"; +import {UPDATE_JOB_STATUS} from "../../graphql/jobs.queries"; +import {UPDATE_TIME_TICKET} from "../../graphql/timetickets.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {CalculateAllocationsTotals} from "../labor-allocations-table/labor-allocations-table.utility"; import TechJobClockoutDelete from "../tech-job-clock-out-delete/tech-job-clock-out-delete.component"; -import { LaborAllocationContainer } from "../time-ticket-modal/time-ticket-modal.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {LaborAllocationContainer} from "../time-ticket-modal/time-ticket-modal.component"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, + bodyshop: selectBodyshop, + technician: selectTechnician, }); export function TechClockOffButton({ - bodyshop, - technician, - jobId, - timeTicketId, - completedCallback, - isShiftTicket, - otherBtnProps, -}) { - const [loading, setLoading] = useState(false); - const [updateTimeticket] = useMutation(UPDATE_TIME_TICKET); - const [updateJobStatus] = useMutation(UPDATE_JOB_STATUS); - const [form] = Form.useForm(); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - - const { queryLoading, data: lineTicketData } = useQuery( - GET_LINE_TICKET_BY_PK, - { - variables: { - id: jobId, - }, - skip: !jobId, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); - const { t } = useTranslation(); - const emps = bodyshop.employees.filter( - (e) => e.id === (technician && technician.id) - )[0]; - - const handleFinish = async (values) => { - logImEXEvent("tech_clock_out_job"); - const status = values.status; - delete values.status; - setLoading(true); - const result = await updateTimeticket({ - variables: { - timeticketId: timeTicketId, - timeticket: { - clockoff: (await axios.post("/utils/time")).data, - ...values, - rate: - emps && - emps.rates.filter((r) => r.cost_center === values.cost_center)[0] - ?.rate, - flat_rate: emps && emps.flat_rate, - ciecacode: - bodyshop.cdk_dealerid || - bodyshop.pbs_serialnumber || - Enhanced_Payroll.treatment === "on" - ? values.cost_center - : Object.keys( - bodyshop.md_responsibility_centers.defaults.costs - ).find((key) => { - return ( - bodyshop.md_responsibility_centers.defaults.costs[key] === - values.cost_center - ); - }), - }, - }, + bodyshop, + technician, + jobId, + timeTicketId, + completedCallback, + isShiftTicket, + otherBtnProps, + }) { + const [loading, setLoading] = useState(false); + const [updateTimeticket] = useMutation(UPDATE_TIME_TICKET); + const [updateJobStatus] = useMutation(UPDATE_JOB_STATUS); + const [form] = Form.useForm(); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, }); - if (!!result.errors) { - notification["error"]({ - message: t("timetickets.errors.clockingout", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("timetickets.successes.clockedout"), - }); - } - if (!isShiftTicket) { - const job_update_result = await updateJobStatus({ - variables: { - jobId: jobId, - status: status, - }, - }); + const {queryLoading, data: lineTicketData} = useQuery( + GET_LINE_TICKET_BY_PK, + { + variables: { + id: jobId, + }, + skip: !jobId, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } + ); + const {t} = useTranslation(); + const emps = bodyshop.employees.filter( + (e) => e.id === (technician && technician.id) + )[0]; - if (!!job_update_result.errors) { - notification["error"]({ - message: t("jobs.errors.updating", { - message: JSON.stringify(result.errors), - }), + const handleFinish = async (values) => { + logImEXEvent("tech_clock_out_job"); + const status = values.status; + delete values.status; + setLoading(true); + const result = await updateTimeticket({ + variables: { + timeticketId: timeTicketId, + timeticket: { + clockoff: (await axios.post("/utils/time")).data, + ...values, + rate: + emps && + emps.rates.filter((r) => r.cost_center === values.cost_center)[0] + ?.rate, + flat_rate: emps && emps.flat_rate, + ciecacode: + bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + Enhanced_Payroll.treatment === "on" + ? values.cost_center + : Object.keys( + bodyshop.md_responsibility_centers.defaults.costs + ).find((key) => { + return ( + bodyshop.md_responsibility_centers.defaults.costs[key] === + values.cost_center + ); + }), + }, + }, }); - } else { - notification["success"]({ - message: t("jobs.successes.updated"), - }); - } - } - setLoading(false); - if (completedCallback) completedCallback(); - }; - const overlay = ( - -
    -
    - -
    - {!isShiftTicket ? ( -
    - - - - ({ - validator(rule, value) { - console.log( - bodyshop.tt_enforce_hours_for_tech_console - ); - if (!bodyshop.tt_enforce_hours_for_tech_console) { - return Promise.resolve(); - } - if ( - !value || - getFieldValue("cost_center") === null || - !lineTicketData - ) - return Promise.resolve(); + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.clockingout", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.clockedout"), + }); + } + if (!isShiftTicket) { + const job_update_result = await updateJobStatus({ + variables: { + jobId: jobId, + status: status, + }, + }); - //Check the cost center, - const totals = CalculateAllocationsTotals( - bodyshop, - lineTicketData.joblines, - lineTicketData.timetickets, - lineTicketData.jobs_by_pk.lbr_adjustments - ); + if (!!job_update_result.errors) { + notification["error"]({ + message: t("jobs.errors.updating", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("jobs.successes.updated"), + }); + } + } + setLoading(false); + if (completedCallback) completedCallback(); + }; - const fieldTypeToCheck = - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber - ? "mod_lbr_ty" - : "cost_center"; - - const costCenterDiff = - Math.round( - totals.find( - (total) => - total[fieldTypeToCheck] === - getFieldValue("cost_center") - )?.difference * 10 - ) / 10; - - if (value > costCenterDiff) - return Promise.reject( - t( - "timetickets.validation.hoursenteredmorethanavailable" - ) - ); - else { - return Promise.resolve(); - } - }, - }), - ]} - > - - -
    - ) : null} - - - - - {isShiftTicket ? ( -
    - ) : ( - +
    + - - - )} - - - - {!isShiftTicket && ( -
    - - - )} - - - - - ); + + + {!isShiftTicket ? ( +
    + + + + ({ + validator(rule, value) { + if (!bodyshop.tt_enforce_hours_for_tech_console) { + return Promise.resolve(); + } + if ( + !value || + getFieldValue("cost_center") === null || + !lineTicketData + ) + return Promise.resolve(); - return ( - - - - ); + //Check the cost center, + const totals = CalculateAllocationsTotals( + bodyshop, + lineTicketData.joblines, + lineTicketData.timetickets, + lineTicketData.jobs_by_pk.lbr_adjustments + ); + + const fieldTypeToCheck = + bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber + ? "mod_lbr_ty" + : "cost_center"; + + const costCenterDiff = + Math.round( + totals.find( + (total) => + total[fieldTypeToCheck] === + getFieldValue("cost_center") + )?.difference * 10 + ) / 10; + + if (value > costCenterDiff) + return Promise.reject( + t( + "timetickets.validation.hoursenteredmorethanavailable" + ) + ); + else { + return Promise.resolve(); + } + }, + }), + ]} + > + + +
    + ) : null} + + + + + {isShiftTicket ? ( +
    + ) : ( + + + + )} + + + + {!isShiftTicket && ( + + + + )} + + + + + ); + + return ( + + + + ); } + export default connect(mapStateToProps, null)(TechClockOffButton); diff --git a/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx b/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx index 82eec0d79..d28bfde5f 100644 --- a/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx +++ b/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx @@ -1,47 +1,47 @@ import React from "react"; -import { Popconfirm, notification } from "antd"; -import { DeleteFilled } from "@ant-design/icons"; -import { DELETE_TIME_TICKET } from "../../graphql/timetickets.queries"; -import { useTranslation } from "react-i18next"; -import { useMutation } from "@apollo/client"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {notification, Popconfirm} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {DELETE_TIME_TICKET} from "../../graphql/timetickets.queries"; +import {useTranslation} from "react-i18next"; +import {useMutation} from "@apollo/client"; +import {logImEXEvent} from "../../firebase/firebase.utils"; export default function TechJobClockoutDelete({ - timeTicketId, - completedCallback, -}) { - const [deleteTimeTicket] = useMutation(DELETE_TIME_TICKET); - const { t } = useTranslation(); - const handleDelete = async () => { - logImEXEvent("tech_clock_delete"); + timeTicketId, + completedCallback, + }) { + const [deleteTimeTicket] = useMutation(DELETE_TIME_TICKET); + const {t} = useTranslation(); + const handleDelete = async () => { + logImEXEvent("tech_clock_delete"); - const result = await deleteTimeTicket({ - variables: { id: timeTicketId }, - refetchQueries: ["QUERY_ACTIVE_TIME_TICKETS"], - }); + const result = await deleteTimeTicket({ + variables: {id: timeTicketId}, + refetchQueries: ["QUERY_ACTIVE_TIME_TICKETS"], + }); - if (!!result.errors) { - notification["error"]({ - message: t("timetickets.errors.deleting", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("timetickets.successes.deleted"), - }); - } - if (completedCallback) completedCallback(); - }; + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.deleting", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.deleted"), + }); + } + if (completedCallback) completedCallback(); + }; - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx b/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx index 7572fa9b9..aa16bcd41 100644 --- a/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx +++ b/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx @@ -1,100 +1,101 @@ -import { Card, List, Typography } from "antd"; +import {Card, List, Typography} from "antd"; import React from "react"; -import { useQuery } from "@apollo/client"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ACTIVE_TIME_TICKETS } from "../../graphql/timetickets.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useQuery} from "@apollo/client"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ACTIVE_TIME_TICKETS} from "../../graphql/timetickets.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; import DataLabel from "../data-label/data-label.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import TechClockOffButton from "../tech-job-clock-out-button/tech-job-clock-out-button.component"; -import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; +import {OwnerNameDisplayFunction} from "../owner-name-display/owner-name-display.component"; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function TechClockedInList({ technician }) { - const { loading, error, data, refetch } = useQuery( - QUERY_ACTIVE_TIME_TICKETS, - { - variables: { - employeeId: technician.id, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); +export function TechClockedInList({technician}) { + const {loading, error, data, refetch} = useQuery( + QUERY_ACTIVE_TIME_TICKETS, + { + variables: { + employeeId: technician?.id, + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !technician, + } + ); - const { t } = useTranslation(); + const {t} = useTranslation(); + if (loading) return ; + if (error) return ; - if (loading) return ; - if (error) return ; - - return ( -
    - {data.timetickets.length > 0 ? ( + return (
    - - {t("timetickets.labels.alreadyclockedon")} - - ( - - - {`${ - ticket.job.ro_number || t("general.labels.na") - } ${OwnerNameDisplayFunction(ticket.job)}`} - - } - actions={[ - , - ]} - > -
    - {` + {data?.timetickets?.length > 0 ? ( +
    + + {t("timetickets.labels.alreadyclockedon")} + + ( + + + {`${ + ticket.job.ro_number || t("general.labels.na") + } ${OwnerNameDisplayFunction(ticket.job)}`} + + } + actions={[ + , + ]} + > +
    + {` ${ticket.job.v_model_yr || ""} ${ - ticket.job.v_make_desc || "" - } ${ticket.job.v_model_desc || ""}`} -
    - - {ticket.clockon} - - - {ticket.cost_center === "timetickets.labels.shift" - ? t(ticket.cost_center) - : ticket.cost_center} - -
    -
    - )} - >
    + ticket.job.v_make_desc || "" + } ${ticket.job.v_model_desc || ""}`} +
    + + {ticket.clockon} + + + {ticket.cost_center === "timetickets.labels.shift" + ? t(ticket.cost_center) + : ticket.cost_center} + + + + )} + > +
    + ) : null}
    - ) : null} -
    - ); + ); } + export default connect(mapStateToProps, mapDispatchToProps)(TechClockedInList); diff --git a/client/src/components/tech-job-print-tickets/tech-job-print-tickets.component.jsx b/client/src/components/tech-job-print-tickets/tech-job-print-tickets.component.jsx index b96a1d062..58769e26c 100644 --- a/client/src/components/tech-job-print-tickets/tech-job-print-tickets.component.jsx +++ b/client/src/components/tech-job-print-tickets/tech-job-print-tickets.component.jsx @@ -1,147 +1,147 @@ -import { Button, Card, DatePicker, Form, Popover, Radio, Space } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { logImEXEvent } from "../../firebase/firebase.utils"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; +import {Button, Card, DatePicker, Form, Popover, Radio, Space} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {logImEXEvent} from "../../firebase/firebase.utils"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; import DatePIckerRanges from "../../utils/DatePickerRanges"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TechJobPrintTickets); -export function TechJobPrintTickets({ technician, event, attendacePrint }) { - const { t } = useTranslation(); +export function TechJobPrintTickets({technician, event, attendacePrint}) { + const {t} = useTranslation(); - const [loading, setLoading] = useState(false); - const [form] = Form.useForm(); - const [visibility, setVisibility] = useState(false); - const Templates = TemplateList("report_center"); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [visibility, setVisibility] = useState(false); + const Templates = TemplateList("report_center"); - useEffect(() => { - if (visibility && event) { - form.setFieldsValue(event); - } - }, [visibility, form, event]); + useEffect(() => { + if (visibility && event) { + form.setFieldsValue(event); + } + }, [visibility, form, event]); - const handleFinish = async (values) => { - logImEXEvent("schedule_manual_event"); + const handleFinish = async (values) => { + logImEXEvent("schedule_manual_event"); - setLoading(true); - const start = values.dates[0]; - const end = values.dates[1]; + setLoading(true); + const start = values.dates[0]; + const end = values.dates[1]; - try { - await GenerateDocument( - { - name: - attendacePrint === true - ? Templates.attendance_employee.key - : Templates.timetickets_employee.key, - variables: { - ...(start - ? { start: moment(start).startOf("day").format("YYYY-MM-DD") } - : {}), - ...(end - ? { end: moment(end).endOf("day").format("YYYY-MM-DD") } - : {}), - ...(start ? { starttz: moment(start).startOf("day") } : {}), - ...(end ? { endtz: moment(end).endOf("day") } : {}), + try { + await GenerateDocument( + { + name: + attendacePrint === true + ? Templates.attendance_employee.key + : Templates.timetickets_employee.key, + variables: { + ...(start + ? {start: dayjs(start).startOf("day").format("YYYY-MM-DD")} + : {}), + ...(end + ? {end: dayjs(end).endOf("day").format("YYYY-MM-DD")} + : {}), + ...(start ? {starttz: dayjs(start).startOf("day")} : {}), + ...(end ? {endtz: dayjs(end).endOf("day")} : {}), - id: technician.id, - }, - }, - { - to: technician.email, - subject: - attendacePrint === true - ? Templates.attendance_employee.subject - : Templates.timetickets_employee.subject, - }, - values.sendby // === "email" ? "e" : "p" - ); - } catch (error) { - console.log(error); - } finally { - setLoading(false); - setVisibility(false); - form.resetFields(); - } - }; + id: technician.id, + }, + }, + { + to: technician.email, + subject: + attendacePrint === true + ? Templates.attendance_employee.subject + : Templates.timetickets_employee.subject, + }, + values.sendby // === "email" ? "e" : "p" + ); + } catch (error) { + console.log(error); + } finally { + setLoading(false); + setVisibility(false); + form.resetFields(); + } + }; - const overlay = ( - -
    -
    - - - - - {() => { - return ( - - - {t("general.labels.email")} - {t("general.labels.print")} - - - ); - }} - - - + + + +
    +
    + ); + + const handleClick = (e) => { + setVisibility(true); + }; + + return ( + + - - - - - - ); - - const handleClick = (e) => { - setVisibility(true); - }; - - return ( - - - - ); + + ); } diff --git a/client/src/components/tech-job-statistics/tech-job-statistics.component.jsx b/client/src/components/tech-job-statistics/tech-job-statistics.component.jsx index df7f2af75..273187b53 100644 --- a/client/src/components/tech-job-statistics/tech-job-statistics.component.jsx +++ b/client/src/components/tech-job-statistics/tech-job-statistics.component.jsx @@ -1,131 +1,133 @@ -import { useQuery } from "@apollo/client"; -import { Card, Col, Space, Statistic, Typography } from "antd"; -import moment from "moment"; -import { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_TIME_TICKETS_TECHNICIAN_IN_RANGE } from "../../graphql/timetickets.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; +import {useQuery} from "@apollo/client"; +import {Card, Col, Space, Statistic, Typography} from "antd"; +import dayjs from "../../utils/day"; +import {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_TIME_TICKETS_TECHNICIAN_IN_RANGE} from "../../graphql/timetickets.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -const { Title } = Typography; + +const {Title} = Typography; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({}); -const TechJobStatistics = ({ technician }) => { - const { t } = useTranslation(); +const TechJobStatistics = ({technician}) => { + const {t} = useTranslation(); - const startDate = moment().startOf("week"); - const endDate = moment().endOf("week"); + const startDate = dayjs().startOf("week"); + const endDate = dayjs().endOf("week"); - const { loading, error, data } = useQuery( - QUERY_TIME_TICKETS_TECHNICIAN_IN_RANGE, - { - variables: { - start: startDate.format("YYYY-MM-DD"), - end: endDate.format("YYYY-MM-DD"), - fixedStart: moment().startOf("month").format("YYYY-MM-DD"), - fixedEnd: moment().endOf("month").format("YYYY-MM-DD"), - employeeid: technician.id, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); + const {loading, error, data} = useQuery( + QUERY_TIME_TICKETS_TECHNICIAN_IN_RANGE, + { + variables: { + start: startDate.format("YYYY-MM-DD"), + end: endDate.format("YYYY-MM-DD"), + fixedStart: dayjs().startOf("month").format("YYYY-MM-DD"), + fixedEnd: dayjs().endOf("month").format("YYYY-MM-DD"), + employeeid: technician?.id, + }, + skip: !technician, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } + ); - const totals = useMemo(() => { - if (data && data.timetickets && data.fixedperiod) { - const week = data.timetickets.reduce( - (acc, val) => { - acc.productivehrs = acc.productivehrs + val.productivehrs; - acc.actualhrs = acc.actualhrs + val.actualhrs; - return acc; - }, - { productivehrs: 0, actualhrs: 0 } - ); + const totals = useMemo(() => { + if (data && data.timetickets && data.fixedperiod) { + const week = data.timetickets.reduce( + (acc, val) => { + acc.productivehrs = acc.productivehrs + val.productivehrs; + acc.actualhrs = acc.actualhrs + val.actualhrs; + return acc; + }, + {productivehrs: 0, actualhrs: 0} + ); - const month = data.fixedperiod.reduce( - (acc, val) => { - acc.productivehrs = acc.productivehrs + val.productivehrs; - acc.actualhrs = acc.actualhrs + val.actualhrs; - return acc; - }, - { productivehrs: 0, actualhrs: 0 } - ); + const month = data.fixedperiod.reduce( + (acc, val) => { + acc.productivehrs = acc.productivehrs + val.productivehrs; + acc.actualhrs = acc.actualhrs + val.actualhrs; + return acc; + }, + {productivehrs: 0, actualhrs: 0} + ); - return { - week, - month, - }; - } + return { + week, + month, + }; + } - return { - week: { productivehrs: 0, actualhrs: 0 }, - month: { productivehrs: 0, actualhrs: 0 }, - }; - }, [data]); + return { + week: {productivehrs: 0, actualhrs: 0}, + month: {productivehrs: 0, actualhrs: 0}, + }; + }, [data]); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - return ( - - -
    - {t("scoreboard.labels.thisweek")} - - - - - - - - {t("scoreboard.labels.thismonth")} - - - - - - - - - ); + return ( + + + + {t("scoreboard.labels.thisweek")} + + + + + + + + {t("scoreboard.labels.thismonth")} + + + + + + + + + ); }; export default connect(mapStateToProps, mapDispatchToProps)(TechJobStatistics); diff --git a/client/src/components/tech-login/tech-login.component.jsx b/client/src/components/tech-login/tech-login.component.jsx index 502b20cbf..d5ca5cb97 100644 --- a/client/src/components/tech-login/tech-login.component.jsx +++ b/client/src/components/tech-login/tech-login.component.jsx @@ -1,78 +1,85 @@ -import { Button, Form, Input } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { techLoginStart } from "../../redux/tech/tech.actions"; -import { - selectLoginError, - selectLoginLoading, - selectTechnician, -} from "../../redux/tech/tech.selectors"; +import {Button, Form, Input} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {techLoginStart} from "../../redux/tech/tech.actions"; +import {selectLoginError, selectLoginLoading, selectTechnician,} from "../../redux/tech/tech.selectors"; import AlertComponent from "../alert/alert.component"; import "./tech-login.styles.scss"; -import { Redirect } from "react-router-dom"; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, - loginError: selectLoginError, - loginLoading: selectLoginLoading, + technician: selectTechnician, + loginError: selectLoginError, + loginLoading: selectLoginLoading, }); const mapDispatchToProps = (dispatch) => ({ - techLoginStart: (user) => dispatch(techLoginStart(user)), + techLoginStart: (user) => dispatch(techLoginStart(user)), }); export function TechLogin({ - technician, - loginError, - loginLoading, - techLoginStart, -}) { - const { t } = useTranslation(); + technician, + loginError, + loginLoading, + techLoginStart, + }) { + const {t} = useTranslation(); + const navigate = useNavigate(); - const handleFinish = (values) => { - techLoginStart(values); - }; + const handleFinish = (values) => { + // Remap these because EmployeeID form name has previously been used in the project + techLoginStart({pin: values.pin, employeeid: values.techEmployeeId}); + }; - return ( -
    - {technician ? : null} -
    - - - - - - - - - {loginError ? : null} -
    - ); + useEffect(() => { + if (technician) return navigate("/tech/joblookup"); + }, [technician, navigate]); + + useEffect(() => { + document.title = t("titles.techconsole"); + }, [t]); + + return ( +
    +
    + + + + + + + + + {loginError ? : null} +
    + ); } + export default connect(mapStateToProps, mapDispatchToProps)(TechLogin); diff --git a/client/src/components/tech-login/tech-login.styles.scss b/client/src/components/tech-login/tech-login.styles.scss index c7d1d5a57..679ed4fb0 100644 --- a/client/src/components/tech-login/tech-login.styles.scss +++ b/client/src/components/tech-login/tech-login.styles.scss @@ -3,10 +3,12 @@ align-items: center; flex-direction: column; padding: 2rem; + form { width: 75vw; max-width: 30rem; } + .login-btn { margin: 1.5rem 0rem; position: relative; diff --git a/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx index 02e62d274..a54453284 100644 --- a/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx +++ b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx @@ -1,15 +1,16 @@ -import { PrinterFilled } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Divider, Drawer, Grid, PageHeader, Tabs } from "antd"; +import {PrinterFilled} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Divider, Drawer, Grid, Tabs} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { GET_JOB_BY_PK } from "../../graphql/jobs.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {GET_JOB_BY_PK} from "../../graphql/jobs.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import JobLinesContainer from "../job-detail-lines/job-lines.container"; import JobsDetailHeader from "../jobs-detail-header/jobs-detail-header.component"; @@ -18,11 +19,11 @@ import JobsDocumentsLocalGallery from "../jobs-documents-local-gallery/jobs-docu import JobNotesContainer from "../jobs-notes/jobs-notes.container"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); +const mapStateToProps = createStructuredSelector({bodyshop: selectBodyshop}); const mapDispatchToProps = (dispatch) => ({ - setPrintCenterContext: (context) => - dispatch(setModalContext({ context: context, modal: "printCenter" })), + setPrintCenterContext: (context) => + dispatch(setModalContext({context: context, modal: "printCenter"})), }); // const colBreakPoints = { @@ -34,105 +35,118 @@ const mapDispatchToProps = (dispatch) => ({ // }, // }; -export function TechLookupJobsDrawer({ bodyshop, setPrintCenterContext }) { - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; +export function TechLookupJobsDrawer({bodyshop, setPrintCenterContext}) { + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const bpoints = { - xs: "100%", - sm: "100%", - md: "100%", - lg: "100%", - xl: "90%", - xxl: "85%", - }; - const drawerPercentage = selectedBreakpoint - ? bpoints[selectedBreakpoint[0]] - : "100%"; + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "100%", + xl: "90%", + xxl: "85%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; - const searchParams = queryString.parse(useLocation().search); - const { selected } = searchParams; - const history = useHistory(); - const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, { - variables: { id: selected }, - skip: !selected, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const { t } = useTranslation(); - const handleDrawerClose = () => { - delete searchParams.selected; - history.push({ - search: queryString.stringify({ - ...searchParams, - }), + const searchParams = queryString.parse(useLocation().search); + const {selected} = searchParams; + const history = useNavigate(); + const {loading, error, data, refetch} = useQuery(GET_JOB_BY_PK, { + variables: {id: selected}, + skip: !selected, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - }; - return ( - - {loading ? : null} - {error ? : null} - {data ? ( - window.history.back()} - title={data.jobs_by_pk.ro_number || t("general.labels.na")} - extra={ - - } + const {t} = useTranslation(); + const handleDrawerClose = () => { + delete searchParams.selected; + history({ + search: queryString.stringify({ + ...searchParams, + }), + }); + }; + + return ( + - - - - - - - - {bodyshop.uselocalmediaserver ? ( - - ) : ( - - )} - - - - - - - ) : null} - - ); + {loading ? : null} + {error ? : null} + {data ? ( + window.history.back()} + title={data.jobs_by_pk.ro_number || t("general.labels.na")} + extra={ + + } + > + + + + ), + }, + { + key: "documents", + label: t("jobs.labels.documents"), + children: bodyshop.uselocalmediaserver ? ( + + ) : ( + + ), + }, + { + key: "notes", + label: t("jobs.labels.notes"), + children: , + }, + ]} + /> + + ) : null} + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TechLookupJobsDrawer); diff --git a/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx b/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx index 519aff991..46a3708e0 100644 --- a/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx +++ b/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx @@ -1,228 +1,228 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Input, Space, Table } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Input, Space, Table} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ALL_ACTIVE_JOBS} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort} from "../../utils/sorters"; import AlertComponent from "../alert/alert.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function TechLookupJobsList({ bodyshop }) { - const searchParams = queryString.parse(useLocation().search); - const { selected } = searchParams; +export function TechLookupJobsList({bodyshop}) { + const searchParams = queryString.parse(useLocation().search); + const {selected} = searchParams; - const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { - variables: { - statuses: bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"], - isConverted: true, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data, refetch} = useQuery(QUERY_ALL_ACTIVE_JOBS, { + variables: { + statuses: bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"], + isConverted: true, + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); - const history = useHistory(); - const [searchText, setSearchText] = useState(""); + const {t} = useTranslation(); + const history = useNavigate(); + const [searchText, setSearchText] = useState(""); - if (error) return ; + if (error) return ; - const jobs = data - ? searchText === "" - ? data.jobs - : data.jobs.filter( - (j) => - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_co_nm || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : []; + const jobs = data + ? searchText === "" + ? data.jobs + : data.jobs.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - history.push({ - search: queryString.stringify({ - ...searchParams, - selected: record.id, - }), - }); - } - } - }; + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + history({ + search: queryString.stringify({ + ...searchParams, + selected: record.id, + }), + }); + } + } + }; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => record.ro_number || t("general.labels.na"), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - ellipsis: true, - render: (text, record) => ( - - + render: (text, record) => record.ro_number || t("general.labels.na"), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + ellipsis: true, + render: (text, record) => ( + + - ), - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - filters: - (jobs && - jobs - .map((j) => j.status) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "No Status*", - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.status), - render: (text, record) => { - return record.status || t("general.labels.na"); - }, - }, - - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ), - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate_no", - key: "plate_no", - sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), - sortOrder: - state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, - render: (text, record) => { - return record.plate_no ? record.plate_no : ""; - }, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - render: (text, record) => { - return record.clm_no ? ( - {record.clm_no} - ) : ( - t("general.labels.unknown") - ); - }, - }, - ]; - - return ( - - - { - setSearchText(e.target.value); - }} - value={searchText} - enterButton - /> - - } - > -
    { - handleOnRowClick(record); - }, - selectedRowKeys: [selected], - type: "radio", - }} - onChange={handleTableChange} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); + ), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + (jobs && + jobs + .map((j) => j.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), + render: (text, record) => { + return record.status || t("general.labels.na"); }, - }; - }} - /> - - ); + }, + + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ), + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), + sortOrder: + state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, + render: (text, record) => { + return record.plate_no ? record.plate_no : ""; + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + render: (text, record) => { + return record.clm_no ? ( + {record.clm_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + ]; + + return ( + + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> + + } + > +
    { + handleOnRowClick(record); + }, + selectedRowKeys: [selected], + type: "radio", + }} + onChange={handleTableChange} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + ); } export default connect(mapStateToProps, null)(TechLookupJobsList); diff --git a/client/src/components/tech-sider/tech-sider.component.jsx b/client/src/components/tech-sider/tech-sider.component.jsx index 49f2487dc..c3932e96c 100644 --- a/client/src/components/tech-sider/tech-sider.component.jsx +++ b/client/src/components/tech-sider/tech-sider.component.jsx @@ -1,146 +1,152 @@ -import Icon, { - SearchOutlined, - ScheduleOutlined, - UserAddOutlined, - CarOutlined, -} from "@ant-design/icons"; -import { Layout, Menu } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { FaBusinessTime } from "react-icons/fa"; -import { FiLogIn, FiLogOut } from "react-icons/fi"; -import { MdTimer } from "react-icons/md"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { techLogout } from "../../redux/tech/tech.actions"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { BsKanban } from "react-icons/bs"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import Icon, {CarOutlined, ScheduleOutlined, SearchOutlined, UserAddOutlined,} from "@ant-design/icons"; +import {Layout, Menu} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {FaBusinessTime} from "react-icons/fa"; +import {FiLogIn, FiLogOut} from "react-icons/fi"; +import {MdTimer} from "react-icons/md"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {techLogout} from "../../redux/tech/tech.actions"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {BsKanban} from "react-icons/bs"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; -const { Sider } = Layout; +const {Sider} = Layout; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, - bodyshop: selectBodyshop, + technician: selectTechnician, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - techLogout: () => dispatch(techLogout()), - setTimeTicketTaskContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicketTask" })), + techLogout: () => dispatch(techLogout()), + setTimeTicketTaskContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicketTask"})), }); export function TechSider({ - technician, - techLogout, - bodyshop, - setTimeTicketTaskContext, -}) { - const [collapsed, setCollapsed] = useState(true); - const { t } = useTranslation(); - const onCollapse = (collapsed) => { - setCollapsed(collapsed); - }; - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); + technician, + techLogout, + bodyshop, + setTimeTicketTaskContext, + }) { + const [collapsed, setCollapsed] = useState(true); + const {t} = useTranslation(); + const onCollapse = (collapsed) => { + setCollapsed(collapsed); + }; - return ( - - - } - > - {t("menus.tech.login")} - - }> - {t("menus.tech.joblookup")} - - {Enhanced_Payroll.treatment === "on" ? ( - <> - } - > - {t("menus.tech.assignedjobs")} - - } - onClick={() => { - setTimeTicketTaskContext({ - actions: {}, - context: { jobid: null }, - }); - }} - > - {t("menus.tech.claimtask")} - - - ) : ( - } - > - {t("menus.tech.jobclockin")} - - )} - } - > - {t("menus.tech.shiftclockin")} - - }> - {t("menus.tech.productionlist")} - - } - > - - {t("menus.tech.dispatchedparts")} - - - } - > - {t("menus.tech.productionboard")} - + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); - techLogout()} - icon={} + const items = [ + { + key: "1", + icon: , + disabled: !!technician, + label: {t("menus.tech.login")}, + }, + { + key: "2", + icon: , + disabled: !!!technician, + label: {t("menus.tech.joblookup")}, + }]; + + if (Enhanced_Payroll.treatment === 'on') { + items.push({ + key: 'TechAssignedProdJobs', + disabled: !!!technician, + icon: , + label: {t("menus.tech.assignedjobs")} + }, + { + key: '3', + disabled: !!!technician, + icon: , + onClick: () => { + setTimeTicketTaskContext({ + actions: {}, + context: {jobid: null}, + }); + }, + label: t("menus.tech.claimtask") + } + ) + } else { + items.push({ + key: '3', + disabled: !!!technician, + icon: , + label: {t("menus.tech.jobclockin")} + }) + } + + items.push( + { + key: "4", + icon: , + disabled: !!!technician, + label: {t("menus.tech.shiftclockin")}, + }, + { + key: "5", + icon: , + disabled: !!!technician, + label: {t("menus.tech.productionlist")}, + }, + { + key: 'dispatchedparts', + disabled: !!!technician, + icon: , + label: + {t("menus.tech.dispatchedparts")} + + }, + { + key: "6", + icon: , + disabled: !!!technician, + label: {t("menus.tech.productionboard")}, + }, + { + key: "7", + icon: , + disabled: !!!technician, + label: t("menus.tech.logout"), + }); + + return ( + - {t("menus.tech.logout")} - - - - ); + { + if (e.key === "7") { + techLogout(); + } + }} + items={items} + /> + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(TechSider); diff --git a/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx b/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx index a827e3fd7..10ecf17ce 100644 --- a/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx +++ b/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx @@ -1,48 +1,48 @@ import DatePickerRanges from "../../utils/DatePickerRanges"; -import { DatePicker } from "antd"; -import moment from "moment"; +import {DatePicker} from "antd"; +import dayjs from "../../utils/day"; import queryString from "query-string"; import React from "react"; -import { useHistory, useLocation } from "react-router-dom"; +import {useLocation, useNavigate} from "react-router-dom"; export default function TimeTicketsDatesSelector() { - const searchParams = queryString.parse(useLocation().search); - const { start, end } = searchParams; - const history = useHistory(); + const searchParams = queryString.parse(useLocation().search); + const {start, end} = searchParams; + const history = useNavigate(); - const handleChange = (dates) => { - if (dates) { - const [start, end] = dates; + const handleChange = (dates) => { + if (dates) { + const [start, end] = dates; - if (!!start && !!end) { - history.push({ - search: queryString.stringify({ - ...searchParams, - start: start.format("YYYY-MM-DD"), - end: end.format("YYYY-MM-DD"), - }), - }); - } - } else { - history.push({ - search: queryString.stringify({ - ...searchParams, - start: null, - end: null, - }), - }); - } - }; + if (!!start && !!end) { + history({ + search: queryString.stringify({ + ...searchParams, + start: start.format("YYYY-MM-DD"), + end: end.format("YYYY-MM-DD"), + }), + }); + } + } else { + history({ + search: queryString.stringify({ + ...searchParams, + start: null, + end: null, + }), + }); + } + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/time-ticket-calculator/time-ticket-calculator.component.jsx b/client/src/components/time-ticket-calculator/time-ticket-calculator.component.jsx index a36f1dd49..264b6613c 100644 --- a/client/src/components/time-ticket-calculator/time-ticket-calculator.component.jsx +++ b/client/src/components/time-ticket-calculator/time-ticket-calculator.component.jsx @@ -1,142 +1,131 @@ -import { DownOutlined } from "@ant-design/icons"; -import { - Button, - Checkbox, - Col, - Form, - InputNumber, - Popover, - Radio, - Row, - Space, - Spin, -} from "antd"; -import React, { useState } from "react"; -import { GET_JOB_INFO_DRAW_CALCULATIONS } from "../../graphql/jobs-lines.queries"; -import { useQuery } from "@apollo/client"; +import {DownOutlined} from "@ant-design/icons"; +import {Button, Checkbox, Col, Form, InputNumber, Popover, Radio, Row, Space, Spin,} from "antd"; +import React, {useState} from "react"; +import {GET_JOB_INFO_DRAW_CALCULATIONS} from "../../graphql/jobs-lines.queries"; +import {useQuery} from "@apollo/client"; export default function TimeTicketCalculatorComponent({ - setProductiveHours, + setProductiveHours, - jobid, -}) { - const { loading, data: lineTicketData } = useQuery(GET_JOB_INFO_DRAW_CALCULATIONS, { - variables: { id: jobid }, - skip: !jobid, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + jobid, + }) { + const {loading, data: lineTicketData} = useQuery(GET_JOB_INFO_DRAW_CALCULATIONS, { + variables: {id: jobid}, + skip: !jobid, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const [visible, setVisible] = useState(false); - const handleOpenChange = (flag) => setVisible(flag); - const handleFinish = ({ type, hourstype, percent }) => { - //setProductiveHours(values); - //setVisible(false); - const eligibleHours = Array.isArray(hourstype) - ? lineTicketData.joblines.reduce( - (acc, val) => - acc + (hourstype.includes(val.mod_lbr_ty) ? val.mod_lb_hrs : 0), - 0 - ) - : lineTicketData.joblines.reduce( - (acc, val) => - acc + (hourstype === val.mod_lbr_ty ? val.mod_lb_hrs : 0), - 0 - ); - if (type === "draw") { - setProductiveHours(eligibleHours * (percent / 100)); - } else if (type === "cut") { - setProductiveHours(eligibleHours * (percent / 100)); - console.log( - "Cut selected, rate set to: ", - lineTicketData.jobs_by_pk[`rate_${hourstype.toLowerCase()}`] - ); - } - }; + const [visible, setVisible] = useState(false); + const handleOpenChange = (flag) => setVisible(flag); + const handleFinish = ({type, hourstype, percent}) => { + //setProductiveHours(values); + //setVisible(false); + const eligibleHours = Array.isArray(hourstype) + ? lineTicketData.joblines.reduce( + (acc, val) => + acc + (hourstype.includes(val.mod_lbr_ty) ? val.mod_lb_hrs : 0), + 0 + ) + : lineTicketData.joblines.reduce( + (acc, val) => + acc + (hourstype === val.mod_lbr_ty ? val.mod_lb_hrs : 0), + 0 + ); + if (type === "draw") { + setProductiveHours(eligibleHours * (percent / 100)); + } else if (type === "cut") { + setProductiveHours(eligibleHours * (percent / 100)); + console.log( + "Cut selected, rate set to: ", + lineTicketData.jobs_by_pk[`rate_${hourstype.toLowerCase()}`] + ); + } + }; - const popContent = ( - -
    - - - Draw - Cut of Sale - - + const popContent = ( + + + + + Draw + Cut of Sale + + - - {({ getFieldValue }) => ( - - {getFieldValue("type") === "draw" ? ( - - -
    - - Body - - - - - Refinish - - - - - Mechanical - - - - - Frame - - - - - Glass - - - - - ) : ( - - Body + + {({getFieldValue}) => ( + + {getFieldValue("type") === "draw" ? ( + + + + + Body + + + + + Refinish + + + + + Mechanical + + + + + Frame + + + + + Glass + + + + + ) : ( + + Body - Refinish + Refinish - Mechanical + Mechanical - Frame + Frame - Glass - - )} - - )} - + Glass + + )} + + )} + - - - - - - - ); + + + + + + + ); - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx b/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx index 281fb7dbf..e2e0c4903 100644 --- a/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx +++ b/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx @@ -1,31 +1,32 @@ -import { Button } from "antd"; +import {Button} from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import {connect} from "react-redux"; +import {setModalContext} from "../../redux/modals/modals.actions"; const mapDispatchToProps = (dispatch) => ({ - setTimeTicketContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicket" })), + setTimeTicketContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicket"})), }); export function TimeTicketEnterButton({ - actions, - context, - setTimeTicketContext, - disabled, - children, -}) { - return ( - - ); + actions, + context, + setTimeTicketContext, + disabled, + children, + }) { + return ( + + ); } + export default connect(null, mapDispatchToProps)(TimeTicketEnterButton); diff --git a/client/src/components/time-ticket-list/time-ticket-list-team-pay.component.jsx b/client/src/components/time-ticket-list/time-ticket-list-team-pay.component.jsx index 3c3375036..41a6732f2 100644 --- a/client/src/components/time-ticket-list/time-ticket-list-team-pay.component.jsx +++ b/client/src/components/time-ticket-list/time-ticket-list-team-pay.component.jsx @@ -1,277 +1,268 @@ -import { useQuery } from "@apollo/client"; -import { - Button, - Form, - InputNumber, - Modal, - Radio, - Select, - Space, - Table, - Typography, -} from "antd"; +import {useQuery} from "@apollo/client"; +import {Button, Form, InputNumber, Modal, Radio, Select, Space, Table, Typography,} from "antd"; import Dinero from "dinero.js"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { GET_JOB_INFO_DRAW_CALCULATIONS } from "../../graphql/jobs-lines.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {GET_JOB_INFO_DRAW_CALCULATIONS} from "../../graphql/jobs-lines.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import JobSearchSelectComponent from "../job-search-select/job-search-select.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketListTeamPay); -export function TimeTicketListTeamPay({ bodyshop, context, actions }) { - //const { refetch } = actions; - const { jobId } = context; - const [visible, setVisible] = useState(false); - const [form] = Form.useForm(); - const { t } = useTranslation(); - const { - //loading, - data: lineTicketData, - } = useQuery(GET_JOB_INFO_DRAW_CALCULATIONS, { - variables: { id: jobId }, - skip: !jobId, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +export function TimeTicketListTeamPay({bodyshop, context, actions}) { + //const { refetch } = actions; + const {jobId} = context; + const [visible, setVisible] = useState(false); + const [form] = Form.useForm(); + const {t} = useTranslation(); + const { + //loading, + data: lineTicketData, + } = useQuery(GET_JOB_INFO_DRAW_CALCULATIONS, { + variables: {id: jobId}, + skip: !jobId, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const handleOk = () => { - setVisible(false); - }; + const handleOk = () => { + setVisible(false); + }; - return ( - <> - setVisible(false)} - > -
    - - - {() => ( - - - - )} - - + setVisible(false)} > - - - + + + + {() => ( + + + + )} + + + + + - - - ({ + value: team.name, + label: team.name, + }))} + /> + - - - Body - Refinish - Mechanical - Frame - Glass - - + + + Body + Refinish + Mechanical + Frame + Glass + + - - - - + + + + - - {({ getFieldsValue }) => { - const formData = getFieldsValue(); + + {({getFieldsValue}) => { + const formData = getFieldsValue(); - let data = []; - let eligibleHours = 0; - const theTeam = Teams.find((team) => team.name === formData.team); - if (theTeam) { - eligibleHours = - lineTicketData.joblines.reduce( - (acc, val) => - acc + - (formData.hourstype === val.mod_lbr_ty - ? val.mod_lb_hrs - : 0), - 0 - ) * (formData.percent / 100 || 0); + let data = []; + let eligibleHours = 0; + const theTeam = Teams.find((team) => team.name === formData.team); + if (theTeam) { + eligibleHours = + lineTicketData.joblines.reduce( + (acc, val) => + acc + + (formData.hourstype === val.mod_lbr_ty + ? val.mod_lb_hrs + : 0), + 0 + ) * (formData.percent / 100 || 0); - data = theTeam.employees.map((e) => { - return { - employeeid: e.employeeid, - percentage: e.percentage, - rate: e.rates[formData.hourstype], - cost_center: - bodyshop.md_responsibility_centers.defaults.costs[ - formData.hourstype - ], - productivehrs: - Math.round(eligibleHours * 100 * (e.percentage / 100)) / - 100, - pay: Dinero({ - amount: Math.round( - (e.rates[formData.hourstype] || 0) * 100 - ), - }) - .multiply( - Math.round(eligibleHours * 100 * (e.percentage / 100)) / - 100 - ) - .toFormat("$0.00"), - }; - }); - } + data = theTeam.employees.map((e) => { + return { + employeeid: e.employeeid, + percentage: e.percentage, + rate: e.rates[formData.hourstype], + cost_center: + bodyshop.md_responsibility_centers.defaults.costs[ + formData.hourstype + ], + productivehrs: + Math.round(eligibleHours * 100 * (e.percentage / 100)) / + 100, + pay: Dinero({ + amount: Math.round( + (e.rates[formData.hourstype] || 0) * 100 + ), + }) + .multiply( + Math.round(eligibleHours * 100 * (e.percentage / 100)) / + 100 + ) + .toFormat("$0.00"), + }; + }); + } - return ( -
    ( - - - Tickets to be Created - - {`(${eligibleHours} hours to split)`} - - )} - columns={[ - { - title: t("timetickets.fields.employee"), - dataIndex: "employee", - key: "employee", - render: (text, record) => { - const emp = bodyshop.employees.find( - (e) => e.id === record.employeeid - ); - return `${emp?.first_name} ${emp?.last_name}`; - }, - }, - { - title: t("timetickets.fields.cost_center"), - dataIndex: "cost_center", - key: "cost_center", + return ( +
    ( + + + Tickets to be Created + + {`(${eligibleHours} hours to split)`} + + )} + columns={[ + { + title: t("timetickets.fields.employee"), + dataIndex: "employee", + key: "employee", + render: (text, record) => { + const emp = bodyshop.employees.find( + (e) => e.id === record.employeeid + ); + return `${emp?.first_name} ${emp?.last_name}`; + }, + }, + { + title: t("timetickets.fields.cost_center"), + dataIndex: "cost_center", + key: "cost_center", - render: (text, record) => - record.cost_center === "timetickets.labels.shift" - ? t(record.cost_center) - : record.cost_center, - }, - { - title: t("timetickets.fields.productivehrs"), - dataIndex: "productivehrs", - key: "productivehrs", - }, - { - title: "Percentage", - dataIndex: "percentage", - key: "percentage", - }, - { - title: "Rate", - dataIndex: "rate", - key: "rate", - }, - { - title: "Pay", - dataIndex: "pay", - key: "pay", - }, - ]} - /> - ); - }} - - - - - - ); + render: (text, record) => + record.cost_center === "timetickets.labels.shift" + ? t(record.cost_center) + : record.cost_center, + }, + { + title: t("timetickets.fields.productivehrs"), + dataIndex: "productivehrs", + key: "productivehrs", + }, + { + title: "Percentage", + dataIndex: "percentage", + key: "percentage", + }, + { + title: "Rate", + dataIndex: "rate", + key: "rate", + }, + { + title: "Pay", + dataIndex: "pay", + key: "pay", + }, + ]} + /> + ); + }} + + + + + + ); } const Teams = [ - { - name: "Team A", - employees: [ - { - employeeid: "9f1bdc23-8dc2-4b6a-8ca1-5f83a6fdcc22", - percentage: 50, - rates: { - LAB: 10, - LAR: 15, - }, - }, - { - employeeid: "201db66c-96c7-41ec-bed4-76842ba93087", - percentage: 50, - rates: { - LAB: 20, - LAR: 25, - }, - }, - ], - }, - { - name: "Team B", - employees: [ - { - employeeid: "9f1bdc23-8dc2-4b6a-8ca1-5f83a6fdcc22", - percentage: 75, - rates: { - LAB: 100, - LAR: 150, - }, - }, - { - employeeid: "201db66c-96c7-41ec-bed4-76842ba93087", - percentage: 25, - rates: { - LAB: 200, - LAR: 250, - }, - }, - ], - }, + { + name: "Team A", + employees: [ + { + employeeid: "9f1bdc23-8dc2-4b6a-8ca1-5f83a6fdcc22", + percentage: 50, + rates: { + LAB: 10, + LAR: 15, + }, + }, + { + employeeid: "201db66c-96c7-41ec-bed4-76842ba93087", + percentage: 50, + rates: { + LAB: 20, + LAR: 25, + }, + }, + ], + }, + { + name: "Team B", + employees: [ + { + employeeid: "9f1bdc23-8dc2-4b6a-8ca1-5f83a6fdcc22", + percentage: 75, + rates: { + LAB: 100, + LAR: 150, + }, + }, + { + employeeid: "201db66c-96c7-41ec-bed4-76842ba93087", + percentage: 25, + rates: { + LAB: 200, + LAR: 250, + }, + }, + ], + }, ]; diff --git a/client/src/components/time-ticket-list/time-ticket-list.component.jsx b/client/src/components/time-ticket-list/time-ticket-list.component.jsx index 9bb6c00f9..370355f03 100644 --- a/client/src/components/time-ticket-list/time-ticket-list.component.jsx +++ b/client/src/components/time-ticket-list/time-ticket-list.component.jsx @@ -1,403 +1,395 @@ -import { EditFilled, SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Checkbox, Space, Table } from "antd"; -import moment from "moment"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { - selectAuthLevel, - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort, dateSort } from "../../utils/sorters"; -import RbacWrapper, { - HasRbacAccess, -} from "../rbac-wrapper/rbac-wrapper.component"; +import {EditFilled, SyncOutlined} from "@ant-design/icons"; +import {Card, Space, Table, Checkbox, Button} from "antd"; +import dayjs from "../../utils/day"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectAuthLevel, selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {DateFormatter, DateTimeFormatter} from "../../utils/DateFormatter"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort, dateSort} from "../../utils/sorters"; +import RbacWrapper, {HasRbacAccess,} from "../rbac-wrapper/rbac-wrapper.component"; import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - authLevel: selectAuthLevel, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + authLevel: selectAuthLevel, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setTimeTicketTaskContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicketTask" })), + setTimeTicketTaskContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicketTask"})), }); export default connect(mapStateToProps, mapDispatchToProps)(TimeTicketList); export function TimeTicketList({ - bodyshop, - setTimeTicketTaskContext, - authLevel, - currentUser, - disabled, - loading, - timetickets, - refetch, - techConsole, - jobId, - extra, -}) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + bodyshop, + setTimeTicketTaskContext, + authLevel, + currentUser, + disabled, + loading, + timetickets, + refetch, + techConsole, + jobId, + extra, + }) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const totals = useMemo(() => { - if (timetickets) - return timetickets.reduce( - (acc, val) => { - acc.productivehrs = acc.productivehrs + val.productivehrs; - acc.actualhrs = acc.actualhrs + val.actualhrs; - return acc; + const {t} = useTranslation(); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, + }); + + const totals = useMemo(() => { + if (timetickets) + return timetickets.reduce( + (acc, val) => { + acc.productivehrs = acc.productivehrs + val.productivehrs; + acc.actualhrs = acc.actualhrs + val.actualhrs; + return acc; + }, + {productivehrs: 0, actualhrs: 0} + ); + return {productivehrs: 0, actualhrs: 0}; + }, [timetickets]); + + const columns = [ + { + title: t("timetickets.fields.committed"), + dataIndex: "committed_at", + key: "committed_at", + render: (text, record) => ( + + ), }, - { productivehrs: 0, actualhrs: 0 } - ); - return { productivehrs: 0, actualhrs: 0 }; - }, [timetickets]); - - const columns = [ - { - title: t("timetickets.fields.committed"), - dataIndex: "committed_at", - key: "committed_at", - render: (text, record) => ( - - ), - }, - { - title: t("timetickets.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => dateSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("timetickets.fields.employee"), - dataIndex: "employee", - key: "employee", - sorter: (a, b) => alphaSort(a.employee.last_name, b.employee.last_name), - sortOrder: - state.sortedInfo.columnKey === "employee" && state.sortedInfo.order, - render: (text, record) => - `${record.employee.first_name} ${record.employee.last_name}`, - filters: - timetickets - .map((l) => l.employeeid) - .filter(onlyUnique) - .map((s) => { - return { - text: (() => { - const emp = bodyshop.employees.find((e) => e.id === s); - - return `${emp?.first_name} ${emp?.last_name}`; - })(), // - value: [s], - }; - }) || [], - onFilter: (value, record) => value.includes(record.employeeid), - }, - { - title: t("timetickets.fields.cost_center"), - dataIndex: "cost_center", - key: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - render: (text, record) => - record.cost_center === "timetickets.labels.shift" - ? t(record.cost_center) - : record.cost_center, - sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, - filters: - timetickets - .map((l) => l.cost_center) - .filter(onlyUnique) - .map((s) => { - return { - text: s === "timetickets.labels.shift" ? t(s) : s, //|| "No Status*", - value: [s], - }; - }) || [], - onFilter: (value, record) => value.includes(record.cost_center), - }, - ...(jobId - ? [] - : [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => - alphaSort(a.job && a.job.ro_number, b.job && b.job.ro_number), + { + title: t("timetickets.fields.date"), + dataIndex: "date", + key: "date", + sorter: (a, b) => dateSort(a.date, b.date), sortOrder: - state.sortedInfo.columnKey === "ro_number" && - state.sortedInfo.order, + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("timetickets.fields.employee"), + dataIndex: "employee", + key: "employee", + sorter: (a, b) => alphaSort(a.employee.last_name, b.employee.last_name), + sortOrder: + state.sortedInfo.columnKey === "employee" && state.sortedInfo.order, render: (text, record) => - record.job && ( - - {record.job.ro_number || "N/A"} - - ), - }, - ]), - { - title: t("timetickets.fields.productivehrs"), - dataIndex: "productivehrs", - key: "productivehrs", - sorter: (a, b) => a.productivehrs - b.productivehrs, - sortOrder: - state.sortedInfo.columnKey === "productivehrs" && - state.sortedInfo.order, - }, - ...(Enhanced_Payroll.treatment === "on" - ? [] - : [ - { - title: t("timetickets.fields.actualhrs"), - dataIndex: "actualhrs", - key: "actualhrs", - sorter: (a, b) => a.actualhrs - b.actualhrs, + `${record.employee.first_name} ${record.employee.last_name}`, + filters: + timetickets + .map((l) => l.employeeid) + .filter(onlyUnique) + .map((s) => { + return { + text: (() => { + const emp = bodyshop.employees.find((e) => e.id === s); + + return `${emp?.first_name} ${emp?.last_name}`; + })(), // + value: [s], + }; + }) || [], + onFilter: (value, record) => value.includes(record.employeeid), + }, + { + title: t("timetickets.fields.cost_center"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + render: (text, record) => + record.cost_center === "timetickets.labels.shift" + ? t(record.cost_center) + : record.cost_center, sortOrder: - state.sortedInfo.columnKey === "actualhrs" && - state.sortedInfo.order, - }, - ]), + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + filters: + timetickets + .map((l) => l.cost_center) + .filter(onlyUnique) + .map((s) => { + return { + text: s === "timetickets.labels.shift" ? t(s) : s, //|| "No Status*", + value: [s], + }; + }) || [], + onFilter: (value, record) => value.includes(record.cost_center), + }, + ...(jobId + ? [] + : [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => + alphaSort(a.job && a.job.ro_number, b.job && b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && + state.sortedInfo.order, + render: (text, record) => + record.job && ( + + {record.job.ro_number || "N/A"} + + ), + }, + ]), + { + title: t("timetickets.fields.productivehrs"), + dataIndex: "productivehrs", + key: "productivehrs", + sorter: (a, b) => a.productivehrs - b.productivehrs, + sortOrder: state.sortedInfo.columnKey === "productivehrs" && state.sortedInfo.order, + }, + ...(Enhanced_Payroll.treatment === "on" + ? [] + : [ + { + title: t("timetickets.fields.actualhrs"), + dataIndex: "actualhrs", + key: "actualhrs", + sorter: (a, b) => a.actualhrs - b.actualhrs, + sortOrder: + state.sortedInfo.columnKey === "actualhrs" && + state.sortedInfo.order, + }, + ]), - { - title: t("timetickets.fields.memo"), - dataIndex: "memo", - key: "memo", - sorter: (a, b) => alphaSort(a.memo, b.memo), - sortOrder: - state.sortedInfo.columnKey === "memo" && state.sortedInfo.order, - render: (text, record) => - record.clockon || record.clockoff ? t(record.memo) : record.memo, - }, - ...(Enhanced_Payroll.treatment === "on" - ? [ - { - title: t("timetickets.fields.task_name"), - dataIndex: "task_name", - key: "task_name", - sorter: (a, b) => alphaSort(a.task_name, b.task_name), + { + title: t("timetickets.fields.memo"), + dataIndex: "memo", + key: "memo", + sorter: (a, b) => alphaSort(a.memo, b.memo), sortOrder: - state.sortedInfo.columnKey === "task_name" && - state.sortedInfo.order, - }, - ] - : []), - ...(Enhanced_Payroll.treatment === "on" - ? [] - : [ - { - title: t("timetickets.fields.clockon"), - dataIndex: "clockon", - key: "clockon", + state.sortedInfo.columnKey === "memo" && state.sortedInfo.order, + render: (text, record) => + record.clockon || record.clockoff ? t(record.memo) : record.memo, + }, + ...(Enhanced_Payroll.treatment === "on" + ? [ + { + title: t("timetickets.fields.task_name"), + dataIndex: "task_name", + key: "task_name", + sorter: (a, b) => alphaSort(a.task_name, b.task_name), + sortOrder: + state.sortedInfo.columnKey === "task_name" && + state.sortedInfo.order, + }, + ] + : []), + ...(Enhanced_Payroll.treatment === "on" + ? [] + : [ + { + title: t("timetickets.fields.clockon"), + dataIndex: "clockon", + key: "clockon", - render: (text, record) => ( - {record.clockon} - ), - }, - { - title: t("timetickets.fields.clockoff"), - dataIndex: "clockoff", - key: "clockoff", + render: (text, record) => ( + {record.clockon} + ), + }, + { + title: t("timetickets.fields.clockoff"), + dataIndex: "clockoff", + key: "clockoff", - render: (text, record) => ( - {record.clockoff} - ), - }, - { - title: t("timetickets.fields.clockhours"), - dataIndex: "clockhours", - key: "clockhours", - render: (text, record) => { - if (record.clockoff && record.clockon) - return ( -
    - {moment(record.clockoff) - .diff(moment(record.clockon), "hours", true) - .toFixed(2)} -
    - ); - else { - return null; - } - }, - }, - ]), - { - title: t("timetickets.fields.created_by"), - dataIndex: "created_by", - key: "created_by", - sorter: (a, b) => alphaSort(a.created_by, b.created_by), - sortOrder: - state.sortedInfo.columnKey === "created_by" && state.sortedInfo.order, - render: (text, record) => record.created_by, - }, - // { - // title: "Pay", - // dataIndex: "pay", - // key: "pay", - // render: (text, record) => - // Dinero({ amount: Math.round(record.rate * 100) }) - // .multiply(record.flat_rate ? record.productivehrs : record.actualhrs) - // .toFormat("$0.00"), - // }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - {techConsole && ( - - - - )} - {!techConsole && ( - { - return
    ; - }} - > - ( + {record.clockoff} + ), + }, + { + title: t("timetickets.fields.clockhours"), + dataIndex: "clockhours", + key: "clockhours", + render: (text, record) => { + if (record.clockoff && record.clockon) + return ( +
    + {dayjs(record.clockoff) + .diff(dayjs(record.clockon), "hour", true) + .toFixed(2)} +
    + ); + else { + return null; + } + }, + }, + { + title: t("timetickets.fields.created_by"), + dataIndex: "created_by", + key: "created_by", + sorter: (a, b) => alphaSort(a.created_by, b.created_by), + sortOrder: + state.sortedInfo.columnKey === "created_by" && state.sortedInfo.order, + render: (text, record) => record.created_by, + }, + // { + // title: "Pay", + // dataIndex: "pay", + // key: "pay", + // render: (text, record) => + // Dinero({ amount: Math.round(record.rate * 100) }) + // .multiply(record.flat_rate ? record.productivehrs : record.actualhrs) + // .toFormat("$0.00"), + // }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + {techConsole && ( + + + + )} + {!techConsole && ( + { + return
    ; + }} + > + + + + + )} + + ), + }, + ])] + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + return ( + + {jobId && bodyshop.md_tasks_presets.enable_tasks && ( + + )} + {jobId && + (techConsole ? null : ( + + {t("timetickets.actions.enter")} + + ))} + {extra} + + + } + > +
    - - - - )} - - ), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - return ( - - {jobId && bodyshop.md_tasks_presets.enable_tasks && ( - - )} - {jobId && - (techConsole ? null : ( - { + return ( + + + {t("general.labels.totals")} + + + + + + {totals.productivehrs.toFixed(1)} + + + {totals.actualhrs.toFixed(1)} + + + {totals.actualhrs === 0 || !totals.actualhrs + ? "∞" + : `${( + (totals.productivehrs / totals.actualhrs) * + 100 + ).toFixed(2)}% ${t("timetickets.labels.efficiency")}`} + + + + + + ); }} - disabled={disabled} - > - {t("timetickets.actions.enter")} - - ))} - {extra} - - - } - > -
    { - return ( - - - {t("general.labels.totals")} - - - - - - {totals.productivehrs.toFixed(1)} - - - {totals.actualhrs.toFixed(1)} - - - {totals.actualhrs === 0 || !totals.actualhrs - ? "∞" - : `${( - (totals.productivehrs / totals.actualhrs) * - 100 - ).toFixed(2)}% ${t("timetickets.labels.efficiency")}`} - - - - - - ); - }} - /> - - ); + /> + + ); } diff --git a/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx index 2325e4e66..58fdce8e6 100644 --- a/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx +++ b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx @@ -1,409 +1,408 @@ -import { useLazyQuery } from "@apollo/client"; -import { Form, Input, InputNumber, Select, Switch } from "antd"; +import {useLazyQuery} from "@apollo/client"; +import {Form, Input, InputNumber, Select, Switch} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { GET_LINE_TICKET_BY_PK } from "../../graphql/jobs-lines.queries"; -import { - selectAuthLevel, - selectBodyshop, -} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {GET_LINE_TICKET_BY_PK} from "../../graphql/jobs-lines.queries"; +import {selectAuthLevel, selectBodyshop,} from "../../redux/user/user.selectors"; import EmployeeSearchSelect from "../employee-search-select/employee-search-select.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormDateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; import JobSearchSelect from "../job-search-select/job-search-select.component"; import LaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.component"; -import { CalculateAllocationsTotals } from "../labor-allocations-table/labor-allocations-table.utility"; +import {CalculateAllocationsTotals} from "../labor-allocations-table/labor-allocations-table.utility"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; -import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; +import {HasRbacAccess} from "../rbac-wrapper/rbac-wrapper.component"; import TimeTicketList from "../time-ticket-list/time-ticket-list.component"; import TimeTicketCalculatorComponent from "../time-ticket-calculator/time-ticket-calculator.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - authLevel: selectAuthLevel, + bodyshop: selectBodyshop, + authLevel: selectAuthLevel, }); const mapDispatchToProps = (dispatch) => ({}); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketModalComponent); export function TimeTicketModalComponent({ - form, - bodyshop, - authLevel, - employeeAutoCompleteOptions, - isEdit, - disabled, - employeeSelectDisabled, -}) { - const { t } = useTranslation(); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const [loadLineTicketData, { called, loading, data: lineTicketData }] = - useLazyQuery(GET_LINE_TICKET_BY_PK, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", + form, + bodyshop, + authLevel, + employeeAutoCompleteOptions, + isEdit, + disabled, + employeeSelectDisabled, + }) { + const {t} = useTranslation(); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, }); - const CostCenterSelect = ({ emps, value, ...props }) => { - return ( - - ); - }; - const MemoInput = ({ value, ...props }) => { - return ( - - ); - }; - - return ( -
    - - - {() => ( - { + return ( + + ); + }; - form.setFieldsValue({ flat_rate: emps && emps.flat_rate }); - }} - /> - - prev.employeeid !== cur.employeeid} - > - {() => { - const employeeId = form.getFieldValue("employeeid"); - const emps = - employeeAutoCompleteOptions && - employeeAutoCompleteOptions.filter((e) => e.id === employeeId)[0]; - - return ( - - - - ); - }} - - - - - - - - - - {() => ( - <> - ({ - validator(rule, value) { - if (!bodyshop.tt_enforce_hours_for_tech_console) { - return Promise.resolve(); - } - if ( - !value || - getFieldValue("cost_center") === null || - !lineTicketData - ) - return Promise.resolve(); - - //Check the cost center, - const totals = CalculateAllocationsTotals( - bodyshop, - lineTicketData.joblines, - lineTicketData.timetickets, - lineTicketData.jobs_by_pk.lbr_adjustments - ); - - const fieldTypeToCheck = - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber - ? "mod_lbr_ty" - : "cost_center"; - - const costCenterDiff = - Math.round( - totals.find( - (total) => - total[fieldTypeToCheck] === - getFieldValue("cost_center") - )?.difference * 10 - ) / 10; - - if (value > costCenterDiff) - return Promise.reject( - t( - "timetickets.validation.hoursenteredmorethanavailable" - ) - ); - else { - return Promise.resolve(); - } - }, - }), - { - required: - form.getFieldValue("cost_center") !== - "timetickets.labels.shift", - //message: t("general.validation.required"), - }, - ]} - > - - - - form.setFieldsValue({ productivehrs }) - } - /> - - )} - - ({ - async validator(rule, value) { - if (value) { - const prodHrs = getFieldValue("productivehrs"); - if (prodHrs < 0 && value !== 0) - return Promise.reject( - t("timetickets.labels.zeroactualnegativeprod") - ); - else { - return Promise.resolve(); - } - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - { - <> - - - - ({ - validator(rule, value) { - const clockon = getFieldValue("clockon"); - - if (!value) return Promise.resolve(); - if (!clockon && value) - return Promise.reject( - t("timetickets.validation.clockoffwithoutclockon") - ); - if ( - value && - value.isSameOrAfter && - !value.isSameOrAfter(clockon) - ) - return Promise.reject( - t("timetickets.validation.clockoffmustbeafterclockon") - ); - - return Promise.resolve(); - }, - }), - ]} - > - - - - } - - - - - - {() => ( - - - - )} - - - - {() => { - const jobid = form.getFieldValue("jobid"); - if ( - (!called && jobid) || - (jobid && lineTicketData?.jobs_by_pk?.id !== jobid && !loading) - ) { - loadLineTicketData({ variables: { id: jobid } }); - } - return ( - { + return ( + - ); - }} - -
    - ); + ); + }; + + return ( +
    + + + {() => ( + + + + )} + + + + + + { + const emps = + employeeAutoCompleteOptions && + employeeAutoCompleteOptions.filter((e) => e.id === value)[0]; + + form.setFieldsValue({flat_rate: emps && emps.flat_rate}); + }} + /> + + prev.employeeid !== cur.employeeid} + > + {() => { + const employeeId = form.getFieldValue("employeeid"); + const emps = + employeeAutoCompleteOptions && + employeeAutoCompleteOptions.filter((e) => e.id === employeeId)[0]; + + return ( + + + + ); + }} + + + + + + + + + + {() => ( + <> + ({ + validator(rule, value) { + if (!bodyshop.tt_enforce_hours_for_tech_console) { + return Promise.resolve(); + } + if ( + !value || + getFieldValue("cost_center") === null || + !lineTicketData + ) + return Promise.resolve(); + + //Check the cost center, + const totals = CalculateAllocationsTotals( + bodyshop, + lineTicketData.joblines, + lineTicketData.timetickets, + lineTicketData.jobs_by_pk.lbr_adjustments + ); + + const fieldTypeToCheck = + bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber + ? "mod_lbr_ty" + : "cost_center"; + + const costCenterDiff = + Math.round( + totals.find( + (total) => + total[fieldTypeToCheck] === + getFieldValue("cost_center") + )?.difference * 10 + ) / 10; + + if (value > costCenterDiff) + return Promise.reject( + t( + "timetickets.validation.hoursenteredmorethanavailable" + ) + ); + else { + return Promise.resolve(); + } + }, + }), + { + required: + form.getFieldValue("cost_center") !== + "timetickets.labels.shift", + //message: t("general.validation.required"), + }, + ]} + > + + + + form.setFieldsValue({productivehrs}) + } + /> + + )} + + ({ + async validator(rule, value) { + if (value) { + const prodHrs = getFieldValue("productivehrs"); + if (prodHrs < 0 && value !== 0) + return Promise.reject( + t("timetickets.labels.zeroactualnegativeprod") + ); + else { + return Promise.resolve(); + } + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + { + <> + + + + ({ + validator(rule, value) { + const clockon = getFieldValue("clockon"); + + if (!value) return Promise.resolve(); + if (!clockon && value) + return Promise.reject( + t("timetickets.validation.clockoffwithoutclockon") + ); + // TODO - Verify this exists + if ( + value && + value.isSameOrAfter && + !value.isSameOrAfter(clockon) + ) + return Promise.reject( + t("timetickets.validation.clockoffmustbeafterclockon") + ); + + return Promise.resolve(); + }, + }), + ]} + > + + + + } + + + + + + {() => ( + + + + )} + + + + {() => { + const jobid = form.getFieldValue("jobid"); + if ( + (!called && jobid) || + (jobid && lineTicketData?.jobs_by_pk?.id !== jobid && !loading) + ) { + loadLineTicketData({variables: {id: jobid}}); + } + return ( + + ); + }} + +
    + ); } export function LaborAllocationContainer({ - jobid, - loading, - lineTicketData, - hideTimeTickets = false, -}) { - if (loading) return ; - if (!lineTicketData) return null; - return ( -
    - - {!hideTimeTickets && ( - - )} -
    - ); + jobid, + loading, + lineTicketData, + hideTimeTickets = false, + }) { + if (loading) return ; + if (!lineTicketData) return null; + return ( +
    + + {!hideTimeTickets && ( + + )} +
    + ); } diff --git a/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx index 0b3bf7d9c..539eb408c 100644 --- a/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx +++ b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx @@ -1,279 +1,278 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Button, Form, Modal, PageHeader, Space, notification } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ACTIVE_EMPLOYEES } from "../../graphql/employees.queries"; -import { - INSERT_NEW_TIME_TICKET, - UPDATE_TIME_TICKET, -} from "../../graphql/timetickets.queries"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectTimeTicket } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useMutation, useQuery} from "@apollo/client"; +import {Button, Form, Modal, notification, Space} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ACTIVE_EMPLOYEES} from "../../graphql/employees.queries"; +import {INSERT_NEW_TIME_TICKET, UPDATE_TIME_TICKET,} from "../../graphql/timetickets.queries"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectTimeTicket} from "../../redux/modals/modals.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import TimeTicketModalComponent from "./time-ticket-modal.component"; import TimeTicketsCommitToggleComponent from "../time-tickets-commit-toggle/time-tickets-commit-toggle.component"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - timeTicketModal: selectTimeTicket, - bodyshop: selectBodyshop, + timeTicketModal: selectTimeTicket, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("timeTicket")), + toggleModalVisible: () => dispatch(toggleModalVisible("timeTicket")), }); export function TimeTicketModalContainer({ - timeTicketModal, - toggleModalVisible, - bodyshop, -}) { - const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const { t } = useTranslation(); - const [enterAgain, setEnterAgain] = useState(false); - const [insertTicket] = useMutation(INSERT_NEW_TIME_TICKET); - const [updateTicket] = useMutation(UPDATE_TIME_TICKET); - const { Enhanced_Payroll } = useTreatments( - ["Enhanced_Payroll"], - {}, - bodyshop.imexshopid - ); - const { data: EmployeeAutoCompleteData } = useQuery(QUERY_ACTIVE_EMPLOYEES, { - skip: !timeTicketModal.visible, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const handleFinish = (values) => { - setLoading(true); - const emps = EmployeeAutoCompleteData.employees.filter( - (e) => e.id === values.employeeid - ); - if (timeTicketModal.context.id) { - updateTicket({ - variables: { - timeticketId: timeTicketModal.context.id, - timeticket: { - ...values, - rate: - emps.length === 1 - ? emps[0].rates.filter( - (r) => r.cost_center === values.cost_center - )[0]?.rate - : null, - }, - }, - }) - .then(handleMutationSuccess) - .catch(handleMutationError); - } else { - //Get selected employee rate. - insertTicket({ - variables: { - timeTicketInput: [ - { - ...values, - rate: - emps.length === 1 - ? emps[0].rates.filter( - (r) => r.cost_center === values.cost_center - )[0].rate - : null, - bodyshopid: bodyshop.id, - created_by: timeTicketModal.context.created_by, - }, - ], - }, - }) - .then(handleMutationSuccess) - .catch(handleMutationError); - } - }; - - const handleMutationSuccess = (response) => { - notification["success"]({ - message: t("timetickets.successes.created"), + timeTicketModal, + toggleModalVisible, + bodyshop, + }) { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const {t} = useTranslation(); + const [enterAgain, setEnterAgain] = useState(false); + const [insertTicket] = useMutation(INSERT_NEW_TIME_TICKET); + const [updateTicket] = useMutation(UPDATE_TIME_TICKET); + const {treatments: {Enhanced_Payroll}} = useSplitTreatments({ + attributes: {}, + names: ["Enhanced_Payroll"], + splitKey: bodyshop.imexshopid, }); - if (timeTicketModal.actions.refetch) timeTicketModal.actions.refetch(); - if (enterAgain) { - //Capture the existing information and repopulate it. - const prev = form.getFieldsValue(["date", "employeeid"]); - - form.resetFields(); - - form.setFieldsValue(prev); - } else { - toggleModalVisible(); - } - setEnterAgain(false); - setLoading(false); - }; - - const handleMutationError = (error) => { - setEnterAgain(false); - notification["error"]({ - message: t("timetickets.errors.creating", { - message: JSON.stringify(error), - }), + const {data: EmployeeAutoCompleteData} = useQuery(QUERY_ACTIVE_EMPLOYEES, { + skip: !timeTicketModal.open, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - setLoading(false); - }; - const handleCancel = () => { - toggleModalVisible(); - }; + const handleFinish = (values) => { + setLoading(true); + const emps = EmployeeAutoCompleteData.employees.filter( + (e) => e.id === values.employeeid + ); + if (timeTicketModal.context.id) { + updateTicket({ + variables: { + timeticketId: timeTicketModal.context.id, + timeticket: { + ...values, + rate: + emps.length === 1 + ? emps[0].rates.filter( + (r) => r.cost_center === values.cost_center + )[0]?.rate + : null, + }, + }, + }) + .then(handleMutationSuccess) + .catch(handleMutationError); + } else { + //Get selected employee rate. + insertTicket({ + variables: { + timeTicketInput: [ + { + ...values, + rate: + emps.length === 1 + ? emps[0].rates.filter( + (r) => r.cost_center === values.cost_center + )[0].rate + : null, + bodyshopid: bodyshop.id, + created_by: timeTicketModal.context.created_by, + }, + ], + }, + }) + .then(handleMutationSuccess) + .catch(handleMutationError); + } + }; - useEffect(() => { - if (enterAgain) form.submit(); - }, [enterAgain, form]); + const handleMutationSuccess = (response) => { + notification["success"]({ + message: t("timetickets.successes.created"), + }); + if (timeTicketModal.actions.refetch) timeTicketModal.actions.refetch(); + if (enterAgain) { + //Capture the existing information and repopulate it. - useEffect(() => { - if (timeTicketModal.visible) form.resetFields(); - }, [timeTicketModal.visible, form]); + const prev = form.getFieldsValue(["date", "employeeid"]); - const handleFieldsChange = (changedFields, allFields) => { - if (!!changedFields.employeeid && !!EmployeeAutoCompleteData) { - const emps = EmployeeAutoCompleteData.employees.filter( - (e) => e.id === changedFields.employeeid - ); - form.setFieldsValue({ - cost_center: emps.length > 0 ? emps[0].cost_center : "", - ciecacode: - Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find( - (key) => - bodyshop.md_responsibility_centers.defaults.costs[key] === - emps[0].cost_center - ) || "LAB", - }); - } - if (!!changedFields.cost_center && !!EmployeeAutoCompleteData) { - form.setFieldsValue({ - ciecacode: - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === 'on' - ? changedFields.cost_center - : Object.keys( - bodyshop.md_responsibility_centers.defaults.costs - ).find( - (key) => - bodyshop.md_responsibility_centers.defaults.costs[key] === - changedFields.cost_center - ), - }); - } - }; + form.resetFields(); - return ( - form.resetFields()} - footer={ - + form.setFieldsValue(prev); + } else { + toggleModalVisible(); + } + setEnterAgain(false); + setLoading(false); + }; + + const handleMutationError = (error) => { + setEnterAgain(false); + notification["error"]({ + message: t("timetickets.errors.creating", { + message: JSON.stringify(error), + }), + }); + setLoading(false); + }; + + const handleCancel = () => { + toggleModalVisible(); + }; + + useEffect(() => { + if (enterAgain) form.submit(); + }, [enterAgain, form]); + + useEffect(() => { + if (timeTicketModal.open) form.resetFields(); + }, [timeTicketModal.open, form]); + + const handleFieldsChange = (changedFields, allFields) => { + if (!!changedFields.employeeid && !!EmployeeAutoCompleteData) { + const emps = EmployeeAutoCompleteData.employees.filter( + (e) => e.id === changedFields.employeeid + ); + form.setFieldsValue({ + cost_center: emps.length > 0 ? emps[0].cost_center : "", + ciecacode: + Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find( + (key) => + bodyshop.md_responsibility_centers.defaults.costs[key] === + emps[0].cost_center + ) || "LAB", + }); + } + if (!!changedFields.cost_center && !!EmployeeAutoCompleteData) { + form.setFieldsValue({ + ciecacode: + bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === 'on' + ? changedFields.cost_center + : Object.keys( + bodyshop.md_responsibility_centers.defaults.costs + ).find( + (key) => + bodyshop.md_responsibility_centers.defaults.costs[key] === + changedFields.cost_center + ), + }); + } + }; + + return ( + form.resetFields()} + footer={ + - {timeTicketModal.context && timeTicketModal.context.id ? null : ( - - )} + {timeTicketModal.context && timeTicketModal.context.id ? null : ( + + )} - } - destroyOnClose - > -
    setEnterAgain(false)} - disabled={timeTicketModal.context?.timeticket?.committed_at} - initialValues={ - timeTicketModal.context.timeticket - ? { - ...timeTicketModal.context.timeticket, - jobid: - (timeTicketModal.context.timeticket.job && - timeTicketModal.context.timeticket.job.id) || - timeTicketModal.context.timeticket.jobid || - null, - date: timeTicketModal.context.timeticket.date - ? moment(timeTicketModal.context.timeticket.date) - : null, - } - : { jobid: timeTicketModal.context.jobId || null } - } - onValuesChange={handleFieldsChange} - > - - - - - {timeTicketModal.context && timeTicketModal.context.id ? null : ( - - )} - - } - /> - - -
    - ); + } + destroyOnClose + > +
    setEnterAgain(false)} + disabled={timeTicketModal.context?.timeticket?.committed_at} + initialValues={ + timeTicketModal.context.timeticket + ? { + ...timeTicketModal.context.timeticket, + jobid: + (timeTicketModal.context.timeticket.job && + timeTicketModal.context.timeticket.job.id) || + timeTicketModal.context.timeticket.jobid || + null, + date: timeTicketModal.context.timeticket.date + ? dayjs(timeTicketModal.context.timeticket.date) + : null, + } + : {jobid: timeTicketModal.context.jobId || null} + } + onValuesChange={handleFieldsChange} + > + + + + + {timeTicketModal.context && timeTicketModal.context.id ? null : ( + + )} + + } + /> + + +
    + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketModalContainer); diff --git a/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx b/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx index 4f71083f0..aadbaf19d 100644 --- a/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx +++ b/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx @@ -1,72 +1,72 @@ -import { Card, List, Typography } from "antd"; +import {Card, List, Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {useTranslation} from "react-i18next"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import DataLabel from "../data-label/data-label.component"; import TechClockOffButton from "../tech-job-clock-out-button/tech-job-clock-out-button.component"; import TechJobPrintTickets from "../tech-job-print-tickets/tech-job-print-tickets.component"; export default function TimeTicketShiftActive({ - timetickets, - refetch, - isTechConsole, -}) { - const { t } = useTranslation(); + timetickets, + refetch, + isTechConsole, + }) { + const {t} = useTranslation(); - return ( -
    - {timetickets.length > 0 ? ( -
    -
    - - {t("timetickets.labels.shiftalreadyclockedon")} - - {isTechConsole ? ( - + return ( +
    + {timetickets.length > 0 ? ( +
    +
    + + {t("timetickets.labels.shiftalreadyclockedon")} + + {isTechConsole ? ( + + ) : null} +
    +
    + ( + + , + ]} + > + + {ticket.clockon} + + + + )} + > +
    +
    ) : null} -
    -
    - ( - - , - ]} - > - - {ticket.clockon} - - - - )} - > -
    - ) : null} -
    - ); + ); } diff --git a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx index 9416dc27d..560c4d8a1 100644 --- a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx +++ b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx @@ -1,54 +1,55 @@ -import { Form, Select } from "antd"; +import {Form, Select} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function TimeTicketShiftFormComponent({ bodyshop, form }) { - const { t } = useTranslation(); - return ( -
    - - - -
    - ); +export function TimeTicketShiftFormComponent({bodyshop, form}) { + const {t} = useTranslation(); + return ( +
    + + + +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketShiftFormComponent); diff --git a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx index 8c3c3cd0d..940111ad7 100644 --- a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx +++ b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx @@ -1,144 +1,143 @@ -import { useMutation } from "@apollo/client"; -import { Button, Form, Space, notification } from "antd"; +import {useMutation} from "@apollo/client"; +import {Button, Form, notification, Space} from "antd"; import axios from "axios"; -import moment from "moment"; -import momenttz from "moment-timezone"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import dayjs from "../../utils/day"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_NEW_TIME_TICKET} from "../../graphql/timetickets.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import TechJobPrintTickets from "../tech-job-print-tickets/tech-job-print-tickets.component"; import TimeTicektShiftComponent from "./time-ticket-shift-form.component"; + const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop, - technician: selectTechnician, + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function TimeTicektShiftContainer({ - bodyshop, - technician, - currentUser, - isTechConsole, - checkIfAlreadyClocked, -}) { - console.log( - "🚀 ~ file: time-ticket-shift-form.container.jsx:28 ~ technician:", - technician - ); - const [form] = Form.useForm(); - const [insertTimeTicket] = useMutation(INSERT_NEW_TIME_TICKET); - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); + bodyshop, + technician, + currentUser, + isTechConsole, + checkIfAlreadyClocked, + }) { + console.log( + "🚀 ~ file: time-ticket-shift-form.container.jsx:28 ~ technician:", + technician + ); + const [form] = Form.useForm(); + const [insertTimeTicket] = useMutation(INSERT_NEW_TIME_TICKET); + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); - const employeeId = useMemo(() => { - const assoc = bodyshop.associations.filter( - (a) => a.useremail === currentUser.email - )[0]; + const employeeId = useMemo(() => { + const assoc = bodyshop.associations.filter( + (a) => a.useremail === currentUser.email + )[0]; - return assoc && assoc.user && assoc.user.employee && assoc.user.employee.id; - }, [bodyshop, currentUser.email]); + return assoc && assoc.user && assoc.user.employee && assoc.user.employee.id; + }, [bodyshop, currentUser.email]); - const handleFinish = async (values) => { - setLoading(true); + const handleFinish = async (values) => { + setLoading(true); - const alreadyClocked = await checkIfAlreadyClocked(); + const alreadyClocked = await checkIfAlreadyClocked(); - if (alreadyClocked) { - //Show the error. - notification["error"]({ - message: t("timetickets.errors.shiftalreadyclockedon"), - }); - } else { - const theTime = moment((await axios.post("/utils/time")).data); + if (alreadyClocked) { + //Show the error. + notification["error"]({ + message: t("timetickets.errors.shiftalreadyclockedon"), + }); + } else { + const theTime = dayjs((await axios.post("/utils/time")).data); - const result = await insertTimeTicket({ - variables: { - timeTicketInput: [ - { - bodyshopid: bodyshop.id, - employeeid: isTechConsole ? technician.id : employeeId, - cost_center: "timetickets.labels.shift", - clockon: theTime, - date: - typeof bodyshop.timezone === "string" - ? momenttz.tz(theTime, bodyshop.timezone).format("YYYY-MM-DD") - : typeof bodyshop.timezone === "number" - ? moment(theTime) - .utcOffset(bodyshop.timezone) - .format("YYYY-MM-DD") - : moment(theTime).format("YYYY-MM-DD"), - memo: values.memo, - created_by: isTechConsole - ? currentUser.email.concat( - " | ", - technician.employee_number - .concat( - " ", - technician.first_name, - " ", - technician.last_name - ) - .trim() - ) - : currentUser.displayName - ? currentUser.email.concat(" | ", currentUser.displayName) - : currentUser.email, - }, - ], - }, - awaitRefetchQueries: true, - refetchQueries: ["QUERY_ACTIVE_SHIFT_TIME_TICKETS"], - }); + const result = await insertTimeTicket({ + variables: { + timeTicketInput: [ + { + bodyshopid: bodyshop.id, + employeeid: isTechConsole ? technician.id : employeeId, + cost_center: "timetickets.labels.shift", + clockon: theTime, + date: + typeof bodyshop.timezone === "string" + // TODO: Client Update - This may be broken + ? dayjs.tz(theTime, bodyshop.timezone).format("YYYY-MM-DD") + : typeof bodyshop.timezone === "number" + ? dayjs(theTime) + .utcOffset(bodyshop.timezone) + .format("YYYY-MM-DD") + : dayjs(theTime).format("YYYY-MM-DD"), + memo: values.memo, + created_by: isTechConsole + ? currentUser.email.concat( + " | ", + technician.employee_number + .concat( + " ", + technician.first_name, + " ", + technician.last_name + ) + .trim() + ) + : currentUser.displayName + ? currentUser.email.concat(" | ", currentUser.displayName) + : currentUser.email, + }, + ], + }, + awaitRefetchQueries: true, + refetchQueries: ["QUERY_ACTIVE_SHIFT_TIME_TICKETS"], + }); - if (!!result.errors) { - notification["error"]({ - message: t("timetickets.errors.clockingin", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification["success"]({ - message: t("timetickets.successes.clockedin"), - }); - } - } + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.clockingin", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.clockedin"), + }); + } + } - setLoading(false); - }; + setLoading(false); + }; - return ( -
    -
    - - - - {isTechConsole === true ? ( - - ) : null} - - -
    - ); + return ( +
    +
    + + + + {isTechConsole === true ? ( + + ) : null} + + +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicektShiftContainer); diff --git a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx index a6939e2e7..c7aa2e3ea 100644 --- a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx +++ b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx @@ -1,94 +1,91 @@ -import { useQuery } from "@apollo/client"; -import { Result } from "antd"; -import React, { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ACTIVE_SHIFT_TIME_TICKETS } from "../../graphql/timetickets.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useQuery} from "@apollo/client"; +import {Result} from "antd"; +import React, {useMemo} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ACTIVE_SHIFT_TIME_TICKETS} from "../../graphql/timetickets.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import TimeTicketShiftActive from "../time-ticket-shift-active/time-ticket-shift-active.component"; import TimeTicketShiftFormContainer from "../time-ticket-shift-form/time-ticket-shift-form.container"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - technician: selectTechnician, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + technician: selectTechnician, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function TimeTicketShiftContainer({ - bodyshop, - technician, - currentUser, - isTechConsole, -}) { - const { t } = useTranslation(); - const employeeId = useMemo(() => { - const assoc = bodyshop.associations.filter( - (a) => a.useremail === currentUser.email - )[0]; + bodyshop, + technician, + currentUser, + isTechConsole, + }) { + const {t} = useTranslation(); + const employeeId = useMemo(() => { + const assoc = bodyshop.associations.filter( + (a) => a.useremail === currentUser.email + )[0]; - return assoc && assoc.user && assoc.user.employee && assoc.user.employee.id; - }, [bodyshop, currentUser.email]); + return assoc && assoc.user && assoc.user.employee && assoc.user.employee.id; + }, [bodyshop, currentUser.email]); - const { loading, error, data, refetch } = useQuery( - QUERY_ACTIVE_SHIFT_TIME_TICKETS, - { - variables: { - employeeId: isTechConsole ? technician && technician.id : employeeId, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); - - if (loading) return ; - if (error) return ; - - if (!employeeId && !(technician && technician.id)) - return ( -
    - -
    + const {loading, error, data, refetch} = useQuery( + QUERY_ACTIVE_SHIFT_TIME_TICKETS, + { + variables: { + employeeId: isTechConsole ? technician && technician.id : employeeId, + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } ); - const checkIfAlreadyClocked = async () => { - const { data } = await refetch(); + if (loading) return ; + if (error) return ; - return data.timetickets.length > 0; - }; + if (!employeeId && !(technician && technician.id)) + return ( +
    + +
    + ); - return ( -
    - {data.timetickets.length > 0 ? ( - - ) : ( - - )} -
    - ); + const checkIfAlreadyClocked = async () => { + const {data} = await refetch(); + + return data.timetickets.length > 0; + }; + + return ( +
    + {data.timetickets.length > 0 ? ( + + ) : ( + + )} +
    + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketShiftContainer); diff --git a/client/src/components/time-ticket-task-modal/time-ticket-task-modal.component.jsx b/client/src/components/time-ticket-task-modal/time-ticket-task-modal.component.jsx index fc45add0d..88e5cd49b 100644 --- a/client/src/components/time-ticket-task-modal/time-ticket-task-modal.component.jsx +++ b/client/src/components/time-ticket-task-modal/time-ticket-task-modal.component.jsx @@ -1,197 +1,187 @@ -import { - Alert, - Col, - Form, - Radio, - Row, - Skeleton, - Space, - Spin, - Typography, -} from "antd"; +import {Alert, Col, Form, Radio, Row, Skeleton, Space, Spin, Typography,} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component"; import JobSearchSelectComponent from "../job-search-select/job-search-select.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketTaskModalComponent); export function TimeTicketTaskModalComponent({ - bodyshop, - form, - loading, - completedTasks, - unassignedHours, -}) { - const { t } = useTranslation(); + bodyshop, + form, + loading, + completedTasks, + unassignedHours, + }) { + const {t} = useTranslation(); - return ( -
    - -
    - - - - - - {loading ? ( - - ) : ( - ({ - value: preset.name, - label: preset.name, - disabled: completedTasks - .map((task) => task.name) - .includes(preset.name), - }))} - /> - )} - - - {() => { - const { task } = form.getFieldsValue(); - const theTaskPreset = bodyshop.md_tasks_presets?.presets?.find( - (tp) => tp.name === task - ); + return ( +
    + +
    + + + + + + {loading ? ( + + ) : ( + ({ + value: preset.name, + label: preset.name, + disabled: completedTasks + .map((task) => task.name) + .includes(preset.name), + }))} + /> + )} + + + {() => { + const {task} = form.getFieldsValue(); + const theTaskPreset = bodyshop.md_tasks_presets?.presets?.find( + (tp) => tp.name === task + ); - if (!task) return null; - return ( -
    - - - - - - - - - - - - - - -
    {t("bodyshop.fields.md_tasks_presets.percent")}{`${theTaskPreset.percent || 0}%`}
    - {t("bodyshop.fields.md_tasks_presets.hourstype")} - {theTaskPreset.hourstype.join(", ")}
    - {t("bodyshop.fields.md_tasks_presets.nextstatus")} - {theTaskPreset.nextstatus}
    - ); - }} - - - - - {loading ? ( - - ) : ( - - {(fields, { add, remove, move }) => { - return ( - <> - - {t("timetickets.labels.claimtaskpreview")} - - - - - - - - - - - - {fields.map((field, index) => ( - - - - - - - ))} - -
    {t("timetickets.fields.employee")}{t("timetickets.fields.cost_center")}{t("timetickets.fields.ciecacode")}{t("timetickets.fields.productivehrs")}
    - - - - - - - - - - - - - - - -
    + if (!task) return null; + return ( + + + + + + + + + + + + + + + +
    {t("bodyshop.fields.md_tasks_presets.percent")}{`${theTaskPreset.percent || 0}%`}
    + {t("bodyshop.fields.md_tasks_presets.hourstype")} + {theTaskPreset.hourstype.join(", ")}
    + {t("bodyshop.fields.md_tasks_presets.nextstatus")} + {theTaskPreset.nextstatus}
    + ); + }} + + + + + {loading ? ( + + ) : ( + + {(fields, {add, remove, move}) => { + return ( + <> + + {t("timetickets.labels.claimtaskpreview")} + + + + + + + + + + + + {fields.map((field, index) => ( + + + + + + + ))} + +
    {t("timetickets.fields.employee")}{t("timetickets.fields.cost_center")}{t("timetickets.fields.ciecacode")}{t("timetickets.fields.productivehrs")}
    + + + + + + + + + + + + + + + +
    + + + ); + }} +
    + )} + {unassignedHours > 0 && ( + + )} + + + + {bodyshop?.md_tasks_presets?.use_approvals && ( + - - ); - }} -
    - )} - {unassignedHours > 0 && ( - - )} - - - - {bodyshop?.md_tasks_presets?.use_approvals && ( - - - - )} -
    - ); + + )} + + ); } diff --git a/client/src/components/time-ticket-task-modal/time-ticket-task-modal.container.jsx b/client/src/components/time-ticket-task-modal/time-ticket-task-modal.container.jsx index b2a921d02..3c5522414 100644 --- a/client/src/components/time-ticket-task-modal/time-ticket-task-modal.container.jsx +++ b/client/src/components/time-ticket-task-modal/time-ticket-task-modal.container.jsx @@ -1,151 +1,149 @@ -import React, { useCallback, useEffect, useState } from "react"; +import React, {useCallback, useEffect, useState} from "react"; -import { Form, Modal, notification } from "antd"; +import {Form, Modal, notification} from "antd"; import axios from "axios"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectTimeTicketTasks } from "../../redux/modals/modals.selectors"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {toggleModalVisible} from "../../redux/modals/modals.actions"; +import {selectTimeTicketTasks} from "../../redux/modals/modals.selectors"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import TimeTicketTaskModalComponent from "./time-ticket-task-modal.component"; -import { useApolloClient } from "@apollo/client"; -import { QUERY_COMPLETED_TASKS } from "../../graphql/jobs.queries"; +import {useApolloClient} from "@apollo/client"; +import {QUERY_COMPLETED_TASKS} from "../../graphql/jobs.queries"; import "./time-ticket-task-modal.styles.scss"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; const mapStateToProps = createStructuredSelector({ - timeTicketTasksModal: selectTimeTicketTasks, - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, - technician: selectTechnician, + timeTicketTasksModal: selectTimeTicketTasks, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("timeTicketTask")), + toggleModalVisible: () => dispatch(toggleModalVisible("timeTicketTask")), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTickeTaskModalContainer); export function TimeTickeTaskModalContainer({ - bodyshop, - currentUser, - technician, - timeTicketTasksModal, - toggleModalVisible, -}) { - const [form] = Form.useForm(); - const { context, visible, actions } = timeTicketTasksModal; - const [completedTasks, setCompletedTasks] = useState([]); - const [unassignedHours, setUnassignedHours] = useState(0); - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const client = useApolloClient(); + bodyshop, + currentUser, + technician, + timeTicketTasksModal, + toggleModalVisible, + }) { + const [form] = Form.useForm(); + const {context, visible, actions} = timeTicketTasksModal; + const [completedTasks, setCompletedTasks] = useState([]); + const [unassignedHours, setUnassignedHours] = useState(0); + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); + const client = useApolloClient(); - async function handleFinish(values) { - calculateTickets({ values, handleFinish: true }); - } - const getCompletedTasks = useCallback( - async (jobid) => { - setLoading(true); - - const { data } = await client.query({ - query: QUERY_COMPLETED_TASKS, - variables: { jobid }, - }); - - setCompletedTasks(data.jobs_by_pk.completed_tasks || []); - setLoading(false); - }, - [client] - ); - useEffect(() => { - if (visible) { - form.setFieldsValue({ ...context, task: null, timetickets: null }); - if (context.jobid) { - getCompletedTasks(context.jobid); - } + async function handleFinish(values) { + calculateTickets({values, handleFinish: true}); } - }, [context.jobid, visible, getCompletedTasks, form, context]); - async function handleValueChange(changedValues, allValues) { - if (changedValues.jobid) { - getCompletedTasks(changedValues.jobid); - } - if (allValues.jobid && allValues.task) { - calculateTickets({ values: allValues, handleFinish: false }); - } - } + const getCompletedTasks = useCallback( + async (jobid) => { + setLoading(true); - const calculateTickets = async ({ values, handleFinish }) => { - setLoading(true); - try { - const { data, ...response } = await axios.post("/payroll/claimtask", { - jobid: values.jobid, - task: values.task, - calculateOnly: !handleFinish, - employee: technician - ? { - name: `${technician.first_name} ${technician.last_name}`.trim(), - employeeid: technician.id, + const {data} = await client.query({ + query: QUERY_COMPLETED_TASKS, + variables: {jobid}, + }); + + setCompletedTasks(data.jobs_by_pk.completed_tasks || []); + setLoading(false); + }, + [client] + ); + useEffect(() => { + if (visible) { + form.setFieldsValue({...context, task: null, timetickets: null}); + if (context.jobid) { + getCompletedTasks(context.jobid); } - : { name: currentUser.displayName, email: currentUser.email }, - }); - if (response.status === 200 && handleFinish) { - //Close the modal - if (actions?.refetch) actions.refetch(); - toggleModalVisible(); - } else if (handleFinish === false) { - form.setFieldsValue({ timetickets: data.ticketsToInsert }); - setUnassignedHours(data.unassignedHours); - } else { - notification.open({ - type: "error", - message: t("timetickets.errors.creating", { - message: JSON.stringify(data), - }), - }); - } - } catch (error) { - notification.open({ - type: "error", - message: t("timetickets.errors.creating", { message: error.message }), - }); - } finally { - setLoading(false); - } - }; + } + }, [context.jobid, visible, getCompletedTasks, form, context]); - return ( - { - toggleModalVisible(); - form.resetFields(); - }} - width="80%" - onOk={() => form.submit()} - > -
    - - -
    - ); + async function handleValueChange(changedValues, allValues) { + if (changedValues.jobid) { + getCompletedTasks(changedValues.jobid); + } + if (allValues.jobid && allValues.task) { + calculateTickets({values: allValues, handleFinish: false}); + } + } + + const calculateTickets = async ({values, handleFinish}) => { + setLoading(true); + try { + const {data, ...response} = await axios.post("/payroll/claimtask", { + jobid: values.jobid, + task: values.task, + calculateOnly: !handleFinish, + employee: technician + ? { + name: `${technician.first_name} ${technician.last_name}`.trim(), + employeeid: technician.id, + } + : {name: currentUser.displayName, email: currentUser.email}, + }); + if (response.status === 200 && handleFinish) { + //Close the modal + if (actions?.refetch) actions.refetch(); + toggleModalVisible(); + } else if (handleFinish === false) { + form.setFieldsValue({timetickets: data.ticketsToInsert}); + setUnassignedHours(data.unassignedHours); + } else { + notification.open({ + type: "error", + message: t("timetickets.errors.creating", { + message: JSON.stringify(data), + }), + }); + } + } catch (error) { + notification.open({ + type: "error", + message: t("timetickets.errors.creating", {message: error.message}), + }); + } finally { + setLoading(false); + } + }; + + return ( + { + toggleModalVisible(); + form.resetFields(); + }} + width="80%" + onOk={() => form.submit()} + > +
    + + +
    + ); } diff --git a/client/src/components/time-tickets-attendance-table/time-tickets-attendance-table.component.jsx b/client/src/components/time-tickets-attendance-table/time-tickets-attendance-table.component.jsx index ce7c4b34f..598bf57b6 100644 --- a/client/src/components/time-tickets-attendance-table/time-tickets-attendance-table.component.jsx +++ b/client/src/components/time-tickets-attendance-table/time-tickets-attendance-table.component.jsx @@ -1,42 +1,43 @@ -import { Button } from "antd"; +import {Button} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useLocation } from "react-router-dom"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { useTranslation } from "react-i18next"; -import moment from "moment"; +import React, {useState} from "react"; +import {useLocation} from "react-router-dom"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {useTranslation} from "react-i18next"; +import dayjs from "../../utils/day"; + const AttendanceCsv = TemplateList("special").attendance_detail_csv; export default function TimeTicketsAttendanceTable() { - const searchParams = queryString.parse(useLocation().search); - const { start, end } = searchParams; - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); + const searchParams = queryString.parse(useLocation().search); + const {start, end} = searchParams; + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); - const handleClick = async () => { - setLoading(true); + const handleClick = async () => { + setLoading(true); - await GenerateDocument( - { - name: AttendanceCsv.key, - variables: { - start: start - ? start - : moment().startOf("week").subtract(7, "days").format("YYYY-MM-DD"), - end: end ? end : moment().endOf("week").format("YYYY-MM-DD"), - }, - }, - {}, - "text" + await GenerateDocument( + { + name: AttendanceCsv.key, + variables: { + start: start + ? start + : dayjs().startOf("week").subtract(7, "day").format("YYYY-MM-DD"), + end: end ? end : dayjs().endOf("week").format("YYYY-MM-DD"), + }, + }, + {}, + "text" + ); + + setLoading(false); + }; + + return ( + ); - - setLoading(false); - }; - - return ( - - ); } diff --git a/client/src/components/time-tickets-commit-toggle/time-tickets-commit-toggle.component.jsx b/client/src/components/time-tickets-commit-toggle/time-tickets-commit-toggle.component.jsx index 331a646c3..5d6329e47 100644 --- a/client/src/components/time-tickets-commit-toggle/time-tickets-commit-toggle.component.jsx +++ b/client/src/components/time-tickets-commit-toggle/time-tickets-commit-toggle.component.jsx @@ -1,104 +1,102 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_TIME_TICKET } from "../../graphql/timetickets.queries"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import day from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_TIME_TICKET} from "../../graphql/timetickets.queries"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - setTimeTicketContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicket" })), + setTimeTicketContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicket"})), }); + export function TimeTicketsCommit({ - bodyshop, - currentUser, - timeticket, - disabled, - refetch, - setTimeTicketContext, -}) { - const { t } = useTranslation(); - const [updateTimeTicket] = useMutation(UPDATE_TIME_TICKET); + bodyshop, + currentUser, + timeticket, + disabled, + refetch, + setTimeTicketContext, + }) { + const {t} = useTranslation(); + const [updateTimeTicket] = useMutation(UPDATE_TIME_TICKET); - const [loading, setLoading] = useState(false); - const handleCommit = async () => { - setLoading(true); - try { - const ticketUpdate = timeticket.committed_at - ? { commited_by: null, committed_at: null } - : { - commited_by: currentUser.email, - committed_at: moment(), - }; + const [loading, setLoading] = useState(false); + const handleCommit = async () => { + setLoading(true); + try { + const ticketUpdate = timeticket.committed_at + ? {commited_by: null, committed_at: null} + : { + commited_by: currentUser.email, + committed_at: day(), + }; - const result = await updateTimeTicket({ - variables: { - timeticketId: timeticket.id, - timeticket: ticketUpdate, - }, - update(cache) { - cache.modify({ - fields: { - timeTickets(existingtickets, { readField }) { - return existingtickets.map((ticket) => { - if (timeticket.id === readField("id", ticket)) { - return { - ...ticket, - ...ticketUpdate, - }; - } - return ticket; + const result = await updateTimeTicket({ + variables: { + timeticketId: timeticket.id, + timeticket: ticketUpdate, + }, + update(cache) { + cache.modify({ + fields: { + timeTickets(existingtickets, {readField}) { + return existingtickets.map((ticket) => { + if (timeticket.id === readField("id", ticket)) { + return { + ...ticket, + ...ticketUpdate, + }; + } + return ticket; + }); + }, + }, + }); + }, + }); + if (result.errors) { + notification.open({ + type: "error", + message: t("timetickets.errors.creating", { + message: JSON.stringify(result.errors), + }), }); - }, - }, - }); - }, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("timetickets.errors.creating", { - message: JSON.stringify(result.errors), - }), - }); - } else { - setTimeTicketContext({ - context: { - id: timeticket.id, - timeticket: result.data.update_timetickets.returning[0], - }, - }); - notification.open({ - type: "success", - message: t("timetickets.successes.committed"), - }); - } - } catch (error) { - } finally { - setLoading(false); - } - }; + } else { + setTimeTicketContext({ + context: { + id: timeticket.id, + timeticket: result.data.update_timetickets.returning[0], + }, + }); + notification.open({ + type: "success", + message: t("timetickets.successes.committed"), + }); + } + } catch (error) { + } finally { + setLoading(false); + } + }; - if (!timeticket?.id) return null; + if (!timeticket?.id) return null; - return ( - - ); + return ( + + ); } export default connect(mapStateToProps, mapDispatchToProps)(TimeTicketsCommit); diff --git a/client/src/components/time-tickets-commit/time-tickets-commit.component.jsx b/client/src/components/time-tickets-commit/time-tickets-commit.component.jsx index 87f550360..f080f10b0 100644 --- a/client/src/components/time-tickets-commit/time-tickets-commit.component.jsx +++ b/client/src/components/time-tickets-commit/time-tickets-commit.component.jsx @@ -1,95 +1,92 @@ -import { useMutation } from "@apollo/client"; -import { Button, notification } from "antd"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { UPDATE_TIME_TICKETS } from "../../graphql/timetickets.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import {useMutation} from "@apollo/client"; +import {Button, notification} from "antd"; +import day from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {UPDATE_TIME_TICKETS} from "../../graphql/timetickets.queries"; +import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); export function TimeTicketsCommit({ - bodyshop, - currentUser, - timetickets, - disabled, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const [updateTimeTickets] = useMutation(UPDATE_TIME_TICKETS); + bodyshop, + currentUser, + timetickets, + disabled, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const [updateTimeTickets] = useMutation(UPDATE_TIME_TICKETS); - const [loading, setLoading] = useState(false); - const handleCommit = async () => { - setLoading(true); - try { - const result = await updateTimeTickets({ - variables: { - timeticketIds: timetickets.map((ticket) => ticket.id), - timeticket: { - commited_by: currentUser.email, - committed_at: moment(), - }, - }, - update(cache) { - cache.modify({ - fields: { - timeTickets(existingtickets, { readField }) { - const modifiedIds = timetickets.map((ticket) => ticket.id); - return existingtickets.map((ticket) => { - if (modifiedIds.includes(readField("id", ticket))) { - return { - ...ticket, - commited_by: currentUser.email, - committed_at: moment(), - }; - } - return ticket; + const [loading, setLoading] = useState(false); + const handleCommit = async () => { + setLoading(true); + try { + const result = await updateTimeTickets({ + variables: { + timeticketIds: timetickets.map((ticket) => ticket.id), + timeticket: { + commited_by: currentUser.email, + committed_at: day(), + }, + }, + update(cache) { + cache.modify({ + fields: { + timeTickets(existingtickets, {readField}) { + const modifiedIds = timetickets.map((ticket) => ticket.id); + return existingtickets.map((ticket) => { + if (modifiedIds.includes(readField("id", ticket))) { + return { + ...ticket, + commited_by: currentUser.email, + committed_at: day(), + }; + } + return ticket; + }); + }, + }, + }); + }, + }); + if (result.errors) { + notification.open({ + type: "error", + message: t("timetickets.errors.creating", { + message: JSON.stringify(result.errors), + }), }); - }, - }, - }); - }, - }); - if (result.errors) { - notification.open({ - type: "error", - message: t("timetickets.errors.creating", { - message: JSON.stringify(result.errors), - }), - }); - } else { - notification.open({ - type: "success", - message: t("timetickets.successes.committed"), - }); - if (!!completedCallback) completedCallback([]); - if (!!loadingCallback) loadingCallback(false); - } - } catch (error) { - } finally { - setLoading(false); - } - }; + } else { + notification.open({ + type: "success", + message: t("timetickets.successes.committed"), + }); + if (!!completedCallback) completedCallback([]); + if (!!loadingCallback) loadingCallback(false); + } + } catch (error) { + } finally { + setLoading(false); + } + }; - return ( - - ); + return ( + + ); } export default connect(mapStateToProps, null)(TimeTicketsCommit); diff --git a/client/src/components/time-tickets-payroll-table/time-tickets-payroll-table.component.jsx b/client/src/components/time-tickets-payroll-table/time-tickets-payroll-table.component.jsx index 731d94273..dd8f1d5ce 100644 --- a/client/src/components/time-tickets-payroll-table/time-tickets-payroll-table.component.jsx +++ b/client/src/components/time-tickets-payroll-table/time-tickets-payroll-table.component.jsx @@ -1,41 +1,42 @@ -import { Button } from "antd"; +import {Button} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useLocation } from "react-router-dom"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { useTranslation } from "react-i18next"; -import moment from "moment"; +import React, {useState} from "react"; +import {useLocation} from "react-router-dom"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {useTranslation} from "react-i18next"; +import dayjs from "../../utils/day"; + const PayrollTemplate = TemplateList("special").exported_payroll; export default function TimeTicketsPayrollTable() { - const searchParams = queryString.parse(useLocation().search); - const { start, end } = searchParams; - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); + const searchParams = queryString.parse(useLocation().search); + const {start, end} = searchParams; + const {t} = useTranslation(); + const [loading, setLoading] = useState(false); - const handleClick = async () => { - setLoading(true); + const handleClick = async () => { + setLoading(true); - await GenerateDocument( - { - name: PayrollTemplate.key, - variables: { - start: start - ? start - : moment().startOf("week").subtract(7, "days").format("YYYY-MM-DD"), - end: end ? end : moment().endOf("week").format("YYYY-MM-DD"), - }, - }, - {}, - "x" + await GenerateDocument( + { + name: PayrollTemplate.key, + variables: { + start: start + ? start + : dayjs().startOf("week").subtract(7, "day").format("YYYY-MM-DD"), + end: end ? end : dayjs().endOf("week").format("YYYY-MM-DD"), + }, + }, + {}, + "x" + ); + + setLoading(false); + }; + + return ( + ); - - setLoading(false); - }; - - return ( - - ); } diff --git a/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx index 1a1d05dc9..df10c41b7 100644 --- a/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx +++ b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx @@ -1,342 +1,344 @@ -import { Card, Col, Row, Table } from "antd"; +import {Card, Col, Row, Table} from "antd"; import _ from "lodash"; -import moment from "moment"; -import React, { useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort } from "../../utils/sorters"; -import { TemplateList } from "../../utils/TemplateConstants"; +import dayjs from "../../utils/day"; +import React, {useMemo, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort} from "../../utils/sorters"; +import {TemplateList} from "../../utils/TemplateConstants"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; import Dinero from "dinero.js"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function TimeTicketsSummaryEmployees({ - bodyshop, - loading, - timetickets, - startDate, - endDate, -}) { - //Group everything by employee - //Then sum the individual time TimeTicketsSummary. + bodyshop, + loading, + timetickets, + startDate, + endDate, + }) { + //Group everything by employee + //Then sum the individual time TimeTicketsSummary. - //Calculate job based tickets. - const jobTicketsByEmployee = {}; - timetickets - .filter((i) => i.cost_center !== "timetickets.labels.shift") - .map((tt) => { - if (!!!jobTicketsByEmployee[tt.employeeid]) { - jobTicketsByEmployee[tt.employeeid] = []; - } - jobTicketsByEmployee[tt.employeeid].push(tt); - return null; + //Calculate job based tickets. + const jobTicketsByEmployee = {}; + timetickets + .filter((i) => i.cost_center !== "timetickets.labels.shift") + .map((tt) => { + if (!!!jobTicketsByEmployee[tt.employeeid]) { + jobTicketsByEmployee[tt.employeeid] = []; + } + jobTicketsByEmployee[tt.employeeid].push(tt); + return null; + }); + const jobTickets = Object.keys(jobTicketsByEmployee).map(function (key) { + return { + jobKey: key, + employee: jobTicketsByEmployee[key][0].employee, + tickets: jobTicketsByEmployee[key], + }; }); - const jobTickets = Object.keys(jobTicketsByEmployee).map(function (key) { - return { - jobKey: key, - employee: jobTicketsByEmployee[key][0].employee, - tickets: jobTicketsByEmployee[key], - }; - }); - //Calculate shift based tickets. - const shiftTicketsByEmployee = {}; - timetickets - .filter((i) => i.cost_center === "timetickets.labels.shift") - .map((tt) => { - if (!!!shiftTicketsByEmployee[tt.employeeid]) { - shiftTicketsByEmployee[tt.employeeid] = []; - } - shiftTicketsByEmployee[tt.employeeid].push(tt); - return null; + //Calculate shift based tickets. + const shiftTicketsByEmployee = {}; + timetickets + .filter((i) => i.cost_center === "timetickets.labels.shift") + .map((tt) => { + if (!!!shiftTicketsByEmployee[tt.employeeid]) { + shiftTicketsByEmployee[tt.employeeid] = []; + } + shiftTicketsByEmployee[tt.employeeid].push(tt); + return null; + }); + const shiftTickets = Object.keys(shiftTicketsByEmployee).map(function (key) { + return { + employee: shiftTicketsByEmployee[key][0].employee, + tickets: shiftTicketsByEmployee[key], + }; }); - const shiftTickets = Object.keys(shiftTicketsByEmployee).map(function (key) { - return { - employee: shiftTicketsByEmployee[key][0].employee, - tickets: shiftTicketsByEmployee[key], - }; - }); - return ( - - - - - - - - - ); + return ( + + + + + + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketsSummaryEmployees); const JobRelatedTicketsTable = ({ - loading, - jobTickets, - startDate, - endDate, -}) => { - const Templates = TemplateList(); - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - const data = useMemo(() => { - return _.flatten( - jobTickets.map((item, idx) => { - const employeeCostCenters = item.tickets - .map((i) => i.cost_center) - .filter(onlyUnique); + loading, + jobTickets, + startDate, + endDate, + }) => { + const Templates = TemplateList(); + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + const data = useMemo(() => { + return _.flatten( + jobTickets.map((item, idx) => { + const employeeCostCenters = item.tickets + .map((i) => i.cost_center) + .filter(onlyUnique); - return employeeCostCenters.map((costCenter) => { - const actHrs = item.tickets - .filter((ticket) => ticket.cost_center === costCenter) - .reduce((acc, val) => acc + val.actualhrs, 0); + return employeeCostCenters.map((costCenter) => { + const actHrs = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .reduce((acc, val) => acc + val.actualhrs, 0); - const prodHrs = item.tickets - .filter((ticket) => ticket.cost_center === costCenter) - .reduce((acc, val) => acc + val.productivehrs, 0); + const prodHrs = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .reduce((acc, val) => acc + val.productivehrs, 0); - const clockHrs = item.tickets - .filter((ticket) => ticket.cost_center === costCenter) - .reduce((acc, val) => { - if (!!val.clockoff && !!val.clockon) - return ( - acc + - moment(val.clockoff).diff(moment(val.clockon), "hours", true) - ); - return acc; - }, 0); + const clockHrs = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .reduce((acc, val) => { + if (!!val.clockoff && !!val.clockon) + return ( + acc + + dayjs(val.clockoff).diff(dayjs(val.clockon), "hour", true) + ); + return acc; + }, 0); - const pay = item.tickets - .filter((ticket) => ticket.cost_center === costCenter) - .reduce((acc, val) => { - return acc.add( - Dinero({ amount: Math.round(val.rate * 100) }).multiply( - val.flat_rate ? val.productivehrs : val.actualhrs - ) - ); - }, Dinero()); + const pay = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .reduce((acc, val) => { + return acc.add( + Dinero({amount: Math.round(val.rate * 100)}).multiply( + val.flat_rate ? val.productivehrs : val.actualhrs + ) + ); + }, Dinero()); - return { - id: `${item.jobKey}${costCenter}`, - costCenter, - item, - actHrs: actHrs.toFixed(1), - prodHrs: prodHrs.toFixed(1), - clockHrs, - pay, - }; - }); - }) + return { + id: `${item.jobKey}${costCenter}`, + costCenter, + item, + actHrs: actHrs.toFixed(1), + prodHrs: prodHrs.toFixed(1), + clockHrs, + pay, + }; + }); + }) + ); + }, [jobTickets]); + + const columns = [ + { + title: t("employees.labels.name"), + dataIndex: "empname", + key: "empname", + sorter: (a, b) => + alphaSort(a.item.employee.last_name, b.item.employee.last_name), + sortOrder: + state.sortedInfo.columnKey === "empname" && state.sortedInfo.order, + render: (text, record) => + `${record.item.employee.first_name} ${record.item.employee.last_name} ${ + record.costCenter ? `(${record.costCenter})` : "" + }`.trim(), + }, + { + title: t("timetickets.fields.actualhrs"), + dataIndex: "actHrs", + key: "actHrs", + sorter: (a, b) => a.actHrs - b.actHrs, + sortOrder: + state.sortedInfo.columnKey === "actHrs" && state.sortedInfo.order, + }, + { + title: t("timetickets.fields.productivehrs"), + dataIndex: "prodHrs", + key: "prodHrs", + sorter: (a, b) => a.prodHrs - b.prodHrs, + sortOrder: + state.sortedInfo.columnKey === "prodHrs" && state.sortedInfo.order, + }, + { + title: t("timetickets.fields.efficiency"), + dataIndex: "total", + key: "total", + sorter: (a, b) => + (a.actHrs === 0 || !a.actHrs ? 0 : (a.prodHrs / a.actHrs) * 100) - + (b.actHrs === 0 || !b.actHrs ? 0 : (b.prodHrs / b.actHrs) * 100), + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => + record.actHrs === 0 || !record.actHrs + ? "∞" + : ((record.prodHrs / record.actHrs) * 100).toFixed(2), + }, + { + title: t("timetickets.fields.clockhours"), + dataIndex: "clockHrs", + key: "clockHrs", + sorter: (a, b) => a.clockHrs - b.clockHrs, + sortOrder: + state.sortedInfo.columnKey === "clockHrs" && state.sortedInfo.order, + render: (text, record) => record.clockHrs.toFixed(2), + }, + { + title: "Pay", + dataIndex: "Pay", + key: "Pay", + sorter: (a, b) => a.clockHrs - b.clockHrs, + sortOrder: + state.sortedInfo.columnKey === "clockHrs" && state.sortedInfo.order, + render: (text, record) => record.pay.toFormat("$0.00"), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + ), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + return ( + + + ); - }, [jobTickets]); - - const columns = [ - { - title: t("employees.labels.name"), - dataIndex: "empname", - key: "empname", - sorter: (a, b) => - alphaSort(a.item.employee.last_name, b.item.employee.last_name), - sortOrder: - state.sortedInfo.columnKey === "empname" && state.sortedInfo.order, - render: (text, record) => - `${record.item.employee.first_name} ${record.item.employee.last_name} ${ - record.costCenter ? `(${record.costCenter})` : "" - }`.trim(), - }, - { - title: t("timetickets.fields.actualhrs"), - dataIndex: "actHrs", - key: "actHrs", - sorter: (a, b) => a.actHrs - b.actHrs, - sortOrder: - state.sortedInfo.columnKey === "actHrs" && state.sortedInfo.order, - }, - { - title: t("timetickets.fields.productivehrs"), - dataIndex: "prodHrs", - key: "prodHrs", - sorter: (a, b) => a.prodHrs - b.prodHrs, - sortOrder: - state.sortedInfo.columnKey === "prodHrs" && state.sortedInfo.order, - }, - { - title: t("timetickets.fields.efficiency"), - dataIndex: "total", - key: "total", - sorter: (a, b) => - (a.actHrs === 0 || !a.actHrs ? 0 : (a.prodHrs / a.actHrs) * 100) - - (b.actHrs === 0 || !b.actHrs ? 0 : (b.prodHrs / b.actHrs) * 100), - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => - record.actHrs === 0 || !record.actHrs - ? "∞" - : ((record.prodHrs / record.actHrs) * 100).toFixed(2), - }, - { - title: t("timetickets.fields.clockhours"), - dataIndex: "clockHrs", - key: "clockHrs", - sorter: (a, b) => a.clockHrs - b.clockHrs, - sortOrder: - state.sortedInfo.columnKey === "clockHrs" && state.sortedInfo.order, - render: (text, record) => record.clockHrs.toFixed(2), - }, - { - title: "Pay", - dataIndex: "Pay", - key: "Pay", - sorter: (a, b) => a.clockHrs - b.clockHrs, - sortOrder: - state.sortedInfo.columnKey === "clockHrs" && state.sortedInfo.order, - render: (text, record) => record.pay.toFormat("$0.00"), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - ), - }, - ]; - - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - return ( - -
    - - ); }; const ShiftRelatedTicketsTable = ({ - loading, - shiftTickets, - startDate, - endDate, -}) => { - const Templates = TemplateList(); - const { t } = useTranslation(); - const [state, setState] = useState({ - sortedInfo: {}, - }); - const data = useMemo(() => { - return shiftTickets.map((item) => { - const clockHrs = item.tickets.reduce((acc, val) => { - if (!!val.clockoff && !!val.clockon) - return ( - acc + moment(val.clockoff).diff(moment(val.clockon), "hours", true) - ); - return acc; - }, 0); - - return { id: item.employee.id, item, clockHrs }; + loading, + shiftTickets, + startDate, + endDate, + }) => { + const Templates = TemplateList(); + const {t} = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, }); - }, [shiftTickets]); + const data = useMemo(() => { + return shiftTickets.map((item) => { + const clockHrs = item.tickets.reduce((acc, val) => { + if (!!val.clockoff && !!val.clockon) + return ( + acc + dayjs(val.clockoff).diff(dayjs(val.clockon), "hour", true) + ); + return acc; + }, 0); - const columns = [ - { - title: t("employees.labels.name"), - dataIndex: "empname", - key: "empname", - sorter: (a, b) => alphaSort(a.empname, b.empname), - sortOrder: - state.sortedInfo.columnKey === "empname" && state.sortedInfo.order, - render: (text, record) => - `${record.item.employee.first_name} ${record.item.employee.last_name}`, - }, + return {id: item.employee.id, item, clockHrs}; + }); + }, [shiftTickets]); - { - title: t("timetickets.fields.clockhours"), - dataIndex: "clockHrs", - key: "clockHrs", - sorter: (a, b) => a.clockHrs - b.clockHrs, - sortOrder: - state.sortedInfo.columnKey === "clockHrs" && state.sortedInfo.order, - render: (text, record) => record.clockHrs.toFixed(2), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - ), - }, - ]; + const columns = [ + { + title: t("employees.labels.name"), + dataIndex: "empname", + key: "empname", + sorter: (a, b) => alphaSort(a.empname, b.empname), + sortOrder: + state.sortedInfo.columnKey === "empname" && state.sortedInfo.order, + render: (text, record) => + `${record.item.employee.first_name} ${record.item.employee.last_name}`, + }, - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + { + title: t("timetickets.fields.clockhours"), + dataIndex: "clockHrs", + key: "clockHrs", + sorter: (a, b) => a.clockHrs - b.clockHrs, + sortOrder: + state.sortedInfo.columnKey === "clockHrs" && state.sortedInfo.order, + render: (text, record) => record.clockHrs.toFixed(2), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + ), + }, + ]; - return ( - -
    - - ); + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + return ( + +
    + + ); }; diff --git a/client/src/components/tt-approvals-list/tt-approvals-list.component.jsx b/client/src/components/tt-approvals-list/tt-approvals-list.component.jsx index f46407646..5c58368dc 100644 --- a/client/src/components/tt-approvals-list/tt-approvals-list.component.jsx +++ b/client/src/components/tt-approvals-list/tt-approvals-list.component.jsx @@ -1,241 +1,238 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Space, Table, Tag } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Space, Table, Tag} from "antd"; import Dinero from "dinero.js"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { - selectAuthLevel, - selectBodyshop, -} from "../../redux/user/user.selectors"; -import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter"; -import { onlyUnique } from "../../utils/arrayHelper"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useNavigate, useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectAuthLevel, selectBodyshop,} from "../../redux/user/user.selectors"; +import {DateFormatter, DateTimeFormatter} from "../../utils/DateFormatter"; +import {onlyUnique} from "../../utils/arrayHelper"; +import {alphaSort, dateSort} from "../../utils/sorters"; import TtApproveButtonComponent from "../tt-approve-button/tt-approve-button.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - authLevel: selectAuthLevel, + bodyshop: selectBodyshop, + authLevel: selectAuthLevel, }); const mapDispatchToProps = (dispatch) => ({ - setTimeTicketTaskContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicketTask" })), + setTimeTicketTaskContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicketTask"})), }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TtApprovalsListComponent); export function TtApprovalsListComponent({ - bodyshop, - setTimeTicketTaskContext, - authLevel, - disabled, - loading, - tt_approval_queue, - total, - refetch, - techConsole, - jobId, - extra, -}) { - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + bodyshop, + setTimeTicketTaskContext, + authLevel, + disabled, + loading, + tt_approval_queue, + total, + refetch, + techConsole, + jobId, + extra, + }) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); - const history = useHistory(); - const search = queryString.parse(useLocation().search); - const { page } = search; - const [selectedTickets, setSelectedTickets] = useState([]); + const {t} = useTranslation(); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const {page} = search; + const [selectedTickets, setSelectedTickets] = useState([]); - const columns = [ - { - title: t("timetickets.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => dateSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("timetickets.fields.employee"), - dataIndex: "employeeid", - key: "employeeid", - sorter: (a, b) => alphaSort(a.employee.last_name, b.employee.last_name), - sortOrder: - state.sortedInfo.columnKey === "employee" && state.sortedInfo.order, - render: (text, record) => - `${record.employee.first_name} ${record.employee.last_name}`, - filters: - tt_approval_queue - .map((l) => l.employeeid) - .filter(onlyUnique) - .map((s) => { - return { - text: (() => { - const emp = bodyshop.employees.find((e) => e.id === s); + const columns = [ + { + title: t("timetickets.fields.date"), + dataIndex: "date", + key: "date", + sorter: (a, b) => dateSort(a.date, b.date), + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("timetickets.fields.employee"), + dataIndex: "employeeid", + key: "employeeid", + sorter: (a, b) => alphaSort(a.employee.last_name, b.employee.last_name), + sortOrder: + state.sortedInfo.columnKey === "employee" && state.sortedInfo.order, + render: (text, record) => + `${record.employee.first_name} ${record.employee.last_name}`, + filters: + tt_approval_queue + .map((l) => l.employeeid) + .filter(onlyUnique) + .map((s) => { + return { + text: (() => { + const emp = bodyshop.employees.find((e) => e.id === s); - return `${emp?.first_name} ${emp?.last_name}`; - })(), // - value: [s], - }; - }) || [], - onFilter: (value, record) => value.includes(record.employeeid), - }, - { - title: t("timetickets.fields.cost_center"), - dataIndex: "cost_center", - key: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - render: (text, record) => - record.cost_center === "timetickets.labels.shift" - ? t(record.cost_center) - : record.cost_center, - sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, - filters: - tt_approval_queue - .map((l) => l.cost_center) - .filter(onlyUnique) - .map((s) => { - return { - text: s === "timetickets.labels.shift" ? t(s) : s, //|| "No Status*", - value: [s], - }; - }) || [], - onFilter: (value, record) => value.includes(record.cost_center), - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => - alphaSort(a.job && a.job.ro_number, b.job && b.job.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => - record.job && ( - - - {record.job.ro_number || "N/A"} - {record.job.status} - - - ), - }, - { - title: t("timetickets.fields.productivehrs"), - dataIndex: "productivehrs", - key: "productivehrs", - sorter: (a, b) => a.productivehrs - b.productivehrs, - sortOrder: - state.sortedInfo.columnKey === "productivehrs" && - state.sortedInfo.order, - }, - { - title: t("timetickets.fields.actualhrs"), - dataIndex: "actualhrs", - key: "actualhrs", - sorter: (a, b) => a.actualhrs - b.actualhrs, - sortOrder: - state.sortedInfo.columnKey === "actualhrs" && state.sortedInfo.order, - }, - { - title: t("timetickets.fields.memo"), - dataIndex: "memo", - key: "memo", - sorter: (a, b) => alphaSort(a.memo, b.memo), - sortOrder: - state.sortedInfo.columnKey === "memo" && state.sortedInfo.order, - render: (text, record) => - record.clockon || record.clockoff ? t(record.memo) : record.memo, - }, - { - title: t("timetickets.fields.clockon"), - dataIndex: "clockon", - key: "clockon", + return `${emp?.first_name} ${emp?.last_name}`; + })(), // + value: [s], + }; + }) || [], + onFilter: (value, record) => value.includes(record.employeeid), + }, + { + title: t("timetickets.fields.cost_center"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + render: (text, record) => + record.cost_center === "timetickets.labels.shift" + ? t(record.cost_center) + : record.cost_center, + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + filters: + tt_approval_queue + .map((l) => l.cost_center) + .filter(onlyUnique) + .map((s) => { + return { + text: s === "timetickets.labels.shift" ? t(s) : s, //|| "No Status*", + value: [s], + }; + }) || [], + onFilter: (value, record) => value.includes(record.cost_center), + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => + alphaSort(a.job && a.job.ro_number, b.job && b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => + record.job && ( + + + {record.job.ro_number || "N/A"} + {record.job.status} + + + ), + }, + { + title: t("timetickets.fields.productivehrs"), + dataIndex: "productivehrs", + key: "productivehrs", + sorter: (a, b) => a.productivehrs - b.productivehrs, + sortOrder: + state.sortedInfo.columnKey === "productivehrs" && + state.sortedInfo.order, + }, + { + title: t("timetickets.fields.actualhrs"), + dataIndex: "actualhrs", + key: "actualhrs", + sorter: (a, b) => a.actualhrs - b.actualhrs, + sortOrder: + state.sortedInfo.columnKey === "actualhrs" && state.sortedInfo.order, + }, + { + title: t("timetickets.fields.memo"), + dataIndex: "memo", + key: "memo", + sorter: (a, b) => alphaSort(a.memo, b.memo), + sortOrder: + state.sortedInfo.columnKey === "memo" && state.sortedInfo.order, + render: (text, record) => + record.clockon || record.clockoff ? t(record.memo) : record.memo, + }, + { + title: t("timetickets.fields.clockon"), + dataIndex: "clockon", + key: "clockon", - render: (text, record) => ( - {record.clockon} - ), - }, - { - title: "Pay", - dataIndex: "pay", - key: "pay", - render: (text, record) => - Dinero({ amount: Math.round(record.rate * 100) }) - .multiply(record.flat_rate ? record.productivehrs : record.actualhrs) - .toFormat("$0.00"), - }, - ]; + render: (text, record) => ( + {record.clockon} + ), + }, + { + title: "Pay", + dataIndex: "pay", + key: "pay", + render: (text, record) => + Dinero({amount: Math.round(record.rate * 100)}) + .multiply(record.flat_rate ? record.productivehrs : record.actualhrs) + .toFormat("$0.00"), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - if (sorter && sorter.column && sorter.column.sortObject) { - search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order)); - } else { - delete search.searchObj; - search.sortcolumn = sorter.order ? sorter.columnKey : null; - search.sortorder = sorter.order; - } + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + search.page = pagination.current; + if (sorter && sorter.column && sorter.column.sortObject) { + search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order)); + } else { + delete search.searchObj; + search.sortcolumn = sorter.order ? sorter.columnKey : null; + search.sortorder = sorter.order; + } - search.sort = JSON.stringify({ [sorter.columnKey]: sorter.order }); - history.push({ search: queryString.stringify(search) }); - }; + search.sort = JSON.stringify({[sorter.columnKey]: sorter.order}); + history({search: queryString.stringify(search)}); + }; - return ( - - {extra} - - - - } - > -
    - setSelectedTickets(selectedRows.map((i) => i.id)), - onSelect: (record, selected, selectedRows, nativeEvent) => { - setSelectedTickets(selectedRows.map((i) => i.id)); - }, - selectedRowKeys: selectedTickets, - type: "checkbox", - }} - /> - - ); + return ( + + {extra} + + + + } + > +
    + setSelectedTickets(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedTickets(selectedRows.map((i) => i.id)); + }, + selectedRowKeys: selectedTickets, + type: "checkbox", + }} + /> + + ); } diff --git a/client/src/components/tt-approvals-list/tt-approvals-list.container.jsx b/client/src/components/tt-approvals-list/tt-approvals-list.container.jsx index f9ce5250f..6e524f095 100644 --- a/client/src/components/tt-approvals-list/tt-approvals-list.container.jsx +++ b/client/src/components/tt-approvals-list/tt-approvals-list.container.jsx @@ -1,69 +1,66 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; import React from "react"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { QUERY_ALL_TT_APPROVALS_PAGINATED } from "../../graphql/tt-approvals.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {QUERY_ALL_TT_APPROVALS_PAGINATED} from "../../graphql/tt-approvals.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import AlertComponent from "../alert/alert.component"; import TtApprovalsListComponent from "./tt-approvals-list.component"; const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function TimeTicketsContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, search, searchObj } = searchParams; + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, search, searchObj} = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_TT_APPROVALS_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - search: search || "", - offset: page ? (page - 1) * 25 : 0, - limit: 25, - order: [ - searchObj - ? JSON.parse(searchObj) - : { - [sortcolumn || "date"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_TT_APPROVALS_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + searchObj + ? JSON.parse(searchObj) + : { + [sortcolumn || "date"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); - if (error) return ; + if (error) return ; - return ( - - ); + return ( + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TimeTicketsContainer); diff --git a/client/src/components/tt-approve-button/tt-approve-button.component.jsx b/client/src/components/tt-approve-button/tt-approve-button.component.jsx index 0ae9120b3..db7109bf9 100644 --- a/client/src/components/tt-approve-button/tt-approve-button.component.jsx +++ b/client/src/components/tt-approve-button/tt-approve-button.component.jsx @@ -1,103 +1,99 @@ -import { useApolloClient } from "@apollo/client"; -import { Button, notification } from "antd"; +import {useApolloClient} from "@apollo/client"; +import {Button, notification} from "antd"; import _ from "lodash"; -import moment from "moment"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { INSERT_TIME_TICKET_AND_APPROVE } from "../../graphql/timetickets.queries"; -import { QUERY_TT_APPROVALS_BY_IDS } from "../../graphql/tt-approvals.queries"; -import { - selectAuthLevel, - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; -import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; +import day from "../../utils/day"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {INSERT_TIME_TICKET_AND_APPROVE} from "../../graphql/timetickets.queries"; +import {QUERY_TT_APPROVALS_BY_IDS} from "../../graphql/tt-approvals.queries"; +import {selectAuthLevel, selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; +import {HasRbacAccess} from "../rbac-wrapper/rbac-wrapper.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - currentUser: selectCurrentUser, - authLevel: selectAuthLevel, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, + authLevel: selectAuthLevel, }); export function TtApproveButton({ - bodyshop, - currentUser, - selectedTickets, - disabled, - authLevel, - loadingCallback, - completedCallback, - refetch, -}) { - const { t } = useTranslation(); - const client = useApolloClient(); + bodyshop, + currentUser, + selectedTickets, + disabled, + authLevel, + loadingCallback, + completedCallback, + refetch, + }) { + const {t} = useTranslation(); + const client = useApolloClient(); - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(false); - const handleQbxml = async () => { - setLoading(true); - try { - const { data } = await client.query({ - query: QUERY_TT_APPROVALS_BY_IDS, - variables: { ids: selectedTickets }, - }); + const handleQbxml = async () => { + setLoading(true); + try { + const {data} = await client.query({ + query: QUERY_TT_APPROVALS_BY_IDS, + variables: {ids: selectedTickets}, + }); - const insertResponse = await client.mutate({ - mutation: INSERT_TIME_TICKET_AND_APPROVE, - variables: { - timeTicketInput: data.tt_approval_queue.map((tta) => ({ - ..._.omit(tta, ["id", "__typename"]), - ttapprovalqueueid: tta.id, - })), - approvalIds: selectedTickets, - approvalUpdate: { - approved_at: moment(), - approved_by: currentUser.email, - }, - }, - }); - if (insertResponse.errors) { - notification.open({ - type: "error", - message: t("timetickets.errors.creating", { - message: JSON.stringify(insertResponse.errors), - }), - }); - } else { - notification.open({ - type: "success", - message: t("timetickets.successes.created"), - }); - } - } catch (error) { - notification.open({ - type: "error", - message: t("timetickets.errors.creating", { - message: error.message, - }), - }); - } finally { - setLoading(false); - } + const insertResponse = await client.mutate({ + mutation: INSERT_TIME_TICKET_AND_APPROVE, + variables: { + timeTicketInput: data.tt_approval_queue.map((tta) => ({ + ..._.omit(tta, ["id", "__typename"]), + ttapprovalqueueid: tta.id, + })), + approvalIds: selectedTickets, + approvalUpdate: { + approved_at: day(), + approved_by: currentUser.email, + }, + }, + }); + if (insertResponse.errors) { + notification.open({ + type: "error", + message: t("timetickets.errors.creating", { + message: JSON.stringify(insertResponse.errors), + }), + }); + } else { + notification.open({ + type: "success", + message: t("timetickets.successes.created"), + }); + } + } catch (error) { + notification.open({ + type: "error", + message: t("timetickets.errors.creating", { + message: error.message, + }), + }); + } finally { + setLoading(false); + } - // if (!!completedCallback) completedCallback([]); - // if (!!loadingCallback) loadingCallback(false); - }; + // if (!!completedCallback) completedCallback([]); + // if (!!loadingCallback) loadingCallback(false); + }; - return ( - - ); + return ( + + ); } export default connect(mapStateToProps, null)(TtApproveButton); diff --git a/client/src/components/update-alert/update-alert.component.jsx b/client/src/components/update-alert/update-alert.component.jsx index f0b11520e..7261a2f22 100644 --- a/client/src/components/update-alert/update-alert.component.jsx +++ b/client/src/components/update-alert/update-alert.component.jsx @@ -1,78 +1,78 @@ -import { Alert, Button, Col, Row, Space } from "antd"; +import {Alert, Button, Col, Row, Space} from "antd"; import i18n from "i18next"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectUpdateAvailable } from "../../redux/application/application.selectors"; -import { AlertOutlined } from "@ant-design/icons"; -import { useTranslation } from "react-i18next"; -import { setUpdateAvailable } from "../../redux/application/application.actions"; -import { store } from "../../redux/store"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectUpdateAvailable} from "../../redux/application/application.selectors"; +import {AlertOutlined} from "@ant-design/icons"; +import {useTranslation} from "react-i18next"; +import {setUpdateAvailable} from "../../redux/application/application.actions"; +import {store} from "../../redux/store"; import * as serviceWorkerRegistration from "../../serviceWorkerRegistration"; let globalRegistration; const mapStateToProps = createStructuredSelector({ - updateAvailable: selectUpdateAvailable, + updateAvailable: selectUpdateAvailable, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(UpdateAlert); -export function UpdateAlert({ updateAvailable }) { - const { t } = useTranslation(); - if (!updateAvailable) return null; - return ( - } - description={ - - - {t("general.messages.newversionmessage")} - - - - - - - - - } - closable={false} - type="warning" - /> - ); +export function UpdateAlert({updateAvailable}) { + const {t} = useTranslation(); + if (!updateAvailable) return null; + return ( + } + description={ + + + {t("general.messages.newversionmessage")} + + + + + + + + + } + closable={false} + type="warning" + /> + ); } const onServiceWorkerUpdate = (registration) => { - console.log("onServiceWorkerUpdate", registration); - globalRegistration = registration; - store.dispatch(setUpdateAvailable(true)); + console.log("onServiceWorkerUpdate", registration); + globalRegistration = registration; + store.dispatch(setUpdateAvailable(true)); }; -serviceWorkerRegistration.register({ onUpdate: onServiceWorkerUpdate }); +serviceWorkerRegistration.register({onUpdate: onServiceWorkerUpdate}); diff --git a/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss b/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss index 2425df8c1..b446ab9b0 100644 --- a/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss +++ b/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss @@ -1,29 +1,31 @@ .login-container { - display: flex; - align-items: center; - flex-direction: column; - padding: 2rem; - form { - width: 75vw; - max-width: 20rem; - } + display: flex; + align-items: center; + flex-direction: column; + padding: 2rem; + + form { + width: 75vw; + max-width: 20rem; } - - .login-logo-container { - display: flex; - align-items: center; - margin-bottom: 2rem; - h1 { - text-align: center; - margin: 1rem; - } - } - - //Required as it is position inside form. - .login-btn { - margin: 1.5rem 0rem; - position: relative; - left: 50%; - transform: translate(-50%, 0); +} + +.login-logo-container { + display: flex; + align-items: center; + margin-bottom: 2rem; + + h1 { + text-align: center; + margin: 1rem; } +} + +//Required as it is position inside form. +.login-btn { + margin: 1.5rem 0rem; + position: relative; + left: 50%; + transform: translate(-50%, 0); +} \ No newline at end of file diff --git a/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx b/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx index b0e7a1b7a..334331177 100644 --- a/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx +++ b/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx @@ -1,92 +1,90 @@ -import { Button, Form, Input, Result, Typography } from "antd"; +import {Button, Form, Input, Result, Typography} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import ImEXOnlineLogo from "../../assets/logo192.png"; -import { - sendPasswordReset, - sendPasswordResetAgain, -} from "../../redux/user/user.actions"; -import { selectPasswordReset } from "../../redux/user/user.selectors"; +import {sendPasswordReset, sendPasswordResetAgain,} from "../../redux/user/user.actions"; +import {selectPasswordReset} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import "./user-request-pw-reset.styles.scss"; const mapStateToProps = createStructuredSelector({ - passwordReset: selectPasswordReset, + passwordReset: selectPasswordReset, }); const mapDispatchToProps = (dispatch) => ({ - sendPasswordReset: (email) => dispatch(sendPasswordReset(email)), - sendPasswordResetAgain: (email) => dispatch(sendPasswordResetAgain(email)), + sendPasswordReset: (email) => dispatch(sendPasswordReset(email)), + sendPasswordResetAgain: (email) => dispatch(sendPasswordResetAgain(email)), }); export function UserRequestResetPw({ - passwordReset, - sendPasswordReset, - sendPasswordResetAgain, -}) { - const handleFinish = (values) => { - try { - sendPasswordReset(values.email); - } catch (error) { - console.log(error); - } - }; + passwordReset, + sendPasswordReset, + sendPasswordResetAgain, + }) { + const handleFinish = (values) => { + try { + sendPasswordReset(values.email); + } catch (error) { + console.log(error); + } + }; + + const {t} = useTranslation(); + if (passwordReset.success) + return ( + sendPasswordResetAgain(passwordReset.email)} + loading={passwordReset.loading} + > + {t("general.labels.sendagain")} + , + ]} + /> + ); - const { t } = useTranslation(); - if (passwordReset.success) return ( - sendPasswordResetAgain(passwordReset.email)} - loading={passwordReset.loading} - > - {t("general.labels.sendagain")} - , - ]} - /> +
    +
    + Rome Online + {t("titles.app")} +
    + {t("titles.resetpassword")} + +
    + + + + {passwordReset.error ? ( + + ) : null} + + +
    ); - - return ( -
    -
    - Rome Online - {t("titles.app")} -
    - {t("titles.resetpassword")} - -
    - - - - {passwordReset.error ? ( - - ) : null} - - -
    - ); } + export default connect(mapStateToProps, mapDispatchToProps)(UserRequestResetPw); diff --git a/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx index e0e0523d2..cedff4686 100644 --- a/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx +++ b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx @@ -1,138 +1,139 @@ -import { LockOutlined } from "@ant-design/icons"; -import { Button, Form, Input, Result, Typography } from "antd"; -import React, { useState, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {LockOutlined} from "@ant-design/icons"; +import {Button, Form, Input, Result, Typography} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import ImEXOnlineLogo from "../../assets/logo192.png"; -import { auth } from "../../firebase/firebase.utils"; -import { checkActionCode } from "@firebase/auth"; -import { validatePasswordResetStart } from "../../redux/user/user.actions"; -import { selectPasswordReset } from "../../redux/user/user.selectors"; +import {auth} from "../../firebase/firebase.utils"; +import {checkActionCode} from "@firebase/auth"; +import {validatePasswordResetStart} from "../../redux/user/user.actions"; +import {selectPasswordReset} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import "./user-validate-pw-reset.styles.scss"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; const mapStateToProps = createStructuredSelector({ - passwordReset: selectPasswordReset, + passwordReset: selectPasswordReset, }); const mapDispatchToProps = (dispatch) => ({ - validatePasswordReset: (emailAndPin) => - dispatch(validatePasswordResetStart(emailAndPin)), + validatePasswordReset: (emailAndPin) => + dispatch(validatePasswordResetStart(emailAndPin)), }); export function UserValidatePwReset({ - passwordReset, - validatePasswordReset, - oobCode, -}) { - const { t } = useTranslation(); - const [codeValid, setCodeValid] = useState({ loading: true }); - const handleFinish = (values) => { - validatePasswordReset({ code: oobCode, password: values.password }); - }; + passwordReset, + validatePasswordReset, + oobCode, + }) { + const {t} = useTranslation(); + const [codeValid, setCodeValid] = useState({loading: true}); + const handleFinish = (values) => { + validatePasswordReset({code: oobCode, password: values.password}); + }; - useEffect(() => { - async function checkCodeValid() { - try { - const codeValid = await checkActionCode(auth, oobCode); + useEffect(() => { + async function checkCodeValid() { + try { + const codeValid = await checkActionCode(auth, oobCode); - setCodeValid({ loading: false, ...codeValid }); - } catch (error) { - setCodeValid({ loading: false, ...error }); - } - } - checkCodeValid(); - }, [oobCode]); + setCodeValid({loading: false, ...codeValid}); + } catch (error) { + setCodeValid({loading: false, ...error}); + } + } - if (codeValid.loading) return ; + checkCodeValid(); + }, [oobCode]); + + if (codeValid.loading) return ; + + if (codeValid.code) + return ( +
    + +
    + ); + + if (passwordReset.success) + return ( + + + , + ]} + /> + ); - if (codeValid.code) return ( -
    - -
    +
    +
    + ImEX Online + {t("titles.app")} +
    + + {t("titles.resetpasswordvalidate")} + + +
    + + } + type="password" + placeholder={t("general.labels.password")} + /> + + ({ + validator(rule, value) { + if (!value || getFieldValue("password") === value) { + return Promise.resolve(); + } + return Promise.reject(t("general.labels.passwordsdonotmatch")); + }, + }), + ]} + > + } + type="password" + placeholder={t("general.labels.password")} + /> + + {passwordReset.error ? ( + + ) : null} + + +
    ); - - if (passwordReset.success) - return ( - - - , - ]} - /> - ); - - return ( -
    -
    - ImEX Online - {t("titles.app")} -
    - - {t("titles.resetpasswordvalidate")} - - -
    - - } - type="password" - placeholder={t("general.labels.password")} - /> - - ({ - validator(rule, value) { - if (!value || getFieldValue("password") === value) { - return Promise.resolve(); - } - return Promise.reject(t("general.labels.passwordsdonotmatch")); - }, - }), - ]} - > - } - type="password" - placeholder={t("general.labels.password")} - /> - - {passwordReset.error ? ( - - ) : null} - - -
    - ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(UserValidatePwReset); diff --git a/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss index 60dd3a986..540b1e453 100644 --- a/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss +++ b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss @@ -1,29 +1,31 @@ .reset-container { - display: flex; - align-items: center; - flex-direction: column; - padding: 2rem; - form { - width: 75vw; - max-width: 20rem; - } + display: flex; + align-items: center; + flex-direction: column; + padding: 2rem; + + form { + width: 75vw; + max-width: 20rem; } - - .reset-logo-container { - display: flex; - align-items: center; - margin-bottom: 2rem; - h1 { - text-align: center; - margin: 1rem; - } - } - - //Required as it is position inside form. - .reset-btn { - margin: 1.5rem 0rem; - position: relative; - left: 50%; - transform: translate(-50%, 0); +} + +.reset-logo-container { + display: flex; + align-items: center; + margin-bottom: 2rem; + + h1 { + text-align: center; + margin: 1rem; } +} + +//Required as it is position inside form. +.reset-btn { + margin: 1.5rem 0rem; + position: relative; + left: 50%; + transform: translate(-50%, 0); +} \ No newline at end of file diff --git a/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx b/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx index 6ec1c3853..4ebc5484b 100644 --- a/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx +++ b/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx @@ -1,147 +1,147 @@ -import { Form, Input } from "antd"; +import {Form, Input} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; -export default function VehicleDetailFormComponent({ form, loading }) { - const { t } = useTranslation(); +export default function VehicleDetailFormComponent({form, loading}) { + const {t} = useTranslation(); - return ( -
    - + return ( +
    + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + - - - + + + - - - - - - + + + + + + - - - - - - - - - - -
    - ); + + + + + + + + + + +
    + ); } diff --git a/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx b/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx index 9fbe45ed7..2b48e844d 100644 --- a/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx +++ b/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx @@ -1,108 +1,112 @@ -import React, { useState } from "react"; -import { Button, Form, notification, PageHeader, Popconfirm } from "antd"; -import { useMutation } from "@apollo/client"; +import React, {useState} from "react"; +import {Button, Form, notification, Popconfirm} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; +import {useMutation} from "@apollo/client"; import VehicleDetailFormComponent from "./vehicle-detail-form.component"; -import { useTranslation } from "react-i18next"; -import moment from "moment"; -import { DELETE_VEHICLE, UPDATE_VEHICLE } from "../../graphql/vehicles.queries"; -import { useHistory } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import dayjs from "../../utils/day"; +import {DELETE_VEHICLE, UPDATE_VEHICLE} from "../../graphql/vehicles.queries"; +import {useNavigate} from "react-router-dom"; -function VehicleDetailFormContainer({ vehicle, refetch }) { - const { t } = useTranslation(); - const [updateVehicle] = useMutation(UPDATE_VEHICLE); - const [deleteVehicle] = useMutation(DELETE_VEHICLE); - const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const history = useHistory(); +function VehicleDetailFormContainer({vehicle, refetch}) { + const {t} = useTranslation(); + const [updateVehicle] = useMutation(UPDATE_VEHICLE); + const [deleteVehicle] = useMutation(DELETE_VEHICLE); + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const history = useNavigate(); - const handleDelete = async () => { - setLoading(true); - const result = await deleteVehicle({ - variables: { id: vehicle.id }, - }); - console.log(result); - if (result.errors) { - notification["error"]({ - message: t("vehicles.errors.deleting", { - error: JSON.stringify(result.errors), - }), - }); - setLoading(false); - } else { - notification["success"]({ - message: t("vehicles.successes.delete"), - }); - setLoading(false); - history.push(`/manage/vehicles`); - } - }; + const handleDelete = async () => { + setLoading(true); + const result = await deleteVehicle({ + variables: {id: vehicle.id}, + }); + console.log(result); + if (result.errors) { + notification["error"]({ + message: t("vehicles.errors.deleting", { + error: JSON.stringify(result.errors), + }), + }); + setLoading(false); + } else { + notification["success"]({ + message: t("vehicles.successes.delete"), + }); + setLoading(false); + history(`/manage/vehicles`); + } + }; - const handleFinish = async (values) => { - setLoading(true); - const result = await updateVehicle({ - variables: { vehId: vehicle.id, vehicle: values }, - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await updateVehicle({ + variables: {vehId: vehicle.id, vehicle: values}, + }); - if (!!result.errors) { - notification["error"]({ - message: t("vehicles.errors.saving", { - message: JSON.stringify(result.errors), - }), - }); - } + if (!!result.errors) { + notification["error"]({ + message: t("vehicles.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + } - notification["success"]({ - message: t("vehicles.successes.save"), - }); + notification["success"]({ + message: t("vehicles.successes.save"), + }); - if (refetch) await refetch(); - form.resetFields(); - form.resetFields(); - setLoading(false); - }; + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); + setLoading(false); + }; - return ( - <> - - + , + , + ]} + /> +
    - {t("general.actions.delete")} - - , - , - ]} - /> - - - - - ); + + + + ); } export default VehicleDetailFormContainer; diff --git a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx index 403d223bf..4237ade41 100644 --- a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx +++ b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx @@ -1,128 +1,128 @@ -import { Card, Table } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {Card, Table} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { alphaSort, statusSort } from "../../utils/sorters"; +import {alphaSort, statusSort} from "../../utils/sorters"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import VehicleDetailUpdateJobsComponent from "../vehicle-detail-update-jobs/vehicle-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { - const { t } = useTranslation(); - const [selectedJobs, setSelectedJobs] = useState([]); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); +export function VehicleDetailJobsComponent({vehicle, bodyshop}) { + const {t} = useTranslation(); + const [selectedJobs, setSelectedJobs] = useState([]); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - ellipsis: true, - render: (text, record) => ( - - {record.ro_number || t("general.labels.na")} - - ), - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - render: (text, record) => ( - - - - ), - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - }, + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + ellipsis: true, + render: (text, record) => ( + + {record.ro_number || t("general.labels.na")} + + ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + render: (text, record) => ( + + + + ), + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + }, - { - title: t("jobs.fields.clm_total"), - dataIndex: "clm_total", - key: "clm_total", - render: (text, record) => ( - {record.clm_total} - ), - sorter: (a, b) => a.clm_total - b.clm_total, - sortOrder: - state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, - }, - ]; + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + render: (text, record) => ( + {record.clm_total} + ), + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, + }, + ]; - return ( - - } - > -
    { - setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); - }, - onSelectAll: (selected, selectedRows, changeRows) => { - setSelectedJobs( - selectedRows - ? selectedRows - .filter((i) => - bodyshop.md_ro_statuses.active_statuses.includes(i.status) - ) - .map((i) => i.id) - : [] - ); - }, - selectedRowKeys: selectedJobs, - getCheckboxProps: (record) => ({ - disabled: bodyshop.md_ro_statuses.active_statuses - ? !bodyshop.md_ro_statuses.active_statuses.includes(record.status) - : true, - }), - }} - /> - - ); + return ( + + } + > +
    { + setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedJobs( + selectedRows + ? selectedRows + .filter((i) => + bodyshop.md_ro_statuses.active_statuses.includes(i.status) + ) + .map((i) => i.id) + : [] + ); + }, + selectedRowKeys: selectedJobs, + getCheckboxProps: (record) => ({ + disabled: bodyshop.md_ro_statuses.active_statuses + ? !bodyshop.md_ro_statuses.active_statuses.includes(record.status) + : true, + }), + }} + /> + + ); } export default connect(mapStateToProps, null)(VehicleDetailJobsComponent); diff --git a/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx b/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx index 0c1994869..5fd4e5011 100644 --- a/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx +++ b/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx @@ -1,47 +1,47 @@ import React from "react"; -import { Button, notification } from "antd"; -import { useTranslation } from "react-i18next"; -import { useMutation } from "@apollo/client"; -import { UPDATE_JOBS } from "../../graphql/jobs.queries"; -import { logImEXEvent } from "../../firebase/firebase.utils"; +import {Button, notification} from "antd"; +import {useTranslation} from "react-i18next"; +import {useMutation} from "@apollo/client"; +import {UPDATE_JOBS} from "../../graphql/jobs.queries"; +import {logImEXEvent} from "../../firebase/firebase.utils"; export default function VehicleDetailUpdateJobsComponent({ - vehicle, - selectedJobs, - disabled, -}) { - const { t } = useTranslation(); - const [updateJobs] = useMutation(UPDATE_JOBS); - const handlecClick = (e) => { - logImEXEvent("vehicle_update_jobs"); + vehicle, + selectedJobs, + disabled, + }) { + const {t} = useTranslation(); + const [updateJobs] = useMutation(UPDATE_JOBS); + const handlecClick = (e) => { + logImEXEvent("vehicle_update_jobs"); - updateJobs({ - variables: { - jobIds: selectedJobs, - fields: { - plate_no: vehicle["plate_no"], - plate_st: vehicle["plate_st"], - v_vin: vehicle["v_vin"], - v_model_yr: vehicle["v_model_yr"], - v_model_desc: vehicle["v_model_desc"], - v_make_desc: vehicle["v_make_desc"], - v_color: vehicle["v_color"], - }, - }, - }) - .then((response) => { - notification["success"]({ message: t("jobs.successes.updated") }); - }) - .catch((error) => { - notification["error"]({ - message: t("jobs.errors.updating", { error: JSON.stringify(error) }), - }); - }); - }; + updateJobs({ + variables: { + jobIds: selectedJobs, + fields: { + plate_no: vehicle["plate_no"], + plate_st: vehicle["plate_st"], + v_vin: vehicle["v_vin"], + v_model_yr: vehicle["v_model_yr"], + v_model_desc: vehicle["v_model_desc"], + v_make_desc: vehicle["v_make_desc"], + v_color: vehicle["v_color"], + }, + }, + }) + .then((response) => { + notification["success"]({message: t("jobs.successes.updated")}); + }) + .catch((error) => { + notification["error"]({ + message: t("jobs.errors.updating", {error: JSON.stringify(error)}), + }); + }); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx b/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx index 7cc506ed3..fa3266100 100644 --- a/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx +++ b/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx @@ -1,95 +1,95 @@ -import { LoadingOutlined } from "@ant-design/icons"; -import { useLazyQuery } from "@apollo/client"; -import { Empty, Select } from "antd"; +import {LoadingOutlined} from "@ant-design/icons"; +import {useLazyQuery} from "@apollo/client"; +import {Empty, Select} from "antd"; import _ from "lodash"; -import React, { forwardRef, useEffect, useState } from "react"; +import React, {forwardRef, useEffect, useState} from "react"; import { - SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE, - SEARCH_VEHICLES_FOR_AUTOCOMPLETE, + SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE, + SEARCH_VEHICLES_FOR_AUTOCOMPLETE, } from "../../graphql/vehicles.queries"; import AlertComponent from "../alert/alert.component"; -const { Option } = Select; +const {Option} = Select; -const VehicleSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => { - const [callSearch, { loading, error, data }] = useLazyQuery( - SEARCH_VEHICLES_FOR_AUTOCOMPLETE - ); +const VehicleSearchSelect = ({value, onChange, onBlur, disabled}, ref) => { + const [callSearch, {loading, error, data}] = useLazyQuery( + SEARCH_VEHICLES_FOR_AUTOCOMPLETE + ); - const [callIdSearch, { loading: idLoading, error: idError, data: idData }] = - useLazyQuery(SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE); + const [callIdSearch, {loading: idLoading, error: idError, data: idData}] = + useLazyQuery(SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE); - const executeSearch = (v) => { - if (v && v.variables?.search !== "" && v.variables.search.length >= 2) - callSearch(v); - }; - const debouncedExecuteSearch = _.debounce(executeSearch, 500); + const executeSearch = (v) => { + if (v && v.variables?.search !== "" && v.variables.search.length >= 2) + callSearch(v); + }; + const debouncedExecuteSearch = _.debounce(executeSearch, 500); - const handleSearch = (value) => { - debouncedExecuteSearch({ variables: { search: value } }); - }; + const handleSearch = (value) => { + debouncedExecuteSearch({variables: {search: value}}); + }; - const [option, setOption] = useState(value); + const [option, setOption] = useState(value); - useEffect(() => { - if (value === option && value) { - callIdSearch({ variables: { id: value } }); - } - }, [value, option, callIdSearch]); + useEffect(() => { + if (value === option && value) { + callIdSearch({variables: {id: value}}); + } + }, [value, option, callIdSearch]); - // useEffect(() => { - // if (value !== option && onChange) { - // onChange(option); - // } - // }, [value, option, onChange]); + // useEffect(() => { + // if (value !== option && onChange) { + // onChange(option); + // } + // }, [value, option, onChange]); - const handleSelect = (value) => { - setOption(value); - if (value !== option && onChange) { - onChange(value); - } - }; + const handleSelect = (value) => { + setOption(value); + if (value !== option && onChange) { + onChange(value); + } + }; - const theOptions = [ - ...(idData && idData.vehicles_by_pk ? [idData.vehicles_by_pk] : []), - ...(data && data.search_vehicles ? data.search_vehicles : []), - ]; + const theOptions = [ + ...(idData && idData.vehicles_by_pk ? [idData.vehicles_by_pk] : []), + ...(data && data.search_vehicles ? data.search_vehicles : []), + ]; - return ( -
    - - {idLoading || loading ? : null} - {error ? : null} - {idError ? ( - - ) : null} -
    - ); + return ( +
    + + {idLoading || loading ? : null} + {error ? : null} + {idError ? ( + + ) : null} +
    + ); }; export default forwardRef(VehicleSearchSelect); diff --git a/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx b/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx index 3005c7a34..d045295ea 100644 --- a/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx +++ b/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx @@ -1,86 +1,86 @@ -import { Button, Col, Descriptions, Popover, Row, Tag } from "antd"; +import {Button, Col, Descriptions, Popover, Row, Tag} from "antd"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; -export default function VehicleTagPopoverComponent({ job }) { - const { t } = useTranslation(); - if (!job.vehicle) return null; +export default function VehicleTagPopoverComponent({job}) { + const {t} = useTranslation(); + if (!job.vehicle) return null; - const content = ( -
    - -
    - - - {`${job.v_model_yr || t("general.labels.na")} ${ - job.v_color || "" - } + const content = ( +
    + +
    + + + {`${job.v_model_yr || t("general.labels.na")} ${ + job.v_color || "" + } ${job.v_make_desc || t("general.labels.na")} ${job.v_model_desc || t("general.labels.na")}`} - + - - {`${job.plate_no || t("general.labels.na")}`} - - - {`${job.plate_st || t("general.labels.na")}`} - - - - {`${job.v_vin || t("general.labels.na")}`} - - - - - - - - {`${job.vehicle.v_model_yr || t("general.labels.na")} + + {`${job.plate_no || t("general.labels.na")}`} + + + {`${job.plate_st || t("general.labels.na")}`} + + + + {`${job.v_vin || t("general.labels.na")}`} + + + + + + + + {`${job.vehicle.v_model_yr || t("general.labels.na")} ${job.vehicle.v_make_desc || t("general.labels.na")} ${job.vehicle.v_model_desc || t("general.labels.na")}`} - + - - {`${job.vehicle.plate_no || t("general.labels.na")}`} - - - {`${job.vehicle.plate_st || t("general.labels.na")}`} - - - {`${ - job.vehicle.v_vin || t("general.labels.na") - }`} - - - - - - - - - ); + + {`${job.vehicle.plate_no || t("general.labels.na")}`} + + + {`${job.vehicle.plate_st || t("general.labels.na")}`} + + + {`${ + job.vehicle.v_vin || t("general.labels.na") + }`} + + + + + + + + + ); - return ( - - - {job.vehicleid ? ( - - {`${job.v_model_yr || ""} ${job.v_color || ""} + return ( + + + {job.vehicleid ? ( + + {`${job.v_model_yr || ""} ${job.v_color || ""} ${job.v_make_desc || ""} ${job.v_model_desc || ""} | ${job.plate_no || ""}`} - - ) : ( - + + ) : ( + {`${job.v_model_yr || ""} ${job.v_make_desc || ""} ${job.v_model_desc || ""} | ${job.plate_no || ""}`} - )} - - - ); + )} + + + ); } diff --git a/client/src/components/vehicle-vin-display/vehicle-vin-display.component.jsx b/client/src/components/vehicle-vin-display/vehicle-vin-display.component.jsx index cef554562..d216e2a53 100644 --- a/client/src/components/vehicle-vin-display/vehicle-vin-display.component.jsx +++ b/client/src/components/vehicle-vin-display/vehicle-vin-display.component.jsx @@ -1,18 +1,18 @@ import React from "react"; -export default function VehicleVinDisplay({ children }) { - if (!children) return null; - - if (typeof children !== "string" || children.length !== 17) return children; - const vin = children.trim(); +export default function VehicleVinDisplay({children}) { + if (!children) return null; - const first = vin.substring(0, 9); - const second = vin.substring(9, 17); + if (typeof children !== "string" || children.length !== 17) return children; + const vin = children.trim(); - return ( - <> - {first} - {second} - - ); + const first = vin.substring(0, 9); + const second = vin.substring(9, 17); + + return ( + <> + {first} + {second} + + ); } diff --git a/client/src/components/vehicles-list/vehicles-list.component.jsx b/client/src/components/vehicles-list/vehicles-list.component.jsx index bb1a97183..82c1123a4 100644 --- a/client/src/components/vehicles-list/vehicles-list.component.jsx +++ b/client/src/components/vehicles-list/vehicles-list.component.jsx @@ -1,122 +1,123 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link, useHistory, useLocation } from "react-router-dom"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link, useLocation, useNavigate} from "react-router-dom"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; import {pageLimit} from "../../utils/config"; + export default function VehiclesListComponent({ - loading, - vehicles, - total, - refetch, -}) { - const search = queryString.parse(useLocation().search); - const { - page, - //sortcolumn, sortorder, - } = search; - const history = useHistory(); + loading, + vehicles, + total, + refetch, + }) { + const search = queryString.parse(useLocation().search); + const { + page, + //sortcolumn, sortorder, + } = search; + const history = useNavigate(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - const columns = [ - { - title: t("vehicles.fields.v_vin"), - dataIndex: "v_vin", - key: "v_vin", - render: (text, record) => ( - - {record.v_vin || "N/A"} - - ), - }, - { - title: t("vehicles.fields.description"), - dataIndex: "description", - key: "description", - render: (text, record) => { - return ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - } ${record.v_color || ""}`} - ); - }, - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate", - key: "plate", - render: (text, record) => { - return ( - {`${record.plate_st || ""} | ${record.plate_no || ""}`} - ); - }, - }, - ]; + const columns = [ + { + title: t("vehicles.fields.v_vin"), + dataIndex: "v_vin", + key: "v_vin", + render: (text, record) => ( + + {record.v_vin || "N/A"} + + ), + }, + { + title: t("vehicles.fields.description"), + dataIndex: "description", + key: "description", + render: (text, record) => { + return ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + } ${record.v_color || ""}`} + ); + }, + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate", + key: "plate", + render: (text, record) => { + return ( + {`${record.plate_st || ""} | ${record.plate_no || ""}`} + ); + }, + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - search.sortcolumn = sorter.columnKey; - search.sortorder = sorter.order; - history.push({ search: queryString.stringify(search) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history({search: queryString.stringify(search)}); + }; - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - + + )} + + { + search.search = value; + history({search: queryString.stringify(search)}); + }} + enterButton + /> + + } + > +
    - {t("general.actions.clear")} - - - )} - - { - search.search = value; - history.push({ search: queryString.stringify(search) }); - }} - enterButton - /> - - } - > -
    - - ); + columns={columns} + rowKey="id" + scroll={{x: true}} + dataSource={vehicles} + onChange={handleTableChange} + /> + + ); } diff --git a/client/src/components/vehicles-list/vehicles-list.container.jsx b/client/src/components/vehicles-list/vehicles-list.container.jsx index 2e85236f8..4d25f369d 100644 --- a/client/src/components/vehicles-list/vehicles-list.container.jsx +++ b/client/src/components/vehicles-list/vehicles-list.container.jsx @@ -1,45 +1,45 @@ import React from "react"; import VehiclesListComponent from "./vehicles-list.component"; -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import AlertComponent from "../alert/alert.component"; -import { QUERY_ALL_VEHICLES_PAGINATED } from "../../graphql/vehicles.queries"; +import {QUERY_ALL_VEHICLES_PAGINATED} from "../../graphql/vehicles.queries"; import queryString from "query-string"; -import { useLocation } from "react-router-dom"; +import {useLocation} from "react-router-dom"; import {pageLimit} from "../../utils/config"; export default function VehiclesListContainer() { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, search } = searchParams; + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, search} = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_VEHICLES_PAGINATED, - { - variables: { - search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "created_at"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_VEHICLES_PAGINATED, + { + variables: { + search: search || "", + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "created_at"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } + ); - if (error) return ; - return ( - - ); + if (error) return ; + return ( + + ); } diff --git a/client/src/components/vendor-search-select/vendor-search-select.component.jsx b/client/src/components/vendor-search-select/vendor-search-select.component.jsx index 6537d0ded..aaf0626ed 100644 --- a/client/src/components/vendor-search-select/vendor-search-select.component.jsx +++ b/client/src/components/vendor-search-select/vendor-search-select.component.jsx @@ -1,89 +1,92 @@ -import { HeartOutlined } from "@ant-design/icons"; -import { Select, Space, Tag } from "antd"; -import React, { forwardRef, useEffect, useState } from "react"; +import {HeartOutlined} from "@ant-design/icons"; +import {Select, Space, Tag} from "antd"; +import React, {forwardRef, useEffect, useState} from "react"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; -const { Option } = Select; + +const {Option} = Select; //To be used as a form element only. const VendorSearchSelect = ( - { value, onChange, options, onSelect, disabled, preferredMake, showPhone }, - ref + {value, onChange, options, onSelect, disabled, preferredMake, showPhone}, + ref ) => { - const [option, setOption] = useState(value); + const [option, setOption] = useState(value); - useEffect(() => { - if (value !== option && onChange) { - onChange(option); - } - }, [value, option, onChange]); + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); - const favorites = - preferredMake && options - ? options.filter( - (o) => - o.favorite.filter( - (f) => f.toLowerCase() === preferredMake.toLowerCase() - ).length > 0 - ) - : []; + const favorites = + preferredMake && options + ? options.filter( + (o) => + o.favorite.filter( + (f) => f.toLowerCase() === preferredMake.toLowerCase() + ).length > 0 + ) + : []; - return ( - + {favorites + ? favorites.map((o) => ( + + )) + : null} + {options + ? options.map((o) => ( + - )) - : null} - - ); + + {o.phone && showPhone && ( + {o.phone} + )} + {o.discount && o.discount !== 0 ? ( + {`${o.discount * 100}%`} + ) : null} + + + + + )) + : null} + + ); }; export default forwardRef(VendorSearchSelect); diff --git a/client/src/components/vendors-form/vendors-form.component.jsx b/client/src/components/vendors-form/vendors-form.component.jsx index 38571fb92..78c3d56de 100644 --- a/client/src/components/vendors-form/vendors-form.component.jsx +++ b/client/src/components/vendors-form/vendors-form.component.jsx @@ -1,262 +1,257 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useApolloClient } from "@apollo/client"; -import { useTreatments } from "@splitsoftware/splitio-react"; -import { - Button, - Divider, - Form, - Input, - InputNumber, - PageHeader, - Space, - Switch, -} from "antd"; +import {DeleteFilled} from "@ant-design/icons"; +import {useApolloClient} from "@apollo/client"; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; +import {Button, Divider, Form, Input, InputNumber, Space, Switch,} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { CHECK_VENDOR_NAME } from "../../graphql/vendors.queries"; +import {useTranslation} from "react-i18next"; +import {CHECK_VENDOR_NAME} from "../../graphql/vendors.queries"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import PhoneFormItem, { - PhoneItemFormatterValidation, -} from "../form-items-formatted/phone-form-item.component"; +import PhoneFormItem, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import VendorsPhonebookAdd from "../vendors-phonebook-add/vendors-phonebook-add.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(VendorsFormComponent); export function VendorsFormComponent({ - bodyshop, - form, - formLoading, - handleDelete, - responsibilityCenters, - selectedvendor, -}) { - const { t } = useTranslation(); - const client = useApolloClient(); - const { DmsAp } = useTreatments( - ["DmsAp"], - {}, - bodyshop && bodyshop.imexshopid - ); + bodyshop, + form, + formLoading, + handleDelete, + responsibilityCenters, + selectedvendor + }) { + const {t} = useTranslation(); + const client = useApolloClient(); - const { getFieldValue } = form; - return ( -
    - {() => form.getFieldValue("name")} - } - extra={ - - - - - - - - - } - /> - - - ({ - async validator(rule, value) { - if (value) { - const response = await client.query({ - query: CHECK_VENDOR_NAME, - variables: { - name: value, - }, - }); + const {treatments: {DmsAp}} = useSplitTreatments({ + attributes: {}, + names: ["DmsAp"], + splitKey: bodyshop && bodyshop.imexshopid + }); - if (response.data.vendors_aggregate.aggregate.count === 0) { - return Promise.resolve(); - } else if ( - response.data.vendors_aggregate.nodes.length === 1 && - response.data.vendors_aggregate.nodes[0].id === - form.getFieldValue("id") - ) { - return Promise.resolve(); - } - return Promise.reject( - t("vendors.validation.unique_vendor_name") - ); - } else { - return Promise.resolve(); + + const {getFieldValue} = form; + return ( +
    + {() => form.getFieldValue("name")} } - }, - }), - ]} - > - - + extra={ + + + + + + - - - - - PhoneItemFormatterValidation(getFieldValue, "phone"), - ]} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // - // - } - - - {DmsAp.treatment === "on" && ( - - - - )} - {t("vendors.labels.preferredmakes")} - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - + + } + /> + + + - - + ({getFieldValue}) => ({ + async validator(rule, value) { + if (value) { + const response = await client.query({ + query: CHECK_VENDOR_NAME, + variables: { + name: value, + }, + }); - { - remove(field.name); - }} - /> - - - ))} - - - -
    - ); - }} -
    -
    - ); + +
    + + + + + + PhoneItemFormatterValidation(getFieldValue, "phone"), + ]} + > + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // + // + } + + + {DmsAp.treatment === "on" && ( + + + + )} + {t("vendors.labels.preferredmakes")} + + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
    + ); + }} +
    +
    + ); } diff --git a/client/src/components/vendors-form/vendors-form.container.jsx b/client/src/components/vendors-form/vendors-form.container.jsx index af9257bf2..3b23778e0 100644 --- a/client/src/components/vendors-form/vendors-form.container.jsx +++ b/client/src/components/vendors-form/vendors-form.container.jsx @@ -1,150 +1,146 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Form, notification } from "antd"; +import {useMutation, useQuery} from "@apollo/client"; +import {Form, notification} from "antd"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { - DELETE_VENDOR, - INSERT_NEW_VENDOR, - QUERY_VENDOR_BY_ID, - UPDATE_VENDOR, -} from "../../graphql/vendors.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {DELETE_VENDOR, INSERT_NEW_VENDOR, QUERY_VENDOR_BY_ID, UPDATE_VENDOR,} from "../../graphql/vendors.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import VendorsFormComponent from "./vendors-form.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -function VendorsFormContainer({ refetch, bodyshop }) { - const history = useHistory(); - const search = queryString.parse(useLocation().search); - const { selectedvendor } = search; - const [formLoading, setFormLoading] = useState(false); - const [form] = Form.useForm(); - const { t } = useTranslation(); - const { loading, error, data } = useQuery(QUERY_VENDOR_BY_ID, { - variables: { id: selectedvendor }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: !!!selectedvendor || selectedvendor === "new", - }); - - const [updateVendor] = useMutation(UPDATE_VENDOR); - const [insertvendor] = useMutation(INSERT_NEW_VENDOR); - const [deleteVendor] = useMutation(DELETE_VENDOR); - - const handleDelete = async () => { - setFormLoading(true); - const result = await deleteVendor({ - variables: { id: selectedvendor }, - refetchQueries: ["QUERY_ALL_VENDORS"], +function VendorsFormContainer({refetch, bodyshop}) { + const history = useNavigate(); + const search = queryString.parse(useLocation().search); + const {selectedvendor} = search; + const [formLoading, setFormLoading] = useState(false); + const [form] = Form.useForm(); + const {t} = useTranslation(); + const {loading, error, data} = useQuery(QUERY_VENDOR_BY_ID, { + variables: {id: selectedvendor}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: !!!selectedvendor || selectedvendor === "new", }); - console.log(result); - if (result.errors) { - notification["error"]({ - message: t("vendors.errors.deleting"), - }); - } else { - notification["success"]({ - message: t("vendors.successes.deleted"), - }); - delete search.selectedvendor; - history.push({ search: queryString.stringify(search) }); - if (refetch) - refetch().then((r) => { - form.resetFields(); + + const [updateVendor] = useMutation(UPDATE_VENDOR); + const [insertvendor] = useMutation(INSERT_NEW_VENDOR); + const [deleteVendor] = useMutation(DELETE_VENDOR); + + const handleDelete = async () => { + setFormLoading(true); + const result = await deleteVendor({ + variables: {id: selectedvendor}, + refetchQueries: ["QUERY_ALL_VENDORS"], }); - } - - setFormLoading(false); - }; - - const handleFinish = async (values) => { - setFormLoading(true); - if (selectedvendor && selectedvendor !== "new") { - //It's a vendor to update. - const result = await updateVendor({ - variables: { id: selectedvendor, vendor: values }, - refetchQueries: ["QUERY_ALL_VENDORS", "QUERY_VENDOR_BY_ID"], - }); - - if (!result.errors) { - notification["success"]({ - message: t("vendors.successes.saved"), - }); - - if (refetch) await refetch(); - form.setFieldsValue(data.vendors_by_pk); - form.resetFields(); + console.log(result); + if (result.errors) { + notification["error"]({ + message: t("vendors.errors.deleting"), + }); + } else { + notification["success"]({ + message: t("vendors.successes.deleted"), + }); + delete search.selectedvendor; + history({search: queryString.stringify(search)}); + if (refetch) + refetch().then((r) => { + form.resetFields(); + }); + } setFormLoading(false); - } else { - notification["error"]({ - message: t("vendors.errors.saving"), - }); - console.log("error", error); - setFormLoading(false); - } - } else { - //It's a new vendor to insert. - const result = await insertvendor({ - variables: { vendorInput: [{ ...values, bodyshopid: bodyshop.id }] }, - refetchQueries: ["QUERY_ALL_VENDORS"], - }); + }; - if (!result.errors) { - notification["success"]({ - message: t("vendors.successes.saved"), - }); + const handleFinish = async (values) => { + setFormLoading(true); + if (selectedvendor && selectedvendor !== "new") { + //It's a vendor to update. + const result = await updateVendor({ + variables: {id: selectedvendor, vendor: values}, + refetchQueries: ["QUERY_ALL_VENDORS", "QUERY_VENDOR_BY_ID"], + }); - if (refetch) await refetch(); - form.resetFields(); - form.resetFields(); - delete search.selectedvendor; - history.push({ search: queryString.stringify(search) }); - setFormLoading(false); - } else { - notification["error"]({ - message: t("vendors.errors.saving"), - }); - setFormLoading(false); - } - } - }; + if (!result.errors) { + notification["success"]({ + message: t("vendors.successes.saved"), + }); - useEffect(() => { - if (data || selectedvendor === "new") form.resetFields(); - }, [data, form, selectedvendor]); + if (refetch) await refetch(); + form.setFieldsValue(data.vendors_by_pk); + form.resetFields(); - if (loading) return ; - if (error) return ; + setFormLoading(false); + } else { + notification["error"]({ + message: t("vendors.errors.saving"), + }); + console.log("error", error); + setFormLoading(false); + } + } else { + //It's a new vendor to insert. + const result = await insertvendor({ + variables: {vendorInput: [{...values, bodyshopid: bodyshop.id}]}, + refetchQueries: ["QUERY_ALL_VENDORS"], + }); - return ( -
    - {selectedvendor ? ( - - ) : ( - t("vendors.labels.noneselected") - )} - - ); + if (!result.errors) { + notification["success"]({ + message: t("vendors.successes.saved"), + }); + + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); + delete search.selectedvendor; + history({search: queryString.stringify(search)}); + setFormLoading(false); + } else { + notification["error"]({ + message: t("vendors.errors.saving"), + }); + setFormLoading(false); + } + } + }; + + useEffect(() => { + if (data || selectedvendor === "new") form.resetFields(); + }, [data, form, selectedvendor]); + + if (loading) return ; + if (error) return ; + + return ( +
    + {selectedvendor ? ( + + ) : ( + t("vendors.labels.noneselected") + )} + + ); } + export default connect(mapStateToProps, null)(VendorsFormContainer); diff --git a/client/src/components/vendors-list/vendors-list.component.jsx b/client/src/components/vendors-list/vendors-list.component.jsx index 52c2a9a94..dac09761b 100644 --- a/client/src/components/vendors-list/vendors-list.component.jsx +++ b/client/src/components/vendors-list/vendors-list.component.jsx @@ -1,111 +1,111 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, Space, Table } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Input, Space, Table} from "antd"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { useLocation } from "react-router-dom"; -import { alphaSort } from "../../utils/sorters"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {useLocation} from "react-router-dom"; +import {alphaSort} from "../../utils/sorters"; export default function VendorsListComponent({ - handleNewVendor, - loading, - handleOnRowClick, - vendors, - refetch, -}) { - const search = queryString.parse(useLocation().search); - const { selectedvendor } = search; + handleNewVendor, + loading, + handleOnRowClick, + vendors, + refetch, + }) { + const search = queryString.parse(useLocation().search); + const {selectedvendor} = search; - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const [searchText, setSearchText] = useState(""); - const { t } = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); + const [searchText, setSearchText] = useState(""); + const {t} = useTranslation(); - const columns = [ - { - title: t("vendors.fields.name"), - dataIndex: "name", - key: "name", - sorter: (a, b) => alphaSort(a.name, b.name), - sortOrder: - state.sortedInfo.columnKey === "name" && state.sortedInfo.order, - }, + const columns = [ + { + title: t("vendors.fields.name"), + dataIndex: "name", + key: "name", + sorter: (a, b) => alphaSort(a.name, b.name), + sortOrder: + state.sortedInfo.columnKey === "name" && state.sortedInfo.order, + }, - { - title: t("vendors.fields.phone"), - dataIndex: "phone", - key: "phone", - width: "10%", - sorter: (a, b) => alphaSort(a.phone, b.phone), - sortOrder: - state.sortedInfo.columnKey === "phone" && state.sortedInfo.order, - }, - { - title: t("vendors.fields.city"), - dataIndex: "city", - key: "city", - }, - ]; + { + title: t("vendors.fields.phone"), + dataIndex: "phone", + key: "phone", + width: "10%", + sorter: (a, b) => alphaSort(a.phone, b.phone), + sortOrder: + state.sortedInfo.columnKey === "phone" && state.sortedInfo.order, + }, + { + title: t("vendors.fields.city"), + dataIndex: "city", + key: "city", + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; - const filteredVendors = vendors - ? searchText === "" - ? vendors - : vendors.filter( - (j) => - (j.name || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.phone || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.city || "").toLowerCase().includes(searchText.toLowerCase()) - ) - : []; + const filteredVendors = vendors + ? searchText === "" + ? vendors + : vendors.filter( + (j) => + (j.name || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.phone || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.city || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : []; - return ( - - - - { - setSearchText(e.target.value); - }} - value={searchText} - enterButton - /> - - } - > -
    { - return { - onClick: (event) => { - handleOnRowClick(record); - }, - }; - }} - /> - - ); + return ( + + + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> + + } + > +
    { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + ); } diff --git a/client/src/components/vendors-list/vendors-list.container.jsx b/client/src/components/vendors-list/vendors-list.container.jsx index 11cfa919e..b8e466b3b 100644 --- a/client/src/components/vendors-list/vendors-list.container.jsx +++ b/client/src/components/vendors-list/vendors-list.container.jsx @@ -1,42 +1,42 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; import React from "react"; -import { useHistory, useLocation } from "react-router-dom"; +import {useLocation, useNavigate} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries"; +import {QUERY_ALL_VENDORS} from "../../graphql/vendors.queries"; import VendorsListComponent from "./vendors-list.component"; export default function VendorsListContainer() { - const { loading, error, data, refetch } = useQuery(QUERY_ALL_VENDORS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const search = queryString.parse(useLocation().search); - const history = useHistory(); + const {loading, error, data, refetch} = useQuery(QUERY_ALL_VENDORS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const search = queryString.parse(useLocation().search); + const history = useNavigate(); - const handleNewVendor = () => { - search.selectedvendor = "new"; - history.push({ search: queryString.stringify(search) }); - }; + const handleNewVendor = () => { + search.selectedvendor = "new"; + history({search: queryString.stringify(search)}); + }; - const handleOnRowClick = (record) => { - if (record) { - search.selectedvendor = record.id; - history.push({ search: queryString.stringify(search) }); - } else { - delete search.selectedvendor; - history.push({ search: queryString.stringify(search) }); - } - }; + const handleOnRowClick = (record) => { + if (record) { + search.selectedvendor = record.id; + history({search: queryString.stringify(search)}); + } else { + delete search.selectedvendor; + history({search: queryString.stringify(search)}); + } + }; - if (error) return ; - return ( - - ); + if (error) return ; + return ( + + ); } diff --git a/client/src/components/vendors-phonebook-add/vendors-phonebook-add.component.jsx b/client/src/components/vendors-phonebook-add/vendors-phonebook-add.component.jsx index bf0ea4acc..71cc9c2b6 100644 --- a/client/src/components/vendors-phonebook-add/vendors-phonebook-add.component.jsx +++ b/client/src/components/vendors-phonebook-add/vendors-phonebook-add.component.jsx @@ -1,83 +1,83 @@ -import { Button, notification } from "antd"; -import React, { useState } from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useTranslation } from "react-i18next"; -import { useMutation } from "@apollo/client"; -import { INSERT_NEW_PHONEBOOK } from "../../graphql/phonebook.queries"; +import {Button, notification} from "antd"; +import React, {useState} from "react"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {useTranslation} from "react-i18next"; +import {useMutation} from "@apollo/client"; +import {INSERT_NEW_PHONEBOOK} from "../../graphql/phonebook.queries"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(VendorsPhonebookAdd); -export function VendorsPhonebookAdd({ form, bodyshop, disabled }) { - const [loading, setLoading] = useState(false); - const [insertPhonebook] = useMutation(INSERT_NEW_PHONEBOOK); - const { t } = useTranslation(); +export function VendorsPhonebookAdd({form, bodyshop, disabled}) { + const [loading, setLoading] = useState(false); + const [insertPhonebook] = useMutation(INSERT_NEW_PHONEBOOK); + const {t} = useTranslation(); - const handleAdd = async () => { - setLoading(true); + const handleAdd = async () => { + setLoading(true); - const VendorValues = form.getFieldsValue([ - "name", - "email", - "phone", - "street1", - "street2", - "city", - "state", - "zip", - "country", - ]); + const VendorValues = form.getFieldsValue([ + "name", + "email", + "phone", + "street1", + "street2", + "city", + "state", + "zip", + "country", + ]); - const result = await insertPhonebook({ - variables: { - phonebook_entry: [ - { - //The phonebook obj, - bodyshopid: bodyshop.id, - company: VendorValues.name, - category: t("phonebook.labels.vendorcategory"), - address1: VendorValues.street1, - address2: VendorValues.street2, - city: VendorValues.city, - state: VendorValues.state, - zip: VendorValues.zip, - country: VendorValues.country, - phone1: VendorValues.phone, - email: VendorValues.email, - }, - ], - }, - }); + const result = await insertPhonebook({ + variables: { + phonebook_entry: [ + { + //The phonebook obj, + bodyshopid: bodyshop.id, + company: VendorValues.name, + category: t("phonebook.labels.vendorcategory"), + address1: VendorValues.street1, + address2: VendorValues.street2, + city: VendorValues.city, + state: VendorValues.state, + zip: VendorValues.zip, + country: VendorValues.country, + phone1: VendorValues.phone, + email: VendorValues.email, + }, + ], + }, + }); - if (result.errors) { - notification.open({ - type: "error", - message: t("phonebook.errors.adding", { - error: JSON.stringify(result.errors), - }), - }); - } else { - notification.open({ - type: "success", - message: t("phonebook.successes.added"), - }); - } - setLoading(false); - }; + if (result.errors) { + notification.open({ + type: "error", + message: t("phonebook.errors.adding", { + error: JSON.stringify(result.errors), + }), + }); + } else { + notification.open({ + type: "success", + message: t("phonebook.successes.added"), + }); + } + setLoading(false); + }; - return ( - - ); + return ( + + ); } diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 556fb4e82..49618c395 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -5,7 +5,7 @@ export const QUERY_ALL_ACTIVE_JOBS_PAGINATED = gql` $offset: Int $limit: Int $order: [jobs_order_by!] - $statuses: [String!]!, + $statuses: [String!]! $isConverted: Boolean ) { jobs( @@ -120,7 +120,9 @@ export const QUERY_PARTS_QUEUE = gql` } } jobs( - where: { _and: [{ status: { _in: $statuses }, converted: { _eq: true } }] } + where: { + _and: [{ status: { _in: $statuses }, converted: { _eq: true } }] + } offset: $offset limit: $limit order_by: $order @@ -336,6 +338,7 @@ export const QUERY_JOBS_IN_PRODUCTION = gql` category iouparent ro_number + ownerid ownr_fn ownr_ln ownr_co_nm diff --git a/client/src/index.js b/client/src/index.js index 896aadca2..ecdc66bb7 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -1,11 +1,9 @@ import * as Sentry from "@sentry/react"; -//import "antd/dist/antd.css"; -import "antd/dist/antd.less"; import Dinero from "dinero.js"; import React from "react"; -import ReactDOM from "react-dom"; +import ReactDOM from "react-dom/client"; import { Provider } from "react-redux"; -import { BrowserRouter } from "react-router-dom"; +import {createBrowserRouter, createRoutesFromElements, Route, RouterProvider} from "react-router-dom"; import { PersistGate } from "redux-persist/integration/react"; import AppContainer from "./App/App.container"; import LoadingSpinner from "./components/loading-spinner/loading-spinner.component"; @@ -14,7 +12,10 @@ import { persistor, store } from "./redux/store"; import reportWebVitals from "./reportWebVitals"; import "./translations/i18n"; import "./utils/CleanAxios"; +import { ConfigProvider } from "antd"; //import { BrowserTracing } from "@sentry/tracing"; +//import "antd/dist/antd.css"; +// import "antd/dist/antd.less"; // Dinero.defaultCurrency = "CAD"; // Dinero.globalLocale = "en-CA"; @@ -24,9 +25,7 @@ if (process.env.NODE_ENV !== "development") { Sentry.init({ dsn: "https://a6acc91c073e414196014b8484627a61@o492140.ingest.sentry.io/4504561071161344", ignoreErrors: [ - "ResizeObserver loop", - "Module specifier, 'fs' does not start", - "Module specifier, 'zlib' does not start with", + ], integrations: [ // new BrowserTracing(), @@ -47,20 +46,31 @@ if (process.env.NODE_ENV !== "development") { }); } -ReactDOM.render( - - - } - persistor={persistor} - > - - - - , - document.getElementById("root") +const router = createBrowserRouter( + createRoutesFromElements( + } /> + ) ); +function App() { + return ( + } persistor={persistor}> + + + + + ); +} + +// Used for ANTD Component Tokens +// https://ant.design/docs/react/migrate-less-variables +ReactDOM.createRoot(document.getElementById('root')).render( + + + +); + + // const onServiceWorkerUpdate = (registration) => { // console.log("onServiceWorkerUpdate", registration); diff --git a/client/src/landing/Nav0.jsx b/client/src/landing/Nav0.jsx index fdad914ed..08c3645b5 100644 --- a/client/src/landing/Nav0.jsx +++ b/client/src/landing/Nav0.jsx @@ -122,9 +122,8 @@ class Header extends React.Component { mode={isMobile ? 'inline' : 'horizontal'} defaultSelectedKeys={['sub0']} theme="dark" - > - {navChildren} - + items={navChildren} + /> diff --git a/client/src/landing/data.source.js b/client/src/landing/data.source.js index 24da34036..e44ef2e71 100644 --- a/client/src/landing/data.source.js +++ b/client/src/landing/data.source.js @@ -98,7 +98,7 @@ export const Nav00DataSource = { name: "item3", className: "header0-item", children: { - href: "/manage", + href: "/manage/", children: [ { children: i18n.t("landing.labels.managemyshop"), name: "text" }, ], diff --git a/client/src/landing/index.jsx b/client/src/landing/index.jsx index 4fcd55f19..7fbf1ec43 100644 --- a/client/src/landing/index.jsx +++ b/client/src/landing/index.jsx @@ -1,30 +1,15 @@ /* eslint no-undef: 0 */ /* eslint arrow-parens: 0 */ + import { enquireScreen } from "enquire-js"; import React from "react"; import Banner0 from "./Banner0"; -// import Content4 from "./Content4"; -//import Content0 from "./Content0"; -//import Content1 from "./Content1"; import { Banner00DataSource, - // Content40DataSource, - //Content00DataSource, - //Content10DataSource, - // Pricing11DataSource, - // Content30DataSource, - // Content120DataSource, Footer10DataSource, - // Nav00DataSource, - //Pricing20DataSource, } from "./data.source"; -// import Pricing1 from "./Pricing1"; -// import Content3 from "./Content3"; -// import Content12 from "./Content12"; import Footer1 from "./Footer1"; import "./less/antMotionStyle.less"; -// import Nav0 from "./Nav0"; -//import Pricing2 from "./Pricing2"; let isMobile; enquireScreen((b) => { @@ -38,17 +23,14 @@ export default class Home extends React.Component { super(props); this.state = { isMobile, - show: !location.port, // 如果不是 dva 2.0 请删除 + show: !location.port, }; } componentDidMount() { - // 适配手机屏幕; enquireScreen((b) => { this.setState({ isMobile: !!b }); }); - // dva 2.0 样式在组件渲染之后动态加载,导致滚动组件不生效;线上不影响; - /* 如果不是 dva 2.0 请删除 start */ if (location.port) { // 样式 build 时间在 200-300ms 之间; setTimeout(() => { @@ -57,69 +39,16 @@ export default class Home extends React.Component { }); }, 500); } - /* 如果不是 dva 2.0 请删除 end */ } render() { const children = [ - // , , - // ...(process.env.NODE_ENV !== "production" - // ? [ - // // , - // , - // , - // , - // // , - // // , - // // , - // ] - // : []), - {/* 如果不是 dva 2.0 替换成 {children} start */} {this.state.show && children} - {/* 如果不是 dva 2.0 替换成 {children} end */} ); } diff --git a/client/src/landing/less/custom.less b/client/src/landing/less/custom.less index 710e47c9d..e0382859d 100644 --- a/client/src/landing/less/custom.less +++ b/client/src/landing/less/custom.less @@ -1,4 +1,4 @@ -@import "~antd/lib/style/themes/default.less"; +//@import "~antd/lib/style/themes/default.less"; @line-color: #e9e9e9; @@ -17,8 +17,6 @@ @animate-duration: .45s; -/* 详细页图片或框框的样式; -*/ .page-shadow() { box-shadow: 0 5px 8px @shadow-color; } diff --git a/client/src/pages/accounting-payables/accounting-payables.container.jsx b/client/src/pages/accounting-payables/accounting-payables.container.jsx index b9e92d875..3280483cd 100644 --- a/client/src/pages/accounting-payables/accounting-payables.container.jsx +++ b/client/src/pages/accounting-payables/accounting-payables.container.jsx @@ -1,85 +1,83 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import AccountingPayablesTable from "../../components/accounting-payables-table/accounting-payables-table.component"; import AlertComponent from "../../components/alert/alert.component"; -import { checkPartnerStatus } from "../../components/partner-ping/partner-ping.component"; +import {checkPartnerStatus} from "../../components/partner-ping/partner-ping.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_BILLS_FOR_EXPORT } from "../../graphql/accounting.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectPartnerVersion } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_BILLS_FOR_EXPORT} from "../../graphql/accounting.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectPartnerVersion} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - partnerVersion: selectPartnerVersion, + bodyshop: selectBodyshop, + partnerVersion: selectPartnerVersion, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function AccountingPayablesContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, - partnerVersion, -}) { - const { t } = useTranslation(); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + partnerVersion, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.accounting-payables"); - setSelectedHeader("payables"); - setBreadcrumbs([ - { - link: "/manage/accounting/payables", - label: t("titles.bc.accounting-payables"), - }, - ]); - checkPartnerStatus(bodyshop, true); - }, [t, setBreadcrumbs, setSelectedHeader, bodyshop]); + useEffect(() => { + document.title = t("titles.accounting-payables"); + setSelectedHeader("payables"); + setBreadcrumbs([ + { + link: "/manage/accounting/payables", + label: t("titles.bc.accounting-payables"), + }, + ]); + checkPartnerStatus(bodyshop, true); + }, [t, setBreadcrumbs, setSelectedHeader, bodyshop]); - const { loading, error, data, refetch } = useQuery(QUERY_BILLS_FOR_EXPORT, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data, refetch} = useQuery(QUERY_BILLS_FOR_EXPORT, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (error) return ; + if (error) return ; - const noPath = - !partnerVersion?.qbpath && - !( - bodyshop && - (bodyshop.cdk_dealerid || - bodyshop.pbs_serialnumber || - bodyshop.accountingconfig.qbo) + const noPath = + !partnerVersion?.qbpath && + !( + bodyshop && + (bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.accountingconfig.qbo) + ); + + return ( +
    + + {noPath && ( + + )} + + +
    ); - - return ( -
    - - {noPath && ( - - )} - - -
    - ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingPayablesContainer); diff --git a/client/src/pages/accounting-payments/accounting-payments.container.jsx b/client/src/pages/accounting-payments/accounting-payments.container.jsx index e74194e06..aaa23540a 100644 --- a/client/src/pages/accounting-payments/accounting-payments.container.jsx +++ b/client/src/pages/accounting-payments/accounting-payments.container.jsx @@ -1,85 +1,84 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import AccountingPaymentsTable from "../../components/accounting-payments-table/accounting-payments-table.component"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_PAYMENTS_FOR_EXPORT } from "../../graphql/accounting.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_PAYMENTS_FOR_EXPORT} from "../../graphql/accounting.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { checkPartnerStatus } from "../../components/partner-ping/partner-ping.component"; -import { selectPartnerVersion } from "../../redux/application/application.selectors"; +import {checkPartnerStatus} from "../../components/partner-ping/partner-ping.component"; +import {selectPartnerVersion} from "../../redux/application/application.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - partnerVersion: selectPartnerVersion, + bodyshop: selectBodyshop, + partnerVersion: selectPartnerVersion, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); + export function AccountingPaymentsContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, - partnerVersion, -}) { - const { t } = useTranslation(); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + partnerVersion, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.accounting-payments"); - setSelectedHeader("payments"); - setBreadcrumbs([ - { - link: "/manage/accounting/payments", - label: t("titles.bc.accounting-payments"), - }, - ]); - checkPartnerStatus(bodyshop, true); - }, [t, setBreadcrumbs, setSelectedHeader, bodyshop]); + useEffect(() => { + document.title = t("titles.accounting-payments"); + setSelectedHeader("payments"); + setBreadcrumbs([ + { + link: "/manage/accounting/payments", + label: t("titles.bc.accounting-payments"), + }, + ]); + checkPartnerStatus(bodyshop, true); + }, [t, setBreadcrumbs, setSelectedHeader, bodyshop]); - const { loading, error, data, refetch } = useQuery( - QUERY_PAYMENTS_FOR_EXPORT, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - } - ); - - if (error) return ; - const noPath = - !partnerVersion?.qbpath && - !( - bodyshop && - (bodyshop.cdk_dealerid || - bodyshop.pbs_serialnumber || - bodyshop.accountingconfig.qbo) + const {loading, error, data, refetch} = useQuery( + QUERY_PAYMENTS_FOR_EXPORT, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + } + ); + + if (error) return ; + const noPath = + !partnerVersion?.qbpath && + !( + bodyshop && + (bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.accountingconfig.qbo) + ); + return ( +
    + + {noPath && ( + + )} + + +
    ); - return ( -
    - - {noPath && ( - - )} - - -
    - ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingPaymentsContainer); diff --git a/client/src/pages/accounting-qbo/accounting-qbo.page.jsx b/client/src/pages/accounting-qbo/accounting-qbo.page.jsx index d48b24aee..92a834fef 100644 --- a/client/src/pages/accounting-qbo/accounting-qbo.page.jsx +++ b/client/src/pages/accounting-qbo/accounting-qbo.page.jsx @@ -1,47 +1,46 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import QboAuthorizeComponent from "../../components/qbo-authorize/qbo-authorize.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); + export function AccountingReceivablesContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.accounting-qbo"); - setSelectedHeader("qbo"); - setBreadcrumbs([ - { - link: "/manage/accounting/qbo", - label: t("titles.bc.accounting-qbo"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.accounting-qbo"); + setSelectedHeader("qbo"); + setBreadcrumbs([ + { + link: "/manage/accounting/qbo", + label: t("titles.bc.accounting-qbo"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( -
    - -
    - ); + return ( +
    + +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingReceivablesContainer); diff --git a/client/src/pages/accounting-receivables/accounting-receivables.container.jsx b/client/src/pages/accounting-receivables/accounting-receivables.container.jsx index 485800a00..90bedb512 100644 --- a/client/src/pages/accounting-receivables/accounting-receivables.container.jsx +++ b/client/src/pages/accounting-receivables/accounting-receivables.container.jsx @@ -1,87 +1,87 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import AccountingReceivablesTable from "../../components/accounting-receivables-table/accounting-receivables-table.component"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import AccountingReceivablesTable + from "../../components/accounting-receivables-table/accounting-receivables-table.component"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_JOBS_FOR_EXPORT } from "../../graphql/accounting.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_JOBS_FOR_EXPORT} from "../../graphql/accounting.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { checkPartnerStatus } from "../../components/partner-ping/partner-ping.component"; -import { selectPartnerVersion } from "../../redux/application/application.selectors"; +import {checkPartnerStatus} from "../../components/partner-ping/partner-ping.component"; +import {selectPartnerVersion} from "../../redux/application/application.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - partnerVersion: selectPartnerVersion, + bodyshop: selectBodyshop, + partnerVersion: selectPartnerVersion, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); + export function AccountingReceivablesContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, - partnerVersion, -}) { - const { t } = useTranslation(); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + partnerVersion, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.accounting-receivables"); - setSelectedHeader("receivables"); - setBreadcrumbs([ - { - link: "/manage/accounting/receivables", - label: t("titles.bc.accounting-receivables"), - }, - ]); - checkPartnerStatus(bodyshop, true); - }, [t, setBreadcrumbs, setSelectedHeader, bodyshop]); + useEffect(() => { + document.title = t("titles.accounting-receivables"); + setSelectedHeader("receivables"); + setBreadcrumbs([ + { + link: "/manage/accounting/receivables", + label: t("titles.bc.accounting-receivables"), + }, + ]); + checkPartnerStatus(bodyshop, true); + }, [t, setBreadcrumbs, setSelectedHeader, bodyshop]); - const { loading, error, data, refetch } = useQuery(QUERY_JOBS_FOR_EXPORT, { - variables: { - invoicedStatus: bodyshop.md_ro_statuses.default_invoiced || "Invoiced*", - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data, refetch} = useQuery(QUERY_JOBS_FOR_EXPORT, { + variables: { + invoicedStatus: bodyshop.md_ro_statuses.default_invoiced || "Invoiced*", + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - if (error) return ; + if (error) return ; - const noPath = - !partnerVersion?.qbpath && - !( - bodyshop && - (bodyshop.cdk_dealerid || - bodyshop.pbs_serialnumber || - bodyshop.accountingconfig.qbo) + const noPath = + !partnerVersion?.qbpath && + !( + bodyshop && + (bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.accountingconfig.qbo) + ); + + return ( +
    + + {noPath && ( + + )} + + +
    ); - - return ( -
    - - {noPath && ( - - )} - - -
    - ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(AccountingReceivablesContainer); diff --git a/client/src/pages/bills/bills.page.component.jsx b/client/src/pages/bills/bills.page.component.jsx index 169a94a5e..2b2db61f3 100644 --- a/client/src/pages/bills/bills.page.component.jsx +++ b/client/src/pages/bills/bills.page.component.jsx @@ -1,317 +1,318 @@ -import { EditFilled, SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Checkbox, Input, Space, Table, Typography } from "antd"; +import {EditFilled, SyncOutlined} from "@ant-design/icons"; +import {Button, Card, Checkbox, Input, Space, Table, Typography} from "antd"; import axios from "axios"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; import BillDeleteButton from "../../components/bill-delete-button/bill-delete-button.component"; import PartsOrderModalContainer from "../../components/parts-order-modal/parts-order-modal.container"; import PrintWrapperComponent from "../../components/print-wrapper/print-wrapper.component"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import {setModalContext} from "../../redux/modals/modals.actions"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import { DateFormatter } from "../../utils/DateFormatter"; -import { TemplateList } from "../../utils/TemplateConstants"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import {DateFormatter} from "../../utils/DateFormatter"; +import {TemplateList} from "../../utils/TemplateConstants"; +import {alphaSort, dateSort} from "../../utils/sorters"; import {pageLimit} from "../../utils/config"; const mapDispatchToProps = (dispatch) => ({ - setPartsOrderContext: (context) => - dispatch(setModalContext({ context: context, modal: "partsOrder" })), - setBillEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "billEnter" })), + setPartsOrderContext: (context) => + dispatch(setModalContext({context: context, modal: "partsOrder"})), + setBillEnterContext: (context) => + dispatch(setModalContext({context: context, modal: "billEnter"})), }); export function BillsListPage({ - loading, - data, - refetch, - total, - setPartsOrderContext, - setBillEnterContext, -}) { - const search = queryString.parse(useLocation().search); - const [openSearchResults, setOpenSearchResults] = useState([]); - const [searchLoading, setSearchLoading] = useState(false); - const { page } = search; - const history = useHistory(); - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const Templates = TemplateList("bill"); - const { t } = useTranslation(); - const columns = [ - { - title: t("bills.fields.vendorname"), - dataIndex: "vendorname", - key: "vendorname", - // sortObject: (direction) => { - // return { - // vendor: { - // name: direction - // ? direction === "descend" - // ? "desc" - // : "asc" - // : "desc", - // }, - // }; - // }, - // sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), - // sortOrder: - // state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, - render: (text, record) => {record.vendor.name}, - }, - { - title: t("bills.fields.invoice_number"), - dataIndex: "invoice_number", - key: "invoice_number", - sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), - sortOrder: - state.sortedInfo.columnKey === "invoice_number" && - state.sortedInfo.order, - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - // sortObject: (direction) => { - // return { - // job: { - // ro_number: direction - // ? direction === "descend" - // ? "desc" - // : "asc" - // : "desc", - // }, - // }; - // }, - // sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), - // sortOrder: - // state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - render: (text, record) => - record.job && ( - - {record.job.ro_number} - - ), - }, - { - title: t("bills.fields.date"), - dataIndex: "date", - key: "date", - sorter: (a, b) => dateSort(a.date, b.date), - sortOrder: - state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - render: (text, record) => {record.date}, - }, - { - title: t("bills.fields.total"), - dataIndex: "total", - key: "total", - sorter: (a, b) => a.total - b.total, - sortOrder: - state.sortedInfo.columnKey === "total" && state.sortedInfo.order, - render: (text, record) => ( - {record.total} - ), - }, - { - title: t("bills.fields.is_credit_memo"), - dataIndex: "is_credit_memo", - key: "is_credit_memo", - sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, - sortOrder: - state.sortedInfo.columnKey === "is_credit_memo" && - state.sortedInfo.order, - render: (text, record) => ( - - ), - }, - { - title: t("bills.fields.exported"), - dataIndex: "exported", - key: "exported", - sorter: (a, b) => a.exported - b.exported, - sortOrder: - state.sortedInfo.columnKey === "exported" && state.sortedInfo.order, - render: (text, record) => , - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - - - - { - // - } - { - //Filter out the state and set it again. - setOpenSearchResults((currentResults) => - currentResults.filter((bill) => bill.id !== deletedBillid) - ); - }} - /> - {record.isinhouse && ( - - )} - - ), - }, - ]; + loading, + data, + refetch, + total, + setPartsOrderContext, + setBillEnterContext, + }) { + const search = queryString.parse(useLocation().search); + const [openSearchResults, setOpenSearchResults] = useState([]); + const [searchLoading, setSearchLoading] = useState(false); + const {page} = search; + const history = useNavigate(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); + const Templates = TemplateList("bill"); + const {t} = useTranslation(); + const columns = [ + { + title: t("bills.fields.vendorname"), + dataIndex: "vendorname", + key: "vendorname", + // sortObject: (direction) => { + // return { + // vendor: { + // name: direction + // ? direction === "descend" + // ? "desc" + // : "asc" + // : "desc", + // }, + // }; + // }, + // sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), + // sortOrder: + // state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + render: (text, record) => {record.vendor.name}, + }, + { + title: t("bills.fields.invoice_number"), + dataIndex: "invoice_number", + key: "invoice_number", + sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), + sortOrder: + state.sortedInfo.columnKey === "invoice_number" && + state.sortedInfo.order, + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + // sortObject: (direction) => { + // return { + // job: { + // ro_number: direction + // ? direction === "descend" + // ? "desc" + // : "asc" + // : "desc", + // }, + // }; + // }, + // sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + // sortOrder: + // state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => + record.job && ( + + {record.job.ro_number} + + ), + }, + { + title: t("bills.fields.date"), + dataIndex: "date", + key: "date", + sorter: (a, b) => dateSort(a.date, b.date), + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("bills.fields.total"), + dataIndex: "total", + key: "total", + sorter: (a, b) => a.total - b.total, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => ( + {record.total} + ), + }, + { + title: t("bills.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: t("bills.fields.exported"), + dataIndex: "exported", + key: "exported", + sorter: (a, b) => a.exported - b.exported, + sortOrder: + state.sortedInfo.columnKey === "exported" && state.sortedInfo.order, + render: (text, record) => , + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + + + + { + // + } + { + //Filter out the state and set it again. + setOpenSearchResults((currentResults) => + currentResults.filter((bill) => bill.id !== deletedBillid) + ); + }} + /> + {record.isinhouse && ( + + )} + + ), + }, + ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - search.page = pagination.current; - if (sorter && sorter.column && sorter.column.sortObject) { - search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order)); - } else { - delete search.searchObj; - search.sortcolumn = sorter.order ? sorter.columnKey : null; - search.sortorder = sorter.order; - } - search.sort = JSON.stringify({ [sorter.columnKey]: sorter.order }); - history.push({ search: queryString.stringify(search) }); - }; - - useEffect(() => { - if (search.search && search.search.trim() !== "") { - searchBills(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - async function searchBills(value) { - try { - setSearchLoading(true); - const searchData = await axios.post("/search", { - search: value || search.search, - index: "bills", - }); - setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); - } catch (error) { - console.log("Error while fetching search results", error); - } finally { - setSearchLoading(false); - } - } - - return ( - - {search.search && ( - <> - - {t("general.labels.searchresults", { search: search.search })} - - - - )} - - - - { - search.search = value; - history.push({ search: queryString.stringify(search) }); - searchBills(value); - }} - loading={loading || searchLoading} - enterButton - /> - - } - > - - -
    { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + search.page = pagination.current; + if (sorter && sorter.column && sorter.column.sortObject) { + search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order)); + } else { + delete search.searchObj; + search.sortcolumn = sorter.order ? sorter.columnKey : null; + search.sortorder = sorter.order; } - columns={columns} - rowKey="id" - dataSource={search?.search ? openSearchResults : data} - onChange={handleTableChange} - /> - - ); + search.sort = JSON.stringify({[sorter.columnKey]: sorter.order}); + history({search: queryString.stringify(search)}); + }; + + useEffect(() => { + if (search.search && search.search.trim() !== "") { + searchBills(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function searchBills(value) { + try { + setSearchLoading(true); + const searchData = await axios.post("/search", { + search: value || search.search, + index: "bills", + }); + setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); + } catch (error) { + console.log("Error while fetching search results", error); + } finally { + setSearchLoading(false); + } + } + + return ( + + {search.search && ( + <> + + {t("general.labels.searchresults", {search: search.search})} + + + + )} + + + + { + search.search = value; + history({search: queryString.stringify(search)}); + searchBills(value); + }} + loading={loading || searchLoading} + enterButton + /> + + } + > + + +
    + + ); } + export default connect(null, mapDispatchToProps)(BillsListPage); diff --git a/client/src/pages/bills/bills.page.container.jsx b/client/src/pages/bills/bills.page.container.jsx index 40e662899..61f206595 100644 --- a/client/src/pages/bills/bills.page.container.jsx +++ b/client/src/pages/bills/bills.page.container.jsx @@ -1,75 +1,73 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import BillDetailEditContainer from "../../components/bill-detail-edit/bill-detail-edit.container"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_ALL_BILLS_PAGINATED } from "../../graphql/bills.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {QUERY_ALL_BILLS_PAGINATED} from "../../graphql/bills.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import BillsPageComponent from "./bills.page.component"; import {pageLimit} from "../../utils/config"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function BillsPageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, searchObj } = searchParams; +export function BillsPageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, searchObj} = searchParams; - useEffect(() => { - document.title = t("titles.bills-list"); - setSelectedHeader("bills"); - setBreadcrumbs([ - { link: "/manage/bills", label: t("titles.bc.bills-list") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.bills-list"); + setSelectedHeader("bills"); + setBreadcrumbs([ + {link: "/manage/bills", label: t("titles.bc.bills-list")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_BILLS_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - searchObj - ? JSON.parse(searchObj) - : { - [sortcolumn || "date"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_BILLS_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + searchObj + ? JSON.parse(searchObj) + : { + [sortcolumn || "date"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); - if (error) return ; - return ( - -
    - + if (error) return ; + return ( + +
    + - -
    -
    - ); + +
    +
    + ); } + export default connect(null, mapDispatchToProps)(BillsPageContainer); diff --git a/client/src/pages/contract-create/contract-create.page.component.jsx b/client/src/pages/contract-create/contract-create.page.component.jsx index 6703c10a8..5b0675fd2 100644 --- a/client/src/pages/contract-create/contract-create.page.component.jsx +++ b/client/src/pages/contract-create/contract-create.page.component.jsx @@ -1,68 +1,70 @@ -import { Button, Col, PageHeader, Row, Space, Form, Switch } from "antd"; +import {Button, Col, Form, Row, Space, Switch} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; import React from "react"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import ContractCarsContainer from "../../components/contract-cars/contract-cars.container"; import ContractFormComponent from "../../components/contract-form/contract-form.component"; import ContractJobsContainer from "../../components/contract-jobs/contract-jobs.container"; + export default function ContractCreatePageComponent({ - form, - selectedJobState, - selectedCarState, - loading, -}) { - const { t } = useTranslation(); + form, + selectedJobState, + selectedCarState, + loading, + }) { + const {t} = useTranslation(); - const CreateButton = ( - - {selectedJobState[0] && selectedCarState[0] && ( - - - - )} - - - ); + const CreateButton = ( + + {selectedJobState[0] && selectedCarState[0] && ( + + + + )} + + + ); - return ( -
    - -
    - - - - - - -
    - -
    - - - - - ); + return ( +
    + +
    + + + + + + +
    + +
    + + + + + ); } diff --git a/client/src/pages/contract-create/contract-create.page.container.jsx b/client/src/pages/contract-create/contract-create.page.container.jsx index 7ab35f1c5..f9d16e8de 100644 --- a/client/src/pages/contract-create/contract-create.page.container.jsx +++ b/client/src/pages/contract-create/contract-create.page.container.jsx @@ -1,145 +1,145 @@ -import { useMutation } from "@apollo/client"; -import { Form, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useMutation} from "@apollo/client"; +import {Form, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {INSERT_NEW_CONTRACT} from "../../graphql/cccontracts.queries"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ContractCreatePageComponent from "./contract-create.page.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function ContractCreatePageContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const [form] = Form.useForm(); - const { t } = useTranslation(); - const history = useHistory(); - const location = useLocation(); - const [loading, setLoading] = useState(false); - const selectedCarState = useState(null); - const selectedJobState = useState( - (location.state && location.state.jobId) || null - ); - const [insertContract] = useMutation(INSERT_NEW_CONTRACT); - const [intakeJob] = useMutation(UPDATE_JOB); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const [form] = Form.useForm(); + const {t} = useTranslation(); - const handleFinish = async ({ addtoproduction, ...values }) => { - if (!!selectedCarState[0] && !!selectedJobState[0]) { - setLoading(true); - const result = await insertContract({ - variables: { - ccId: selectedCarState[0].id, - damage: values.damage, - mileage: values.kmstart, - contract: { - ...values, - status: "contracts.status.out", - courtesycarid: selectedCarState[0].id, - jobid: selectedJobState[0], - }, - }, - }); + const history = useNavigate(); + const location = useLocation(); + const [loading, setLoading] = useState(false); + const selectedCarState = useState(null); + const selectedJobState = useState( + (location.state && location.state.jobId) || null + ); - if (!result.errors) { - //Update the courtesy car to have the damage. - notification["success"]({ - message: t("contracts.successes.saved"), - }); + const [insertContract] = useMutation(INSERT_NEW_CONTRACT); + const [intakeJob] = useMutation(UPDATE_JOB); - //Intake the job if required - if (addtoproduction) { - const result2 = await intakeJob({ - variables: { - jobId: selectedJobState[0], - job: { - actual_in: new Date(), - inproduction: true, - status: bodyshop.md_ro_statuses.default_arrived, - }, - }, - }); - if (result2.errors) { - notification["error"]({ - message: t("jobs.errors.saving", { - error: JSON.stringify(!result2.errors), - }), + const handleFinish = async ({addtoproduction, ...values}) => { + if (!!selectedCarState[0] && !!selectedJobState[0]) { + setLoading(true); + const result = await insertContract({ + variables: { + ccId: selectedCarState[0].id, + damage: values.damage, + mileage: values.kmstart, + contract: { + ...values, + status: "contracts.status.out", + courtesycarid: selectedCarState[0].id, + jobid: selectedJobState[0], + }, + }, + }); + + if (!result.errors) { + //Update the courtesy car to have the damage. + notification["success"]({ + message: t("contracts.successes.saved"), + }); + + //Intake the job if required + if (addtoproduction) { + const result2 = await intakeJob({ + variables: { + jobId: selectedJobState[0], + job: { + actual_in: new Date(), + inproduction: true, + status: bodyshop.md_ro_statuses.default_arrived, + }, + }, + }); + if (result2.errors) { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(!result2.errors), + }), + }); + return; + } + } + + form.resetFields(); + form.resetFields(); + history( + `/manage/courtesycars/contracts/${result.data.insert_cccontracts.returning[0].id}` + ); + } else { + notification["error"]({ + message: t("contracts.errors.saving", { + error: JSON.stringify(!result.errors), + }), + }); + } + } else { + notification["error"]({ + message: t("contracts.errors.selectjobandcar"), }); - return; - } } + setLoading(false); + }; - form.resetFields(); - form.resetFields(); - history.push( - `/manage/courtesycars/contracts/${result.data.insert_cccontracts.returning[0].id}` - ); - } else { - notification["error"]({ - message: t("contracts.errors.saving", { - error: JSON.stringify(!result.errors), - }), - }); - } - } else { - notification["error"]({ - message: t("contracts.errors.selectjobandcar"), - }); - } - setLoading(false); - }; + useEffect(() => { + document.title = t("titles.contracts-create"); + setSelectedHeader("newcontract"); + setBreadcrumbs([ + {link: "/manage/courtesycars", label: t("titles.bc.courtesycars")}, + { + link: "/manage/courtesycars/contracts", + label: t("titles.bc.contracts"), + }, + { + link: "/manage/courtesycars/contracts/new", + label: t("titles.bc.contracts-create"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - useEffect(() => { - document.title = t("titles.contracts-create"); - setSelectedHeader("newcontract"); - setBreadcrumbs([ - { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, - { - link: "/manage/courtesycars/contracts", - label: t("titles.bc.contracts"), - }, - { - link: "/manage/courtesycars/contracts/new", - label: t("titles.bc.contracts-create"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); - - return ( - -
    - - -
    - ); + return ( + +
    + + +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ContractCreatePageContainer); diff --git a/client/src/pages/contract-detail/contract-detail.page.component.jsx b/client/src/pages/contract-detail/contract-detail.page.component.jsx index 3cf317236..27b3ceb71 100644 --- a/client/src/pages/contract-detail/contract-detail.page.component.jsx +++ b/client/src/pages/contract-detail/contract-detail.page.component.jsx @@ -1,160 +1,126 @@ -import { - Button, - Col, - Dropdown, - Form, - Menu, - PageHeader, - Row, - Space, - Typography, -} from "antd"; +import {Button, Col, Dropdown, Form, Row, Space, Typography,} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import ContractConvertToRo from "../../components/contract-convert-to-ro/contract-convert-to-ro.component"; -import ContractCourtesyCarBlock from "../../components/contract-courtesy-car-block/contract-courtesy-car-block.component"; +import ContractCourtesyCarBlock + from "../../components/contract-courtesy-car-block/contract-courtesy-car-block.component"; import ContractFormComponent from "../../components/contract-form/contract-form.component"; import ContractJobBlock from "../../components/contract-job-block/contract-job-block.component"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { GenerateDocument } from "../../utils/RenderTemplate"; -import { TemplateList } from "../../utils/TemplateConstants"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {GenerateDocument} from "../../utils/RenderTemplate"; +import {TemplateList} from "../../utils/TemplateConstants"; const mapDispatchToProps = (dispatch) => ({ - setCourtesyCarReturnModalContext: (context) => - dispatch(setModalContext({ context: context, modal: "courtesyCarReturn" })), + setCourtesyCarReturnModalContext: (context) => + dispatch(setModalContext({context: context, modal: "courtesyCarReturn"})), }); export function ContractDetailPage({ - contract, - job, - courtesyCar, - setCourtesyCarReturnModalContext, - refetch, - form, - saveLoading, -}) { - const { t } = useTranslation(); - return ( -
    - - - - - {() => { - return ( - - - - - - GenerateDocument( - { - name: TemplateList("courtesycarcontract") - .courtesy_car_contract.key, - variables: { id: contract.id }, - }, - {}, - "p" - ) - } - > - {t("contracts.actions.printcontract")} - - - GenerateDocument( - { - name: TemplateList("courtesycarcontract") - .courtesy_car_terms.key, - variables: { id: contract.id }, - }, - {}, - "p" - ) - } - > - {t( - "printcenter.courtesycarcontract.courtesy_car_terms" - )} - - - GenerateDocument( - { - name: TemplateList("courtesycarcontract") - .courtesy_car_impound.key, - variables: { id: contract.id }, - }, - {}, - "p" - ) - } - > - {t( - "printcenter.courtesycarcontract.courtesy_car_impound" - )} - - - } - > - - + contract, + job, + courtesyCar, + setCourtesyCarReturnModalContext, + refetch, + form, + saveLoading + }) { + const {t} = useTranslation(); + return ( +
    + + + + + {() => { + const menu = { + onClick: (e) => { + GenerateDocument( + { + name: TemplateList("courtesycarcontract")[e.key].key, + variables: {id: contract.id}, + }, + {}, + "p" + ); + }, + items: [ + { + key: "courtesy_car_contract", + label: t("contracts.actions.printcontract"), + }, + { + key: "courtesy_car_terms", + label: t("printcenter.courtesycarcontract.courtesy_car_terms"), + }, + { + key: "courtesy_car_impound", + label: t("printcenter.courtesycarcontract.courtesy_car_impound"), + }, + ] + }; - - - ); - }} - - } - /> - -
    - - - - - - - - - - - ); + return ( + + + + + + + + + + ); + }} + + } + /> + + + + + + + + + + + + + ); } + export default connect(null, mapDispatchToProps)(ContractDetailPage); diff --git a/client/src/pages/contract-detail/contract-detail.page.container.jsx b/client/src/pages/contract-detail/contract-detail.page.container.jsx index 86d5148b1..56bbf82ab 100644 --- a/client/src/pages/contract-detail/contract-detail.page.container.jsx +++ b/client/src/pages/contract-detail/contract-detail.page.container.jsx @@ -1,171 +1,166 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Form, notification } from "antd"; -import moment from "moment"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useParams } from "react-router-dom"; +import {useMutation, useQuery} from "@apollo/client"; +import {Form, notification} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; -import CourtesyCarReturnModalContainer from "../../components/courtesy-car-return-modal/courtesy-car-return-modal.container"; +import CourtesyCarReturnModalContainer + from "../../components/courtesy-car-return-modal/courtesy-car-return-modal.container"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - QUERY_CONTRACT_BY_PK, - UPDATE_CONTRACT, -} from "../../graphql/cccontracts.queries"; -import { - addRecentItem, - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { CreateRecentItem } from "../../utils/create-recent-item"; +import {QUERY_CONTRACT_BY_PK, UPDATE_CONTRACT,} from "../../graphql/cccontracts.queries"; +import {addRecentItem, setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {CreateRecentItem} from "../../utils/create-recent-item"; import ContractDetailPageComponent from "./contract-detail.page.component"; import NotFound from "../../components/not-found/not-found.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - addRecentItem: (item) => dispatch(addRecentItem(item)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function ContractDetailPageContainer({ - setBreadcrumbs, - addRecentItem, - setSelectedHeader, -}) { - const { t } = useTranslation(); - const [updateContract] = useMutation(UPDATE_CONTRACT); - const [saveLoading, setsaveLoading] = useState(false); - const [form] = Form.useForm(); - const { contractId } = useParams(); + setBreadcrumbs, + addRecentItem, + setSelectedHeader, + }) { + const {t} = useTranslation(); + const [updateContract] = useMutation(UPDATE_CONTRACT); + const [saveLoading, setsaveLoading] = useState(false); + const [form] = Form.useForm(); + const {contractId} = useParams(); - const { loading, error, data, refetch } = useQuery(QUERY_CONTRACT_BY_PK, { - variables: { id: contractId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data, refetch} = useQuery(QUERY_CONTRACT_BY_PK, { + variables: {id: contractId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - setSelectedHeader("contracts"); - document.title = loading - ? t("titles.app") - : error - ? t("titles.app") - : t("titles.contracts-detail", { - id: - (data && - data.cccontracts_by_pk && - data.cccontracts_by_pk.agreementnumber) || - "", - }); + useEffect(() => { + setSelectedHeader("contracts"); + document.title = loading + ? t("titles.app") + : error + ? t("titles.app") + : t("titles.contracts-detail", { + id: + (data && + data.cccontracts_by_pk && + data.cccontracts_by_pk.agreementnumber) || + "", + }); - setBreadcrumbs([ - { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, - { - link: "/manage/courtesycars/contracts", - label: t("titles.bc.contracts"), - }, - { - link: "/manage/courtesycars/contracts/new", - label: t("titles.bc.contracts-detail", { - number: - (data && - data.cccontracts_by_pk && - data.cccontracts_by_pk.agreementnumber) || - "", - }), - }, + setBreadcrumbs([ + {link: "/manage/courtesycars", label: t("titles.bc.courtesycars")}, + { + link: "/manage/courtesycars/contracts", + label: t("titles.bc.contracts"), + }, + { + link: "/manage/courtesycars/contracts/new", + label: t("titles.bc.contracts-detail", { + number: + (data && + data.cccontracts_by_pk && + data.cccontracts_by_pk.agreementnumber) || + "", + }), + }, + ]); + + if (data && data.cccontracts_by_pk) + addRecentItem( + CreateRecentItem( + contractId, + "contract", + data.cccontracts_by_pk.agreementnumber, + `/manage/courtesycars/contracts/${contractId}` + ) + ); + }, [ + t, + data, + error, + loading, + setBreadcrumbs, + addRecentItem, + contractId, + setSelectedHeader, ]); - if (data && data.cccontracts_by_pk) - addRecentItem( - CreateRecentItem( - contractId, - "contract", - data.cccontracts_by_pk.agreementnumber, - `/manage/courtesycars/contracts/${contractId}` - ) - ); - }, [ - t, - data, - error, - loading, - setBreadcrumbs, - addRecentItem, - contractId, - setSelectedHeader, - ]); + const handleFinish = async (values) => { + setsaveLoading(true); + const result = await updateContract({ + variables: {cccontract: {...values}, contractId: contractId}, + }); + if (!!result.errors) { + notification["error"]({ + message: t("contracts.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + return; + } + notification["success"]({message: t("contracts.successes.saved")}); + if (refetch) await refetch(); + setsaveLoading(false); - const handleFinish = async (values) => { - setsaveLoading(true); - const result = await updateContract({ - variables: { cccontract: { ...values }, contractId: contractId }, - }); - if (!!result.errors) { - notification["error"]({ - message: t("contracts.errors.saving", { - message: JSON.stringify(result.errors), - }), - }); - return; - } - notification["success"]({ message: t("contracts.successes.saved") }); - if (refetch) await refetch(); - setsaveLoading(false); + form.resetFields(); + form.resetFields(); + }; - form.resetFields(); - form.resetFields(); - }; + useEffect(() => { + if (data && data.cccontracts_by_pk) form.resetFields(); + }, [data, form]); - useEffect(() => { - if (data && data.cccontracts_by_pk) form.resetFields(); - }, [data, form]); + if (error) return ; + if (loading) return ; - if (error) return ; - if (loading) return ; + if (!!!data.cccontracts_by_pk) return ; - if (!!!data.cccontracts_by_pk) return ; - - return ( - -
    - -
    - - -
    -
    - ); + return ( + +
    + +
    + + +
    +
    + ); } + export default connect(null, mapDispatchToProps)(ContractDetailPageContainer); diff --git a/client/src/pages/contracts/contracts.page.component.jsx b/client/src/pages/contracts/contracts.page.component.jsx index 51609a00c..049489aa0 100644 --- a/client/src/pages/contracts/contracts.page.component.jsx +++ b/client/src/pages/contracts/contracts.page.component.jsx @@ -2,17 +2,17 @@ import React from "react"; import ContractsList from "../../components/contracts-list/contracts-list.component"; export default function ContractsPageComponent({ - loading, - data, - refetch, - total, -}) { - return ( - - ); + loading, + data, + refetch, + total, + }) { + return ( + + ); } diff --git a/client/src/pages/contracts/contracts.page.container.jsx b/client/src/pages/contracts/contracts.page.container.jsx index 466b468e0..fe64a86d1 100644 --- a/client/src/pages/contracts/contracts.page.container.jsx +++ b/client/src/pages/contracts/contracts.page.container.jsx @@ -1,72 +1,70 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_ACTIVE_CONTRACTS_PAGINATED } from "../../graphql/cccontracts.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {QUERY_ACTIVE_CONTRACTS_PAGINATED} from "../../graphql/cccontracts.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import ContractsPageComponent from "./contracts.page.component"; import {pageLimit} from "../../utils/config"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function ContractsPageContainer({ setBreadcrumbs, setSelectedHeader }) { - const searchParams = queryString.parse(useLocation().search); - const { search, page, sortcolumn, sortorder } = searchParams; +export function ContractsPageContainer({setBreadcrumbs, setSelectedHeader}) { + const searchParams = queryString.parse(useLocation().search); + const {search, page, sortcolumn, sortorder} = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_ACTIVE_CONTRACTS_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "start"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); - const { t } = useTranslation(); - useEffect(() => { - document.title = t("titles.contracts"); - setSelectedHeader("contracts"); - setBreadcrumbs([ - { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, - { - link: "/manage/courtesycars/contracts", - label: t("titles.bc.contracts"), - }, - ]); - }, [setBreadcrumbs, t, setSelectedHeader]); + const {loading, error, data, refetch} = useQuery( + QUERY_ACTIVE_CONTRACTS_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + search: search || "", + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "start"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); + const {t} = useTranslation(); + useEffect(() => { + document.title = t("titles.contracts"); + setSelectedHeader("contracts"); + setBreadcrumbs([ + {link: "/manage/courtesycars", label: t("titles.bc.courtesycars")}, + { + link: "/manage/courtesycars/contracts", + label: t("titles.bc.contracts"), + }, + ]); + }, [setBreadcrumbs, t, setSelectedHeader]); - if (error) return ; - return ( - - - - ); + if (error) return ; + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(ContractsPageContainer); diff --git a/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx b/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx index f373e4066..896393742 100644 --- a/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx +++ b/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx @@ -1,87 +1,86 @@ -import { useMutation } from "@apollo/client"; -import { Form, notification } from "antd"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useMutation} from "@apollo/client"; +import {Form, notification} from "antd"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import CourtesyCarFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { INSERT_NEW_COURTESY_CAR } from "../../graphql/courtesy-car.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {INSERT_NEW_COURTESY_CAR} from "../../graphql/courtesy-car.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); + export function CourtesyCarCreateContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR); - const { t } = useTranslation(); - const history = useHistory(); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR); + const {t} = useTranslation(); + const history = useNavigate(); - const handleFinish = async (values) => { - setLoading(true); - const result = await insertCourtesyCar({ - variables: { courtesycar: { ...values, bodyshopid: bodyshop.id } }, - }); + const handleFinish = async (values) => { + setLoading(true); + const result = await insertCourtesyCar({ + variables: {courtesycar: {...values, bodyshopid: bodyshop.id}}, + }); - if (!!result.errors) { - notification["error"]({ - message: t("courtesycars.errors.saving", { - message: JSON.stringify(result.errors), - }), - }); - setLoading(false); - } else { - setLoading(false); - form.resetFields(); - form.resetFields(); - notification["success"]({ message: t("courtesycars.successes.saved") }); - history.push( - `/manage/courtesycars/${result.data.insert_courtesycars.returning[0].id}` - ); - } - }; + if (!!result.errors) { + notification["error"]({ + message: t("courtesycars.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + setLoading(false); + } else { + setLoading(false); + form.resetFields(); + form.resetFields(); + notification["success"]({message: t("courtesycars.successes.saved")}); + history( + `/manage/courtesycars/${result.data.insert_courtesycars.returning[0].id}` + ); + } + }; - useEffect(() => { - setSelectedHeader("courtesycarsall"); - document.title = t("titles.courtesycars-create"); - setBreadcrumbs([ - { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, - { - link: "/manage/courtesycars/new", - label: t("titles.bc.courtesycars-new"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + setSelectedHeader("courtesycarsall"); + document.title = t("titles.courtesycars-create"); + setBreadcrumbs([ + {link: "/manage/courtesycars", label: t("titles.bc.courtesycars")}, + { + link: "/manage/courtesycars/new", + label: t("titles.bc.courtesycars-new"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - -
    - - -
    - ); + return ( + +
    + + +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(CourtesyCarCreateContainer); diff --git a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx index 99deafe1a..10b071b9e 100644 --- a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx +++ b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx @@ -1,26 +1,27 @@ import React from "react"; import CourtesyCarCreateFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component"; -import CourtesyCarContractListComponent from "../../components/courtesy-car-contract-list/courtesy-car-contract-list.component"; -import { Col, Divider, Row } from "antd"; +import CourtesyCarContractListComponent + from "../../components/courtesy-car-contract-list/courtesy-car-contract-list.component"; +import {Col, Divider, Row} from "antd"; export default function CourtesyCarDetailPageComponent({ - contracts, - form, - saveLoading, - totalContracts, -}) { - return ( - -
    - - - - - - - - ); + contracts, + form, + saveLoading, + totalContracts, + }) { + return ( + + + + + + + + + + ); } diff --git a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx index bf73b4cc3..831d52ee6 100644 --- a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx +++ b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx @@ -1,201 +1,199 @@ -import { useMutation, useQuery } from "@apollo/client"; -import { Form, notification } from "antd"; -import moment from "moment"; -import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation, useParams } from "react-router-dom"; +import {useMutation, useQuery} from "@apollo/client"; +import {Form, notification} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useParams} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; -import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import NotFound from "../../components/not-found/not-found.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries"; -import { - addRecentItem, - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { pageLimit } from "../../utils/config"; -import { CreateRecentItem } from "../../utils/create-recent-item"; +import {QUERY_CC_BY_PK, UPDATE_CC} from "../../graphql/courtesy-car.queries"; +import {addRecentItem, setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {CreateRecentItem} from "../../utils/create-recent-item"; import UndefinedToNull from "./../../utils/undefinedtonull"; import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component"; +import NotFound from "../../components/not-found/not-found.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import queryString from "query-string"; +import {pageLimit} from "../../utils/config"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - addRecentItem: (item) => dispatch(addRecentItem(item)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); + export function CourtesyCarDetailPageContainer({ - setBreadcrumbs, - addRecentItem, - setSelectedHeader, -}) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder } = searchParams; + setBreadcrumbs, + addRecentItem, + setSelectedHeader, + }) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder} = searchParams; - const { t } = useTranslation(); - const [updateCourtesyCar] = useMutation(UPDATE_CC); - const [form] = Form.useForm(); - const { ccId } = useParams(); - const [saveLoading, setSaveLoading] = useState(false); - const { loading, error, data } = useQuery(QUERY_CC_BY_PK, { - variables: { - id: ccId, - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "start"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", + const {t} = useTranslation(); + const [updateCourtesyCar] = useMutation(UPDATE_CC); + const [form] = Form.useForm(); + const {ccId} = useParams(); + const [saveLoading, setSaveLoading] = useState(false); + const {loading, error, data} = useQuery(QUERY_CC_BY_PK, { + variables: { + id: ccId, + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "start"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], }, - ], - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - setSelectedHeader("courtesycarsall"); + useEffect(() => { + setSelectedHeader("courtesycarsall"); - document.title = loading - ? t("titles.app") - : error - ? t("titles.app") - : t("titles.courtesycars-detail", { - id: - (data && - data.courtesycars_by_pk && - data.courtesycars_by_pk.fleet_number) || - "", - }); - setBreadcrumbs([ - { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, - { - link: `/manage/courtesycars/${ - (data && data.courtesycars_by_pk && data.courtesycars_by_pk.id) || "" - }`, - label: t("titles.bc.courtesycars-detail", { - number: - (data && - data.courtesycars_by_pk && - data.courtesycars_by_pk.fleetnumber) || - "", - }), - }, + document.title = loading + ? t("titles.app") + : error + ? t("titles.app") + : t("titles.courtesycars-detail", { + id: + (data && + data.courtesycars_by_pk && + data.courtesycars_by_pk.fleet_number) || + "", + }); + setBreadcrumbs([ + {link: "/manage/courtesycars", label: t("titles.bc.courtesycars")}, + { + link: `/manage/courtesycars/${ + (data && data.courtesycars_by_pk && data.courtesycars_by_pk.id) || "" + }`, + label: t("titles.bc.courtesycars-detail", { + number: + (data && + data.courtesycars_by_pk && + data.courtesycars_by_pk.fleetnumber) || + "", + }), + }, + ]); + + if (data && data.courtesycars_by_pk) + addRecentItem( + CreateRecentItem( + ccId, + "courtesycar", + data.courtesycars_by_pk.fleet_number || data.courtesycars_by_pk.vin, + `/manage/courtesycars/${ccId}` + ) + ); + }, [ + t, + data, + error, + loading, + setBreadcrumbs, + ccId, + addRecentItem, + setSelectedHeader, ]); - if (data && data.courtesycars_by_pk) - addRecentItem( - CreateRecentItem( - ccId, - "courtesycar", - data.courtesycars_by_pk.fleet_number || data.courtesycars_by_pk.vin, - `/manage/courtesycars/${ccId}` - ) - ); - }, [ - t, - data, - error, - loading, - setBreadcrumbs, - ccId, - addRecentItem, - setSelectedHeader, - ]); + const handleFinish = async (values) => { + setSaveLoading(true); - const handleFinish = async (values) => { - setSaveLoading(true); + const result = await updateCourtesyCar({ + variables: { + cc: {...UndefinedToNull(values, ["readiness"])}, + ccId: ccId, + }, + refetchQueries: ["QUERY_CC_BY_PK"], + awaitRefetchQueries: true, + }); - const result = await updateCourtesyCar({ - variables: { - cc: { ...UndefinedToNull(values, ["readiness"]) }, - ccId: ccId, - }, - refetchQueries: ["QUERY_CC_BY_PK"], - awaitRefetchQueries: true, - }); - - if (!!result.errors) { - notification["error"]({ - message: t("courtesycars.errors.saving", { error: error }), - }); - } - - notification["success"]({ - message: t("courtesycars.successes.saved"), - }); - - setSaveLoading(false); - }; - - useEffect(() => { - if (data && data.courtesycars_by_pk) { - form.resetFields(); - form.resetFields(); - } - }, [data, form]); - - if (loading) return ; - if (error) return ; - - if (!!!data.courtesycars_by_pk) return ; - - return ( - -
    - - -
    - ); + + notification["success"]({ + message: t("courtesycars.successes.saved"), + }); + + setSaveLoading(false); + }; + + useEffect(() => { + if (data && data.courtesycars_by_pk) { + form.resetFields(); + form.resetFields(); + } + }, [data, form]); + + if (loading) return ; + if (error) return ; + + if (!!!data.courtesycars_by_pk) return ; + + return ( + +
    + + +
    + ); } + export default connect( - null, - mapDispatchToProps + null, + mapDispatchToProps )(CourtesyCarDetailPageContainer); diff --git a/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx b/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx index 0dd68ffcb..fd9978b32 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx @@ -1,12 +1,12 @@ import React from "react"; import CourtesyCarsListComponent from "../../components/courtesy-cars-list/courtesy-cars-list.component"; -export default function CourtesyCarsPageComponent({ loading, data, refetch }) { - return ( - - ); +export default function CourtesyCarsPageComponent({loading, data, refetch}) { + return ( + + ); } diff --git a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx index 60aa8e140..982d6db16 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx @@ -1,48 +1,45 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_ALL_CC } from "../../graphql/courtesy-car.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {QUERY_ALL_CC} from "../../graphql/courtesy-car.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import CourtesyCarsPageComponent from "./courtesy-cars.page.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function CourtesyCarsPageContainer({ - setBreadcrumbs, - setSelectedHeader, -}) { - const { loading, error, data, refetch } = useQuery(QUERY_ALL_CC, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { t } = useTranslation(); - useEffect(() => { - document.title = t("titles.courtesycars"); - setSelectedHeader("courtesycarsall"); - setBreadcrumbs([ - { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, - ]); - }, [setBreadcrumbs, t, setSelectedHeader]); + setBreadcrumbs, + setSelectedHeader, + }) { + const {loading, error, data, refetch} = useQuery(QUERY_ALL_CC, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const {t} = useTranslation(); + useEffect(() => { + document.title = t("titles.courtesycars"); + setSelectedHeader("courtesycarsall"); + setBreadcrumbs([ + {link: "/manage/courtesycars", label: t("titles.bc.courtesycars")}, + ]); + }, [setBreadcrumbs, t, setSelectedHeader]); - if (error) return ; - return ( - - - - ); + if (error) return ; + return ( + + + + ); } export default connect(null, mapDispatchToProps)(CourtesyCarsPageContainer); diff --git a/client/src/pages/csi/csi.container.page.jsx b/client/src/pages/csi/csi.container.page.jsx index c6f34ab30..7d31caf75 100644 --- a/client/src/pages/csi/csi.container.page.jsx +++ b/client/src/pages/csi/csi.container.page.jsx @@ -1,178 +1,178 @@ -import { useQuery, useMutation } from "@apollo/client"; -import { Form, Layout, Typography, Button, Result } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { useParams } from "react-router-dom"; +import {useMutation, useQuery} from "@apollo/client"; +import {Button, Form, Layout, Result, Typography} from "antd"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {useParams} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import ConfigFormComponents from "../../components/config-form-components/config-form-components.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { QUERY_SURVEY, COMPLETE_SURVEY } from "../../graphql/csi.queries"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import {COMPLETE_SURVEY, QUERY_SURVEY} from "../../graphql/csi.queries"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(CsiContainerPage); -export function CsiContainerPage({ currentUser }) { - const { surveyId } = useParams(); - const [form] = Form.useForm(); - const [submitting, setSubmitting] = useState({ - loading: false, - submitted: false, - }); - - const { loading, error, data } = useQuery(QUERY_SURVEY, { - variables: { surveyId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - const { t } = useTranslation(); - const [completeSurvey] = useMutation(COMPLETE_SURVEY); - if (loading) return ; - - if (error || !!!data.csi_by_pk) - return ( -
    - - {error ? ( -
    ERROR: {error.graphQLErrors.map((e) => e.message)}
    - ) : null} -
    -
    - ); - - const handleFinish = async (values) => { - setSubmitting({ ...submitting, loading: true }); - - const result = await completeSurvey({ - variables: { - surveyId, - survey: { - response: values, - valid: false, - completedon: new Date(), - }, - }, +export function CsiContainerPage({currentUser}) { + const {surveyId} = useParams(); + const [form] = Form.useForm(); + const [submitting, setSubmitting] = useState({ + loading: false, + submitted: false, }); - if (!!!result.errors) { - setSubmitting({ ...submitting, loading: false, submitted: true }); - } else { - setSubmitting({ - ...submitting, - loading: false, - error: JSON.stringify(result.errors), - }); - } - }; + const {loading, error, data} = useQuery(QUERY_SURVEY, { + variables: {surveyId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const { - relateddata: { bodyshop, job }, - csiquestion: { config: csiquestions }, - } = data.csi_by_pk; + const {t} = useTranslation(); + const [completeSurvey] = useMutation(COMPLETE_SURVEY); + if (loading) return ; - if (currentUser && currentUser.authorized) - return ( - - - - ); + if (error || !!!data.csi_by_pk) + return ( +
    + + {error ? ( +
    ERROR: {error.graphQLErrors.map((e) => e.message)}
    + ) : null} +
    +
    + ); - return ( - -
    -
    - {bodyshop.logo_img_path && bodyshop.logo_img_path.src ? ( - Logo - ) : null} -
    - {bodyshop.shopname || ""} -
    {`${bodyshop.address1 || ""}`}
    -
    {`${bodyshop.address2 || ""}`}
    -
    {`${bodyshop.city || ""} ${bodyshop.state || ""} ${ - bodyshop.zip_post || "" - }`}
    -
    -
    - {t("csi.labels.title")} - {`Hi ${job.ownr_co_nm || job.ownr_fn || ""}!`} - - {`At ${ - bodyshop.shopname || "" - }, we value your feedback. We would love to - hear what you have to say. Please fill out the form below.`} - -
    + const handleFinish = async (values) => { + setSubmitting({...submitting, loading: true}); - {submitting.error ? ( - - ) : null} + const result = await completeSurvey({ + variables: { + surveyId, + survey: { + response: values, + valid: false, + completedon: new Date(), + }, + }, + }); - {submitting.submitted ? ( - - - - ) : ( - -
    - - - -
    - )} + +
    + ); - - {`Survey ID: ${surveyId}`} - - - ); + return ( + +
    +
    + {bodyshop.logo_img_path && bodyshop.logo_img_path.src ? ( + Logo + ) : null} +
    + {bodyshop.shopname || ""} +
    {`${bodyshop.address1 || ""}`}
    +
    {`${bodyshop.address2 || ""}`}
    +
    {`${bodyshop.city || ""} ${bodyshop.state || ""} ${ + bodyshop.zip_post || "" + }`}
    +
    +
    + {t("csi.labels.title")} + {`Hi ${job.ownr_co_nm || job.ownr_fn || ""}!`} + + {`At ${ + bodyshop.shopname || "" + }, we value your feedback. We would love to + hear what you have to say. Please fill out the form below.`} + +
    + + {submitting.error ? ( + + ) : null} + + {submitting.submitted ? ( + + + + ) : ( + +
    + + + +
    + )} + + + {`Survey ID: ${surveyId}`} + +
    + ); } diff --git a/client/src/pages/dashboard/dashboard.container.jsx b/client/src/pages/dashboard/dashboard.container.jsx index d654258f5..3f1595525 100644 --- a/client/src/pages/dashboard/dashboard.container.jsx +++ b/client/src/pages/dashboard/dashboard.container.jsx @@ -1,39 +1,37 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function ExportsLogPageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function ExportsLogPageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.dashboard"); - setSelectedHeader("dashboard"); - setBreadcrumbs([ - { - link: "/manage/accounting/exportlogs", - label: t("titles.bc.dashboard"), - }, - ]); - }, [setBreadcrumbs, t, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.dashboard"); + setSelectedHeader("dashboard"); + setBreadcrumbs([ + { + link: "/manage/accounting/exportlogs", + label: t("titles.bc.dashboard"), + }, + ]); + }, [setBreadcrumbs, t, setSelectedHeader]); - return ( - - - - - - ); + return ( + + + + + + ); } + export default connect(null, mapDispatchToProps)(ExportsLogPageContainer); diff --git a/client/src/pages/disclaimer/disclaimer.page.jsx b/client/src/pages/disclaimer/disclaimer.page.jsx index 721be5f91..26962b8ec 100644 --- a/client/src/pages/disclaimer/disclaimer.page.jsx +++ b/client/src/pages/disclaimer/disclaimer.page.jsx @@ -1,23 +1,23 @@ import React from "react"; -import { Typography } from "antd"; +import {Typography} from "antd"; export default function AboutPage() { - return ( -
    - {`Rome Online V.${process.env.NODE_ENV}-${process.env.REACT_APP_GIT_SHA}`} - - © 2019 - {new Date().getFullYear()} ImEX Systems Inc. used under - license to Rome Technologies - - Third Party Notices - - Application - - - API - -
    - ); + return ( +
    + {`Rome Online V.${process.env.NODE_ENV}-${process.env.REACT_APP_GIT_SHA}`} + + © 2019 - {new Date().getFullYear()} ImEX Systems Inc. used under + license to Rome Technologies + + Third Party Notices + + Application + + + API + +
    + ); } diff --git a/client/src/pages/dms-payables/dms-payables.container.jsx b/client/src/pages/dms-payables/dms-payables.container.jsx index de3bd2f17..1c7279aa9 100644 --- a/client/src/pages/dms-payables/dms-payables.container.jsx +++ b/client/src/pages/dms-payables/dms-payables.container.jsx @@ -1,163 +1,161 @@ -import { Button, Card, Col, notification, Row, Select, Space } from "antd"; -import React, { useEffect, useRef, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {Button, Card, Col, notification, Row, Select, Space} from "antd"; +import React, {useEffect, useRef, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import SocketIO from "socket.io-client"; -import DmsAllocationsSummaryApComponent from "../../components/dms-allocations-summary-ap/dms-allocations-summary-ap.component"; +import DmsAllocationsSummaryApComponent + from "../../components/dms-allocations-summary-ap/dms-allocations-summary-ap.component"; import DmsLogEvents from "../../components/dms-log-events/dms-log-events.component"; -import { auth } from "../../firebase/firebase.utils"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {auth} from "../../firebase/firebase.utils"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export default connect(mapStateToProps, mapDispatchToProps)(DmsContainer); export const socket = SocketIO( - process.env.NODE_ENV === "production" - ? process.env.REACT_APP_AXIOS_BASE_API_URL - : window.location.origin, - { - path: "/ws", - withCredentials: true, - auth: async (callback) => { - const token = auth.currentUser && (await auth.currentUser.getIdToken()); - callback({ token }); - }, - } + process.env.NODE_ENV === "production" + ? process.env.REACT_APP_AXIOS_BASE_API_URL + : window.location.origin, + { + path: "/ws", + withCredentials: true, + auth: async (callback) => { + const token = auth.currentUser && (await auth.currentUser.getIdToken()); + callback({token}); + }, + } ); -export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - const [logLevel, setLogLevel] = useState("DEBUG"); - const history = useHistory(); - const [logs, setLogs] = useState([]); +export function DmsContainer({bodyshop, setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + const [logLevel, setLogLevel] = useState("DEBUG"); + const history = useNavigate(); + const [logs, setLogs] = useState([]); - const { state } = useLocation(); + const {state} = useLocation(); - const logsRef = useRef(null); + const logsRef = useRef(null); - useEffect(() => { - document.title = t("titles.dms"); - setSelectedHeader("dms"); - setBreadcrumbs([ - { - link: "/manage/accounting/payables", - label: t("titles.bc.accounting-payables"), - }, - { - link: "/manage/dms", - label: t("titles.bc.dms"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.dms"); + setSelectedHeader("dms"); + setBreadcrumbs([ + { + link: "/manage/accounting/payables", + label: t("titles.bc.accounting-payables"), + }, + { + link: "/manage/dms", + label: t("titles.bc.dms"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - useEffect(() => { - socket.on("connect", () => socket.emit("set-log-level", logLevel)); - socket.on("reconnect", () => { - setLogs((logs) => { - return [ - ...logs, - { - timestamp: new Date(), - level: "WARNING", - message: "Reconnected to CDK Export Service", - }, - ]; - }); - }); + useEffect(() => { + socket.on("connect", () => socket.emit("set-log-level", logLevel)); + socket.on("reconnect", () => { + setLogs((logs) => { + return [ + ...logs, + { + timestamp: new Date(), + level: "WARNING", + message: "Reconnected to CDK Export Service", + }, + ]; + }); + }); - socket.on("log-event", (payload) => { - setLogs((logs) => { - return [...logs, payload]; - }); - }); + socket.on("log-event", (payload) => { + setLogs((logs) => { + return [...logs, payload]; + }); + }); - socket.on("ap-export-complete", (payload) => { - notification.open({ - type: "success", - message: t("jobs.labels.dms.apexported"), - }); - }); + socket.on("ap-export-complete", (payload) => { + notification.open({ + type: "success", + message: t("jobs.labels.dms.apexported"), + }); + }); - if (socket.disconnected) socket.connect(); - return () => { - socket.removeAllListeners(); - socket.disconnect(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + if (socket.disconnected) socket.connect(); + return () => { + socket.removeAllListeners(); + socket.disconnect(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); - if (!state?.billids) { - history.push(`/manage/accounting/payables`); - } + if (!state?.billids) { + history(`/manage/accounting/payables`); + } - return ( - -
    - - + return ( + + + + - -
    - - - -
    +
    + + + + - - } - > - - -
    - - - ); + socket.disconnect(); + socket.connect(); + }} + > + Reconnect + + + } + > + + + + + + ); } export const determineDmsType = (bodyshop) => { - if (bodyshop.cdk_dealerid) return "cdk"; - else { - return "pbs"; - } + if (bodyshop.cdk_dealerid) return "cdk"; + else { + return "pbs"; + } }; diff --git a/client/src/pages/dms/dms.container.jsx b/client/src/pages/dms/dms.container.jsx index 3a700a89e..7b7db81d0 100644 --- a/client/src/pages/dms/dms.container.jsx +++ b/client/src/pages/dms/dms.container.jsx @@ -1,20 +1,11 @@ -import { useQuery } from "@apollo/client"; -import { - Button, - Card, - Col, - notification, - Result, - Row, - Select, - Space, -} from "antd"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Col, notification, Result, Row, Select, Space,} from "antd"; import queryString from "query-string"; -import React, { useEffect, useRef, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect, useRef, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import SocketIO from "socket.io-client"; import AlertComponent from "../../components/alert/alert.component"; import DmsAllocationsSummary from "../../components/dms-allocations-summary/dms-allocations-summary.component"; @@ -22,200 +13,197 @@ import DmsCustomerSelector from "../../components/dms-customer-selector/dms-cust import DmsLogEvents from "../../components/dms-log-events/dms-log-events.component"; import DmsPostForm from "../../components/dms-post-form/dms-post-form.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { OwnerNameDisplayFunction } from "../../components/owner-name-display/owner-name-display.component"; -import { auth } from "../../firebase/firebase.utils"; -import { QUERY_JOB_EXPORT_DMS } from "../../graphql/jobs.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {OwnerNameDisplayFunction} from "../../components/owner-name-display/owner-name-display.component"; +import {auth} from "../../firebase/firebase.utils"; +import {QUERY_JOB_EXPORT_DMS} from "../../graphql/jobs.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export default connect(mapStateToProps, mapDispatchToProps)(DmsContainer); export const socket = SocketIO( - // process.env.NODE_ENV === "production" - // ? process.env.REACT_APP_AXIOS_BASE_API_URL - // : window.location.origin, - "http://localhost:4000", // for dev testing, - { - path: "/ws", - withCredentials: true, - auth: async (callback) => { - const token = auth.currentUser && (await auth.currentUser.getIdToken()); - callback({ token }); - }, - } + // process.env.NODE_ENV === "production" + // ? process.env.REACT_APP_AXIOS_BASE_API_URL + // : window.location.origin, + "http://localhost:4000", // for dev testing, + { + path: "/ws", + withCredentials: true, + auth: async (callback) => { + const token = auth.currentUser && (await auth.currentUser.getIdToken()); + callback({token}); + }, + } ); -export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - const [logLevel, setLogLevel] = useState("DEBUG"); - const history = useHistory(); - const [logs, setLogs] = useState([]); - const search = queryString.parse(useLocation().search); - const { jobId } = search; +export function DmsContainer({bodyshop, setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + const [logLevel, setLogLevel] = useState("DEBUG"); + const history = useNavigate(); + const [logs, setLogs] = useState([]); + const search = queryString.parse(useLocation().search); + const {jobId} = search; - const { loading, error, data } = useQuery(QUERY_JOB_EXPORT_DMS, { - variables: { id: jobId }, - skip: !jobId, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const logsRef = useRef(null); - - useEffect(() => { - document.title = t("titles.dms"); - setSelectedHeader("dms"); - setBreadcrumbs([ - { - link: "/manage/accounting/receivables", - label: t("titles.bc.accounting-receivables"), - }, - { - link: "/manage/dms", - label: t("titles.bc.dms"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); - - useEffect(() => { - socket.on("connect", () => socket.emit("set-log-level", logLevel)); - socket.on("reconnect", () => { - setLogs((logs) => { - return [ - ...logs, - { - timestamp: new Date(), - level: "WARNING", - message: "Reconnected to CDK Export Service", - }, - ]; - }); - }); - socket.on("connect_error", (err) => { - console.log(`connect_error due to ${err}`, err); - notification.error({ message: err.message }); - }); - socket.on("log-event", (payload) => { - setLogs((logs) => { - return [...logs, payload]; - }); - }); - socket.on("export-success", (payload) => { - notification.success({ - message: t("jobs.successes.exported"), - }); - history.push("/manage/accounting/receivables"); + const {loading, error, data} = useQuery(QUERY_JOB_EXPORT_DMS, { + variables: {id: jobId}, + skip: !jobId, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); + const logsRef = useRef(null); - if (socket.disconnected) socket.connect(); - return () => { - socket.removeAllListeners(); - socket.disconnect(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + useEffect(() => { + document.title = t("titles.dms"); + setSelectedHeader("dms"); + setBreadcrumbs([ + { + link: "/manage/accounting/receivables", + label: t("titles.bc.accounting-receivables"), + }, + { + link: "/manage/dms", + label: t("titles.bc.dms"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - if (loading) return ; - if (error) return ; + useEffect(() => { + socket.on("connect", () => socket.emit("set-log-level", logLevel)); + socket.on("reconnect", () => { + setLogs((logs) => { + return [ + ...logs, + { + timestamp: new Date(), + level: "WARNING", + message: "Reconnected to CDK Export Service", + }, + ]; + }); + }); + socket.on("connect_error", (err) => { + console.log(`connect_error due to ${err}`, err); + notification.error({message: err.message}); + }); + socket.on("log-event", (payload) => { + setLogs((logs) => { + return [...logs, payload]; + }); + }); + socket.on("export-success", (payload) => { + notification.success({ + message: t("jobs.successes.exported"), + }); + history("/manage/accounting/receivables"); + }); - if ( - !jobId || - !(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) || - !(data && data.jobs_by_pk) - ) - return ; + if (socket.disconnected) socket.connect(); + return () => { + socket.removeAllListeners(); + socket.disconnect(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); - if (data.jobs_by_pk && data.jobs_by_pk.date_exported) - return ; + if (loading) return ; + if (error) return ; - return ( -
    - -
    - + if ( + !jobId || + !(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) || + !(data && data.jobs_by_pk) + ) + return ; + + if (data.jobs_by_pk && data.jobs_by_pk.date_exported) + return ; + + return ( +
    + +
    + {`${ - data && data.jobs_by_pk && data.jobs_by_pk.ro_number + data && data.jobs_by_pk && data.jobs_by_pk.ro_number }`} - {` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${ - data.jobs_by_pk.v_model_yr || "" - } ${data.jobs_by_pk.v_make_desc || ""} ${ - data.jobs_by_pk.v_model_desc || "" - }`} + {` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${ + data.jobs_by_pk.v_model_yr || "" + } ${data.jobs_by_pk.v_make_desc || ""} ${ + data.jobs_by_pk.v_model_desc || "" + }`} - } - socket={socket} - jobId={jobId} - /> - - - - + } + socket={socket} + jobId={jobId} + /> + + + + - + - -
    - - - - - - } - > - - -
    - - - - ); + +
    + + + + + + } + > + + +
    + + + + ); } export const determineDmsType = (bodyshop) => { - if (bodyshop.cdk_dealerid) return "cdk"; - else { - return "pbs"; - } + if (bodyshop.cdk_dealerid) return "cdk"; + else { + return "pbs"; + } }; diff --git a/client/src/pages/export-logs/export-logs.page.component.jsx b/client/src/pages/export-logs/export-logs.page.component.jsx index 7ae8977cf..9c03dd674 100644 --- a/client/src/pages/export-logs/export-logs.page.component.jsx +++ b/client/src/pages/export-logs/export-logs.page.component.jsx @@ -1,197 +1,197 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Checkbox, Input, Space, Table, Typography } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Checkbox, Input, Space, Table, Typography} from "antd"; import _ from "lodash"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_EXPORT_LOG_PAGINATED } from "../../graphql/accounting.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import {QUERY_EXPORT_LOG_PAGINATED} from "../../graphql/accounting.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {DateTimeFormatter} from "../../utils/DateFormatter"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function ExportLogsPageComponent({ bodyshop }) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, search } = searchParams; - const history = useHistory(); +export function ExportLogsPageComponent({bodyshop}) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, search} = searchParams; + const history = useNavigate(); - const { loading, error, data, refetch } = useQuery( - QUERY_EXPORT_LOG_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "created_at"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); + const {loading, error, data, refetch} = useQuery( + QUERY_EXPORT_LOG_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + search: search || "", + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "created_at"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); - const { t } = useTranslation(); + const {t} = useTranslation(); - if (error) return ; + if (error) return ; - const handleTableChange = (pagination, filters, sorter) => { - searchParams.page = pagination.current; - searchParams.sortcolumn = sorter.columnKey; - searchParams.sortorder = sorter.order; - if (filters.status) { - searchParams.statusFilters = JSON.stringify( - _.flattenDeep(filters.status) - ); - } else { - delete searchParams.statusFilters; - } - history.push({ search: queryString.stringify(searchParams) }); - }; + const handleTableChange = (pagination, filters, sorter) => { + searchParams.page = pagination.current; + searchParams.sortcolumn = sorter.columnKey; + searchParams.sortorder = sorter.order; + if (filters.status) { + searchParams.statusFilters = JSON.stringify( + _.flattenDeep(filters.status) + ); + } else { + delete searchParams.statusFilters; + } + history({search: queryString.stringify(searchParams)}); + }; - const columns = [ - { - title: t("general.labels.created_at"), - dataIndex: "created_at", - key: "created_at", - render: (text, record) => ( - {record.created_at} - ), - }, - { - title: t("employees.fields.user_email"), - dataIndex: "useremail", - key: "useremail", - }, - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", + const columns = [ + { + title: t("general.labels.created_at"), + dataIndex: "created_at", + key: "created_at", + render: (text, record) => ( + {record.created_at} + ), + }, + { + title: t("employees.fields.user_email"), + dataIndex: "useremail", + key: "useremail", + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", - render: (text, record) => - record.job && ( - - {(record.job && record.job.ro_number) || t("general.labels.na")} - - ), - }, - { - title: t("bills.fields.invoice_number"), - dataIndex: "invoice_number", - key: "invoice_number", - render: (text, record) => - record.bill && ( - - {record.bill && record.bill.invoice_number} - - ), - }, - { - title: t("payments.fields.paymentnum"), - dataIndex: "paymentnum", - key: "paymentnum", - render: (text, record) => - record.payment && ( - + ), + }, + { + title: t("bills.fields.invoice_number"), + dataIndex: "invoice_number", + key: "invoice_number", + render: (text, record) => + record.bill && ( + + {record.bill && record.bill.invoice_number} + + ), + }, + { + title: t("payments.fields.paymentnum"), + dataIndex: "paymentnum", + key: "paymentnum", + render: (text, record) => + record.payment && ( + ( + + ), + }, + { + title: t("general.labels.message"), + dataIndex: "message", + key: "message", + render: (text, record) => + record.message && ( +
    +
      + {JSON.parse(record.message).map((m, idx) => ( +
    • {m}
    • + ))} +
    +
    + ), + }, + ]; + + return ( + + {searchParams.search && ( + <> + + {t("general.labels.searchresults", { + search: searchParams.search, + })} + + + + )} + + { + searchParams.search = value; + history({search: queryString.stringify(searchParams)}); + }} + /> + } - > - {record.payment && record.payment.paymentnum} - - ), - }, - { - title: t("general.labels.successful"), - dataIndex: "successful", - key: "successful", - render: (text, record) => ( - - ), - }, - { - title: t("general.labels.message"), - dataIndex: "message", - key: "message", - render: (text, record) => - record.message && ( -
    -
      - {JSON.parse(record.message).map((m, idx) => ( -
    • {m}
    • - ))} -
    -
    - ), - }, - ]; - - return ( - - {searchParams.search && ( - <> - - {t("general.labels.searchresults", { - search: searchParams.search, - })} - -
    - {t("general.actions.clear")} - - - )} - - { - searchParams.search = value; - history.push({ search: queryString.stringify(searchParams) }); - }} - /> - - } - > -
    - - ); + columns={columns} + rowKey="id" + dataSource={data && data.search_exportlog} + style={{height: "100%"}} + scroll={{x: true}} + onChange={handleTableChange} + /> + + ); } export default connect(mapStateToProps, null)(ExportLogsPageComponent); diff --git a/client/src/pages/export-logs/export-logs.page.container.jsx b/client/src/pages/export-logs/export-logs.page.container.jsx index 350d9295b..279363bae 100644 --- a/client/src/pages/export-logs/export-logs.page.container.jsx +++ b/client/src/pages/export-logs/export-logs.page.container.jsx @@ -1,36 +1,34 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import ExportLogsPage from "./export-logs.page.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function ExportsLogPageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function ExportsLogPageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.export-logs"); - setSelectedHeader("export-logs"); - setBreadcrumbs([ - { - link: "/manage/accounting/exportlogs", - label: t("titles.bc.export-logs"), - }, - ]); - }, [setBreadcrumbs, t, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.export-logs"); + setSelectedHeader("export-logs"); + setBreadcrumbs([ + { + link: "/manage/accounting/exportlogs", + label: t("titles.bc.export-logs"), + }, + ]); + }, [setBreadcrumbs, t, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(ExportsLogPageContainer); diff --git a/client/src/pages/help/help.page.jsx b/client/src/pages/help/help.page.jsx index ef9e269e8..78df4e288 100644 --- a/client/src/pages/help/help.page.jsx +++ b/client/src/pages/help/help.page.jsx @@ -2,9 +2,9 @@ import React from "react"; import HelpRescue from "../../components/help-rescue/help-rescue.component"; export default function HelpPage() { - return ( -
    - -
    - ); + return ( +
    + +
    + ); } diff --git a/client/src/pages/inventory/inventory.page.jsx b/client/src/pages/inventory/inventory.page.jsx index f7c4eca31..f8e4849a0 100644 --- a/client/src/pages/inventory/inventory.page.jsx +++ b/client/src/pages/inventory/inventory.page.jsx @@ -1,34 +1,31 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import InventoryList from "../../components/inventory-list/inventory-list.container"; import InventoryUpsertModalContainer from "../../components/inventory-upsert-modal/inventory-upsert-modal.container"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function InventoryPage({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function InventoryPage({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.inventory"); - setSelectedHeader("inventory"); - setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.inventory") }]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.inventory"); + setSelectedHeader("inventory"); + setBreadcrumbs([{link: "/manage/jobs", label: t("titles.bc.inventory")}]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - - ); + return ( + + + + + ); } export default connect(null, mapDispatchToProps)(InventoryPage); diff --git a/client/src/pages/jobs-admin/jobs-admin.page.jsx b/client/src/pages/jobs-admin/jobs-admin.page.jsx index 0d08e5114..fb259a1c7 100644 --- a/client/src/pages/jobs-admin/jobs-admin.page.jsx +++ b/client/src/pages/jobs-admin/jobs-admin.page.jsx @@ -1,9 +1,9 @@ -import { useQuery } from "@apollo/client"; -import { Card, Col, Result, Row, Space, Typography } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useParams } from "react-router-dom"; +import {useQuery} from "@apollo/client"; +import {Card, Col, Result, Row, Space, Typography} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import JobCalculateTotals from "../../components/job-calculate-totals/job-calculate-totals.component"; import ScoreboardAddButton from "../../components/job-scoreboard-add-button/job-scoreboard-add-button.component"; @@ -11,125 +11,125 @@ import JobsAdminClass from "../../components/jobs-admin-class/jobs-admin-class.c import JobsAdminDatesChange from "../../components/jobs-admin-dates/jobs-admin-dates.component"; import JobsAdminDeleteIntake from "../../components/jobs-admin-delete-intake/jobs-admin-delete-intake.component"; import JobsAdminMarkReexport from "../../components/jobs-admin-mark-reexport/jobs-admin-mark-reexport.component"; -import JobAdminOwnerReassociate from "../../components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component"; +import JobAdminOwnerReassociate + from "../../components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component"; import JobsAdminUnvoid from "../../components/jobs-admin-unvoid/jobs-admin-unvoid.component"; -import JobAdminVehicleReassociate from "../../components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component"; +import JobAdminVehicleReassociate + from "../../components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import JobsAdminStatus from "../../components/jobs-admin-change-status/jobs-admin-change.status.component"; import NotFound from "../../components/not-found/not-found.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { GET_JOB_BY_PK } from "../../graphql/jobs.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {GET_JOB_BY_PK} from "../../graphql/jobs.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); const colSpan = { - sm: { span: 24 }, - md: { span: 12 }, - lg: { span: 8 }, - xl: { span: 6 }, + sm: {span: 24}, + md: {span: 12}, + lg: {span: 8}, + xl: {span: 6}, }; const cardStyle = { - height: "100%", + height: "100%", }; -export function JobsCloseContainer({ setBreadcrumbs, setSelectedHeader }) { - const { jobId } = useParams(); - const { loading, error, data } = useQuery(GET_JOB_BY_PK, { - variables: { id: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { t } = useTranslation(); - useEffect(() => { - setSelectedHeader("activejobs"); - document.title = t("titles.jobs-admin", { - ro_number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, +export function JobsCloseContainer({setBreadcrumbs, setSelectedHeader}) { + const {jobId} = useParams(); + const {loading, error, data} = useQuery(GET_JOB_BY_PK, { + variables: {id: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); + const {t} = useTranslation(); + useEffect(() => { + setSelectedHeader("activejobs"); + document.title = t("titles.jobs-admin", { + ro_number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, + }); - setBreadcrumbs([ - { - link: `/manage/jobs/`, - label: t("titles.bc.jobs"), - }, - { - link: `/manage/jobs/${jobId}/`, - label: t("titles.bc.jobs-detail", { - number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, - }), - }, - { - link: `/manage/jobs/${jobId}/admin`, - label: t("titles.bc.jobs-admin"), - }, - ]); - }, [setBreadcrumbs, t, jobId, data, setSelectedHeader]); + setBreadcrumbs([ + { + link: `/manage/jobs/`, + label: t("titles.bc.jobs"), + }, + { + link: `/manage/jobs/${jobId}/`, + label: t("titles.bc.jobs-detail", { + number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, + }), + }, + { + link: `/manage/jobs/${jobId}/admin`, + label: t("titles.bc.jobs-admin"), + }, + ]); + }, [setBreadcrumbs, t, jobId, data, setSelectedHeader]); + + if (loading) return ; + if (error) return ; + if (!!!data.jobs_by_pk) return ; + if (!data.jobs_by_pk.job_totals) + return ( + } + /> + ); - if (loading) return ; - if (error) return ; - if (!!!data.jobs_by_pk) return ; - if (!data.jobs_by_pk.job_totals) return ( - } - /> + + + {t("jobs.labels.adminwarning")} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); - - return ( - - - {t("jobs.labels.adminwarning")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); } + export default connect(null, mapDispatchToProps)(JobsCloseContainer); diff --git a/client/src/pages/jobs-all/jobs-all.container.jsx b/client/src/pages/jobs-all/jobs-all.container.jsx index b9fa9a52a..ae18d35b1 100644 --- a/client/src/pages/jobs-all/jobs-all.container.jsx +++ b/client/src/pages/jobs-all/jobs-all.container.jsx @@ -1,77 +1,74 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import JobsListPaginated from "../../components/jobs-list-paginated/jobs-list-paginated.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED } from "../../graphql/jobs.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED} from "../../graphql/jobs.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - //bodyshop: selectBodyshop, + //bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function AllJobs({ setBreadcrumbs, setSelectedHeader }) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, statusFilters } = searchParams; +export function AllJobs({setBreadcrumbs, setSelectedHeader}) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, statusFilters} = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - ...(statusFilters ? { statusList: JSON.parse(statusFilters) } : {}), - order: [ - { - [sortcolumn || "ro_number"]: - sortorder && sortorder !== "false" - ? (sortorder === "descend" - ? "desc" - : "asc") - : "desc", - }, - ], - }, - } - ); - const { t } = useTranslation(); + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + ...(statusFilters ? {statusList: JSON.parse(statusFilters)} : {}), + order: [ + { + [sortcolumn || "ro_number"]: + sortorder && sortorder !== "false" + ? (sortorder === "descend" + ? "desc" + : "asc") + : "desc", + }, + ], + }, + } + ); + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.jobs-all"); - setSelectedHeader("alljobs"); - setBreadcrumbs([ - { link: "/manage/jobs/all", label: t("titles.bc.jobs-all") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.jobs-all"); + setSelectedHeader("alljobs"); + setBreadcrumbs([ + {link: "/manage/jobs/all", label: t("titles.bc.jobs-all")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - if (error) return ; - return ( - - - - ); + if (error) return ; + return ( + + + + ); } export default connect(mapStateToProps, mapDispatchToProps)(AllJobs); diff --git a/client/src/pages/jobs-available/jobs-available.page.container.jsx b/client/src/pages/jobs-available/jobs-available.page.container.jsx index eaa14b4be..3077bbd6f 100644 --- a/client/src/pages/jobs-available/jobs-available.page.container.jsx +++ b/client/src/pages/jobs-available/jobs-available.page.container.jsx @@ -1,65 +1,65 @@ -import { Button, PageHeader } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {Button} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import JobsAvailableTableContainer from "../../components/jobs-available-table/jobs-available-table.container"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectPartnerVersion } from "../../redux/application/application.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectPartnerVersion} from "../../redux/application/application.selectors"; const mapStateToProps = createStructuredSelector({ - partnerVersion: selectPartnerVersion, + partnerVersion: selectPartnerVersion, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function JobsAvailablePageContainer({ - partnerVersion, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); + partnerVersion, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.jobsavailable"); - setSelectedHeader("availablejobs"); - setBreadcrumbs([ - { link: "/manage/available", label: t("titles.bc.availablejobs") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.jobsavailable"); + setSelectedHeader("availablejobs"); + setBreadcrumbs([ + {link: "/manage/available", label: t("titles.bc.availablejobs")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - -
    - - - - } - /> - {!partnerVersion && ( - - )} - -
    -
    - ); + return ( + +
    + + + + } + /> + {!partnerVersion && ( + + )} + +
    +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsAvailablePageContainer); diff --git a/client/src/pages/jobs-checklist-view/jobs-checklist-view.page.jsx b/client/src/pages/jobs-checklist-view/jobs-checklist-view.page.jsx index d53a83a90..45515af2f 100644 --- a/client/src/pages/jobs-checklist-view/jobs-checklist-view.page.jsx +++ b/client/src/pages/jobs-checklist-view/jobs-checklist-view.page.jsx @@ -1,126 +1,125 @@ -import { useQuery } from "@apollo/client"; -import { Col, Row, Typography } from "antd"; -import moment from "moment"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useParams } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useQuery} from "@apollo/client"; +import {Col, Row, Typography} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; -import JobChecklistForm from "../../components/job-checklist/components/job-checklist-form/job-checklist-form.component"; +import JobChecklistForm + from "../../components/job-checklist/components/job-checklist-form/job-checklist-form.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_JOB_CHECKLISTS } from "../../graphql/jobs.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_JOB_CHECKLISTS} from "../../graphql/jobs.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function JobsChecklistViewContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); - const { jobId } = useParams(); - const { loading, error, data } = useQuery(QUERY_JOB_CHECKLISTS, { - variables: { id: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); + const {jobId} = useParams(); + const {loading, error, data} = useQuery(QUERY_JOB_CHECKLISTS, { + variables: {id: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - document.title = t("titles.jobs-checklist"); - setSelectedHeader("activejobs"); - setBreadcrumbs([ - { link: "/manage/jobs", label: t("titles.bc.jobs") }, - { - link: `/manage/jobs/${jobId}`, - label: t("titles.bc.jobs-detail", { - number: (data && data.jobs_by_pk && data.jobs_by_pk.ro_number) || "", - }), - }, - { - link: `/manage/jobs/${jobId}/checklist`, - label: t("titles.bc.jobs-checklist"), - }, - ]); - }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.jobs-checklist"); + setSelectedHeader("activejobs"); + setBreadcrumbs([ + {link: "/manage/jobs", label: t("titles.bc.jobs")}, + { + link: `/manage/jobs/${jobId}`, + label: t("titles.bc.jobs-detail", { + number: (data && data.jobs_by_pk && data.jobs_by_pk.ro_number) || "", + }), + }, + { + link: `/manage/jobs/${jobId}/checklist`, + label: t("titles.bc.jobs-checklist"), + }, + ]); + }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - //The Form is the actual config to use. + //The Form is the actual config to use. - const CompletedBy = ({ checklist }) => ( -
    -
    - {t("jobs.labels.checklistcompletedby", { - by: checklist.completed_by, - at: moment(checklist.completed_at).format("MM/DD/YYYY @ h:mm a"), - })} -
    -
    - ); + const CompletedBy = ({checklist}) => ( +
    +
    + {t("jobs.labels.checklistcompletedby", { + by: checklist.completed_by, + at: dayjs(checklist.completed_at).format("MM/DD/YYYY @ h:mm a"), + })} +
    +
    + ); - return ( - - -
    - - {t("jobs.labels.intakechecklist")} - - {data.jobs_by_pk.intakechecklist && - data.jobs_by_pk.intakechecklist.form && ( - <> - - - - )} - - - - {t("jobs.labels.deliverchecklist")} - - {data.jobs_by_pk.deliverchecklist && - data.jobs_by_pk.deliverchecklist.form && ( - <> - - - - )} - - - - ); + return ( + + + + + {t("jobs.labels.intakechecklist")} + + {data.jobs_by_pk.intakechecklist && + data.jobs_by_pk.intakechecklist.form && ( + <> + + + + )} + + + + {t("jobs.labels.deliverchecklist")} + + {data.jobs_by_pk.deliverchecklist && + data.jobs_by_pk.deliverchecklist.form && ( + <> + + + + )} + + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsChecklistViewContainer); diff --git a/client/src/pages/jobs-close/jobs-close.component.jsx b/client/src/pages/jobs-close/jobs-close.component.jsx index b6feb3ff5..828bc2f2a 100644 --- a/client/src/pages/jobs-close/jobs-close.component.jsx +++ b/client/src/pages/jobs-close/jobs-close.component.jsx @@ -1,32 +1,33 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { useApolloClient, useMutation } from "@apollo/client"; +import {DeleteFilled} from "@ant-design/icons"; +import {useApolloClient, useMutation} from "@apollo/client"; import { - Alert, - Button, - Col, - Divider, - Form, - Input, - InputNumber, - PageHeader, - Popconfirm, - Row, - Select, - Space, - Statistic, - Switch, - Typography, - notification, + Alert, + Button, + Col, + Divider, + Form, + Input, + InputNumber, + notification, + Popconfirm, + Row, + Select, + Space, + Statistic, + Switch, + Typography, } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -//import { useHistory } from "react-router-dom"; -import { useTreatments } from "@splitsoftware/splitio-react"; +import {PageHeader} from "@ant-design/pro-layout"; + +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +// import { useNavigate } from 'react-router-dom'; +import {useSplitTreatments} from "@splitsoftware/splitio-react"; import Dinero from "dinero.js"; -import moment from "moment"; -import { Link } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import dayjs from "../../utils/day"; +import {Link} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import DateTimePicker from "../../components/form-date-time-picker/form-date-time-picker.component"; import FormsFieldChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component"; import CurrencyInput from "../../components/form-items-formatted/currency-form-item.component"; @@ -34,509 +35,506 @@ import JobsScoreboardAdd from "../../components/job-scoreboard-add-button/job-sc import JobsCloseAutoAllocate from "../../components/jobs-close-auto-allocate/jobs-close-auto-allocate.component"; import JobsCloseLines from "../../components/jobs-close-lines/jobs-close-lines.component"; import LayoutFormRow from "../../components/layout-form-row/layout-form-row.component"; -import { generateJobLinesUpdatesForInvoicing } from "../../graphql/jobs-lines.queries"; -import { UPDATE_JOB } from "../../graphql/jobs.queries"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {generateJobLinesUpdatesForInvoicing} from "../../graphql/jobs-lines.queries"; +import {UPDATE_JOB} from "../../graphql/jobs.queries"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); -export function JobsCloseComponent({ job, bodyshop, jobRO, insertAuditTrail, }) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const client = useApolloClient(); - // const history = useHistory(); - const [closeJob] = useMutation(UPDATE_JOB); - const [loading, setLoading] = useState(false); - const { Qb_Multi_Ar } = useTreatments( - ["Qb_Multi_Ar"], - {}, - bodyshop && bodyshop.imexshopid - ); - const { ClosingPeriod } = useTreatments( - ["ClosingPeriod"], - {}, - bodyshop && bodyshop.imexshopid - ); +export function JobsCloseComponent({job, bodyshop, jobRO, insertAuditTrail,}) { + const {t} = useTranslation(); + const [form] = Form.useForm(); + const client = useApolloClient(); + // const history = useNavigate(); + const [closeJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); - const handleFinish = async ({ removefromproduction, ...values }) => { - setLoading(true); - const result = await client.mutate({ - mutation: generateJobLinesUpdatesForInvoicing(values.joblines), - }); - if (result.errors) { - return; // Abandon the rest of the close. - } - - const closeResult = await closeJob({ - variables: { - jobId: job.id, - job: { - status: bodyshop.md_ro_statuses.default_invoiced || "", - date_invoiced: values.date_invoiced, - actual_in: values.actual_in, - actual_completion: values.actual_completion, - actual_delivery: values.actual_delivery, - kmin: values.kmin, - kmout: values.kmout, - dms_allocation: values.dms_allocation, - ...(removefromproduction ? { inproduction: false } : {}), - ...(values.qb_multiple_payers - ? { qb_multiple_payers: values.qb_multiple_payers } - : {}), - }, - }, - refetchQueries: ["QUERY_JOB_CLOSE_DETAILS"], - awaitRefetchQueries: true, + const {treatments: {Qb_Multi_Ar, ClosingPeriod}} = useSplitTreatments({ + attributes: {}, + names: ["Qb_Multi_Ar", "ClosingPeriod"], + splitKey: bodyshop && bodyshop.imexshopid, }); - if (!result.errors) { - // notification["success"]({ message: t("jobs.successes.save") }); - // form.resetFields(); - } else { - notification["error"]({ - message: t("job.errors.saving", { - error: JSON.stringify(result.errors), - }), - }); - return; // Abandon the rest of the close. - } + const handleFinish = async ({removefromproduction, ...values}) => { + setLoading(true); + const result = await client.mutate({ + mutation: generateJobLinesUpdatesForInvoicing(values.joblines), + }); + if (result.errors) { + return; // Abandon the rest of the close. + } - if (!closeResult.errors) { - setLoading(false); - - notification["success"]({ - message: t("jobs.successes.closed"), - }); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobinvoiced(), - }); - // history.push(`/manage/jobs/${job.id}`); - } else { - setLoading(false); - notification["error"]({ - message: t("job.errors.closing", { - error: JSON.stringify(closeResult.errors), - }), - }); - } - form.resetFields(); - form.resetFields(); - - setLoading(false); - }; - - return ( -
    -
    - - - - form.submit()} - disabled={jobRO} - okText={t("general.labels.yes")} - cancelText={t("general.labels.no")} - title={t("jobs.labels.closeconfirm")} - > - - - {(bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid) && ( - - - - )} - - - } - /> - - - - {!job.actual_in && job.scheduled_in && ( - - )} - {!job.actual_completion && job.scheduled_completion && ( - - )} - {!job.actual_delivery && job.scheduled_delivery && ( - - )} - - - - - - - {() => { - return ( - - - - ); - }} - - - - - ({ - validator(_, value) { - if (!bodyshop.cdk_dealerid) return Promise.resolve(); - if (!value || moment(value).isSameOrAfter(moment(), "day")) { - return Promise.resolve(); - } - return Promise.reject( - new Error(t("jobs.labels.dms.invoicedatefuture")) - ); + const closeResult = await closeJob({ + variables: { + jobId: job.id, + job: { + status: bodyshop.md_ro_statuses.default_invoiced || "", + date_invoiced: values.date_invoiced, + actual_in: values.actual_in, + actual_completion: values.actual_completion, + actual_delivery: values.actual_delivery, + kmin: values.kmin, + kmout: values.kmout, + dms_allocation: values.dms_allocation, + ...(removefromproduction ? {inproduction: false} : {}), + ...(values.qb_multiple_payers + ? {qb_multiple_payers: values.qb_multiple_payers} + : {}), }, - }), - ({ getFieldValue }) => ({ - validator(_, value) { - if ( - ClosingPeriod.treatment === "on" && - bodyshop.accountingconfig.ClosingPeriod - ) { - if ( - moment(value).isSameOrAfter( - moment( - bodyshop.accountingconfig.ClosingPeriod[0] - ).startOf("day") - ) && - moment(value).isSameOrBefore( - moment( - bodyshop.accountingconfig.ClosingPeriod[1] - ).endOf("day") - ) - ) { - return Promise.resolve(); - } else { - return Promise.reject( - new Error(t("jobs.labels.closingperiod")) - ); - } - } else { - return Promise.resolve(); - } - }, - }), - ]} - > - - - {!jobRO && job.inproduction && ( - - - - )} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - ({ - validator(_, value) { - if (!value || getFieldValue("kmin") <= value) { - return Promise.resolve(); - } + }, + refetchQueries: ["QUERY_JOB_CLOSE_DETAILS"], + awaitRefetchQueries: true, + }); - return Promise.reject( - new Error(t("jobs.labels.dms.kmoutnotgreaterthankmin")) - ); - }, + if (!result.errors) { + // notification["success"]({ message: t("jobs.successes.save") }); + // form.resetFields(); + } else { + notification["error"]({ + message: t("job.errors.saving", { + error: JSON.stringify(result.errors), }), - ]} + }); + return; // Abandon the rest of the close. + } + + if (!closeResult.errors) { + setLoading(false); + + notification["success"]({ + message: t("jobs.successes.closed"), + }); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobinvoiced(), + }); + // history(`/manage/jobs/${job.id}`); + } else { + setLoading(false); + notification["error"]({ + message: t("job.errors.closing", { + error: JSON.stringify(closeResult.errors), + }), + }); + } + form.resetFields(); + form.resetFields(); + + setLoading(false); + }; + + return ( +
    + - - - )} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - - {t("jobs.labels.multipayers")} - {Qb_Multi_Ar.treatment === "on" && ( - -
    - ({ - validator(_, value) { - let totalAllocated = Dinero(); - - const payers = form.getFieldValue("qb_multiple_payers"); - payers && - payers.forEach((payer) => { - totalAllocated = totalAllocated.add( - Dinero({ - amount: Math.round((payer?.amount || 0) * 100), - }) - ); - }); - const discrep = job.job_totals - ? Dinero(job.job_totals.totals.total_repairs).subtract( - totalAllocated - ) - : Dinero(); - return discrep.getAmount() >= 0 - ? Promise.resolve() - : Promise.reject( - new Error( - t("jobs.labels.additionalpayeroverallocation") - ) - ); - }, - }), - ]} - > - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - - - - - - - - - - - { - remove(field.name); - }} + + - - - ))} - - - -
    - ); - }} -
    - - - - {() => { - //Perform Calculation to determine discrepancy. - let totalAllocated = Dinero(); - const payers = form.getFieldValue("qb_multiple_payers"); - payers && - payers.forEach((payer) => { - totalAllocated = totalAllocated.add( - Dinero({ - amount: Math.round((payer?.amount || 0) * 100), - }) - ); - }); - const discrep = job.job_totals - ? Dinero(job.job_totals.totals.total_repairs).subtract( - totalAllocated - ) - : Dinero(); - return ( - - - - - - - - = - 0 ? "green" : "red", + form.submit()} + disabled={jobRO} + okText={t("general.labels.yes")} + cancelText={t("general.labels.no")} + title={t("jobs.labels.closeconfirm")} + > + + + {(bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid) && ( + + + + )} + + + } + /> + + + + {!job.actual_in && job.scheduled_in && ( + + )} + {!job.actual_completion && job.scheduled_completion && ( + + )} + {!job.actual_delivery && job.scheduled_delivery && ( + + )} + + + + + + + {() => { + return ( + + + + ); }} - value={discrep.toFormat()} - /> - - ); - }} - - - - )} - - - - - ); + + + + + ({ + validator(_, value) { + if (!bodyshop.cdk_dealerid) return Promise.resolve(); + if (!value || dayjs(value).isSameOrAfter(dayjs(), "day")) { + return Promise.resolve(); + } + return Promise.reject( + new Error(t("jobs.labels.dms.invoicedatefuture")) + ); + }, + }), + ({getFieldValue}) => ({ + validator(_, value) { + if ( + ClosingPeriod.treatment === "on" && + bodyshop.accountingconfig.ClosingPeriod + ) { + if ( + dayjs(value).isSameOrAfter( + dayjs( + bodyshop.accountingconfig.ClosingPeriod[0] + ).startOf("day") + ) && + dayjs(value).isSameOrBefore( + dayjs( + bodyshop.accountingconfig.ClosingPeriod[1] + ).endOf("day") + ) + ) { + return Promise.resolve(); + } else { + return Promise.reject( + new Error(t("jobs.labels.closingperiod")) + ); + } + } else { + return Promise.resolve(); + } + }, + }), + ]} + > + + + {!jobRO && job.inproduction && ( + + + + )} + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + ({ + validator(_, value) { + if (!value || getFieldValue("kmin") <= value) { + return Promise.resolve(); + } + + return Promise.reject( + new Error(t("jobs.labels.dms.kmoutnotgreaterthankmin")) + ); + }, + }), + ]} + > + + + )} + {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + + + )} + + {t("jobs.labels.multipayers")} + {Qb_Multi_Ar.treatment === "on" && ( + + + ({ + validator(_, value) { + let totalAllocated = Dinero(); + + const payers = form.getFieldValue("qb_multiple_payers"); + payers && + payers.forEach((payer) => { + totalAllocated = totalAllocated.add( + Dinero({ + amount: Math.round((payer?.amount || 0) * 100), + }) + ); + }); + const discrep = job.job_totals + ? Dinero(job.job_totals.totals.total_repairs).subtract( + totalAllocated + ) + : Dinero(); + return discrep.getAmount() >= 0 + ? Promise.resolve() + : Promise.reject( + new Error( + t("jobs.labels.additionalpayeroverallocation") + ) + ); + }, + }), + ]} + > + {(fields, {add, remove}) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
    + ); + }} +
    + + + + {() => { + //Perform Calculation to determine discrepancy. + let totalAllocated = Dinero(); + + const payers = form.getFieldValue("qb_multiple_payers"); + payers && + payers.forEach((payer) => { + totalAllocated = totalAllocated.add( + Dinero({ + amount: Math.round((payer?.amount || 0) * 100), + }) + ); + }); + const discrep = job.job_totals + ? Dinero(job.job_totals.totals.total_repairs).subtract( + totalAllocated + ) + : Dinero(); + return ( + + + + + - + + = + 0 ? "green" : "red", + }} + value={discrep.toFormat()} + /> + + ); + }} + + + + )} + + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsCloseComponent); diff --git a/client/src/pages/jobs-close/jobs-close.container.jsx b/client/src/pages/jobs-close/jobs-close.container.jsx index fdd6afa0f..d8222bbbe 100644 --- a/client/src/pages/jobs-close/jobs-close.container.jsx +++ b/client/src/pages/jobs-close/jobs-close.container.jsx @@ -1,88 +1,85 @@ -import { useQuery } from "@apollo/client"; -import { Result } from "antd"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useParams } from "react-router-dom"; +import {useQuery} from "@apollo/client"; +import {Result} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import JobCalculateTotals from "../../components/job-calculate-totals/job-calculate-totals.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import NotFound from "../../components/not-found/not-found.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_JOB_CLOSE_DETAILS } from "../../graphql/jobs.queries"; -import { - setBreadcrumbs, - setJobReadOnly, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {QUERY_JOB_CLOSE_DETAILS} from "../../graphql/jobs.queries"; +import {setBreadcrumbs, setJobReadOnly, setSelectedHeader,} from "../../redux/application/application.actions"; import IsJobReadOnly from "../../utils/jobReadOnly"; import JobsCloseComponent from "./jobs-close.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), - setJobReadOnly: (bool) => dispatch(setJobReadOnly(bool)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setJobReadOnly: (bool) => dispatch(setJobReadOnly(bool)), }); export function JobsCloseContainer({ - setBreadcrumbs, - setSelectedHeader, - setJobReadOnly, -}) { - const { jobId } = useParams(); - const { loading, error, data } = useQuery(QUERY_JOB_CLOSE_DETAILS, { - variables: { id: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { t } = useTranslation(); - useEffect(() => { - if (data && data.jobs_by_pk) { - setJobReadOnly(IsJobReadOnly(data.jobs_by_pk)); - } - }, [data, setJobReadOnly]); - useEffect(() => { - setSelectedHeader("activejobs"); - document.title = t("titles.jobs-close", { - number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, + setBreadcrumbs, + setSelectedHeader, + setJobReadOnly, + }) { + const {jobId} = useParams(); + const {loading, error, data} = useQuery(QUERY_JOB_CLOSE_DETAILS, { + variables: {id: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); + const {t} = useTranslation(); + useEffect(() => { + if (data && data.jobs_by_pk) { + setJobReadOnly(IsJobReadOnly(data.jobs_by_pk)); + } + }, [data, setJobReadOnly]); + useEffect(() => { + setSelectedHeader("activejobs"); + document.title = t("titles.jobs-close", { + number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, + }); - setBreadcrumbs([ - { - link: `/manage/jobs/${jobId}/`, - label: t("titles.bc.jobs"), - }, - { - link: `/manage/jobs/${jobId}/`, - label: t("titles.bc.jobs-detail", { - number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, - }), - }, - { - link: `/manage/jobs/${jobId}/close`, - label: t("titles.bc.jobs-close"), - }, - ]); - }, [setBreadcrumbs, t, jobId, data, setSelectedHeader]); + setBreadcrumbs([ + { + link: `/manage/jobs/${jobId}/`, + label: t("titles.bc.jobs"), + }, + { + link: `/manage/jobs/${jobId}/`, + label: t("titles.bc.jobs-detail", { + number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, + }), + }, + { + link: `/manage/jobs/${jobId}/close`, + label: t("titles.bc.jobs-close"), + }, + ]); + }, [setBreadcrumbs, t, jobId, data, setSelectedHeader]); - if (loading) return ; - if (error) return ; - if (!!!data.jobs_by_pk) return ; + if (loading) return ; + if (error) return ; + if (!!!data.jobs_by_pk) return ; + + if (!data.jobs_by_pk.job_totals) + return ( + } + /> + ); - if (!data.jobs_by_pk.job_totals) return ( - } - /> + +
    + +
    +
    ); - - return ( - -
    - -
    -
    - ); } + export default connect(null, mapDispatchToProps)(JobsCloseContainer); diff --git a/client/src/pages/jobs-create/jobs-create.component.jsx b/client/src/pages/jobs-create/jobs-create.component.jsx index 0bbe98f95..ffb329cc7 100644 --- a/client/src/pages/jobs-create/jobs-create.component.jsx +++ b/client/src/pages/jobs-create/jobs-create.component.jsx @@ -1,155 +1,158 @@ -import { Button, PageHeader, Result, Space, Steps } from "antd"; -import React, { useContext, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import {Button, Result, Space, Steps} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + +import React, {useContext, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {Link} from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import JobsCreateJobsInfo from "../../components/jobs-create-jobs-info/jobs-create-jobs-info.component"; import JobsCreateOwnerInfoContainer from "../../components/jobs-create-owner-info/jobs-create-owner-info.container"; -import JobsCreateVehicleInfoContainer from "../../components/jobs-create-vehicle-info/jobs-create-vehicle-info.container"; +import JobsCreateVehicleInfoContainer + from "../../components/jobs-create-vehicle-info/jobs-create-vehicle-info.container"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; -export default function JobsCreateComponent({ form }) { - const [pageIndex, setPageIndex] = useState(0); - const [errorMessage, setErrorMessage] = useState(null); - const [state] = useContext(JobCreateContext); +export default function JobsCreateComponent({form}) { + const [pageIndex, setPageIndex] = useState(0); + const [errorMessage, setErrorMessage] = useState(null); + const [state] = useContext(JobCreateContext); - const { t } = useTranslation(); - const steps = [ - { - title: t("jobs.labels.create.vehicleinfo"), - content: , - validation: - !!state.vehicle.new || - !!state.vehicle.selectedid || - !!state.vehicle.none, - error: t("vehicles.errors.selectexistingornew"), - }, - { - title: t("jobs.labels.create.ownerinfo"), - content: , - validation: !!state.owner.new || !!state.owner.selectedid, - error: t("owners.errors.selectexistingornew"), - }, - { - title: t("jobs.labels.create.jobinfo"), - content: , - }, - ]; + const {t} = useTranslation(); + const steps = [ + { + title: t("jobs.labels.create.vehicleinfo"), + content: , + validation: + !!state.vehicle.new || + !!state.vehicle.selectedid || + !!state.vehicle.none, + error: t("vehicles.errors.selectexistingornew"), + }, + { + title: t("jobs.labels.create.ownerinfo"), + content: , + validation: !!state.owner.new || !!state.owner.selectedid, + error: t("owners.errors.selectexistingornew"), + }, + { + title: t("jobs.labels.create.jobinfo"), + content: , + }, + ]; - const next = () => { - setPageIndex(pageIndex + 1); - }; - const prev = () => { - setPageIndex(pageIndex - 1); - }; - const { Step } = Steps; + const next = () => { + setPageIndex(pageIndex + 1); + }; + const prev = () => { + setPageIndex(pageIndex - 1); + }; + const {Step} = Steps; - const ProgressButtons = ({ top }) => { - return ( - - {pageIndex > 0 && } - {pageIndex < steps.length - 1 && ( - - )} - {pageIndex === steps.length - 1 && ( - - )} - - } - > - {top && ( - - {steps.map((item, idx) => ( - { - form - .validateFields() - .then((r) => { - if (steps[pageIndex].validation) { - setErrorMessage(null); - setPageIndex(idx); - } else { - setErrorMessage(steps[pageIndex].error); - } - }) - .catch((error) => console.log("error", error)); - }} - /> - ))} - - )} - - ); - }; - - return ( -
    - {state.created ? ( -
    - - - , - - - , - ]} - /> -
    - ) : ( -
    - - - {errorMessage ? ( -
    - -
    - ) : null} - - {steps.map((item, idx) => ( -
    { + return ( + + {pageIndex > 0 && } + {pageIndex < steps.length - 1 && ( + + )} + {pageIndex === steps.length - 1 && ( + + )} + + } > - {item.content} -
    - ))} - + {top && ( + + {steps.map((item, idx) => ( + { + form + .validateFields() + .then((r) => { + if (steps[pageIndex].validation) { + setErrorMessage(null); + setPageIndex(idx); + } else { + setErrorMessage(steps[pageIndex].error); + } + }) + .catch((error) => console.log("error", error)); + }} + /> + ))} + + )} + + ); + }; + + return ( +
    + {state.created ? ( +
    + + + , + + + , + ]} + /> +
    + ) : ( +
    + + + {errorMessage ? ( +
    + +
    + ) : null} + + {steps.map((item, idx) => ( +
    + {item.content} +
    + ))} + +
    + )}
    - )} -
    - ); + ); } diff --git a/client/src/pages/jobs-create/jobs-create.container.jsx b/client/src/pages/jobs-create/jobs-create.container.jsx index 1984f79fa..ff324b2ff 100644 --- a/client/src/pages/jobs-create/jobs-create.container.jsx +++ b/client/src/pages/jobs-create/jobs-create.container.jsx @@ -1,194 +1,193 @@ -import { useLazyQuery, useMutation } from "@apollo/client"; -import { Form, notification } from "antd"; +import {useLazyQuery, useMutation} from "@apollo/client"; +import {Form, notification} from "antd"; import _ from "lodash"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { INSERT_NEW_JOB } from "../../graphql/jobs.queries"; -import { QUERY_OWNER_FOR_JOB_CREATION } from "../../graphql/owners.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {INSERT_NEW_JOB} from "../../graphql/jobs.queries"; +import {QUERY_OWNER_FOR_JOB_CREATION} from "../../graphql/owners.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import JobsCreateComponent from "./jobs-create.component"; import JobCreateContext from "./jobs-create.context"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - const contextState = useState({ - vehicle: { - new: false, - search: "", - selectedid: null, - vehicleObj: null, - none: false, - }, - owner: { new: false, search: "", selectedid: null }, - job: null, - created: false, - error: null, - newJobId: null, - newJobEstNum: null, - }); - const [form] = Form.useForm(); - const [state, setState] = contextState; - const [insertJob] = useMutation(INSERT_NEW_JOB); - const [loadOwner, RemoteOwnerData] = useLazyQuery( - QUERY_OWNER_FOR_JOB_CREATION - ); - useEffect(() => { - if (!!state.owner.selectedid) { - loadOwner({ - variables: { id: state.owner.selectedid }, - }); - } - }, [state.owner.selectedid, loadOwner]); - - useEffect(() => { - document.title = t("titles.jobs-create"); - setSelectedHeader("newjob"); - setBreadcrumbs([ - { link: "/manage/available", label: t("titles.bc.availablejobs") }, - { - link: "/manage/jobs/new", - label: t("titles.bc.jobs-new"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); - - const runInsertJob = (job) => { - insertJob({ variables: { job: job } }) - .then((resp) => { - setState({ - ...state, - created: true, - error: null, - newJobId: resp.data.insert_jobs.returning[0].id, - }); - }) - .catch((error) => { - notification["error"]({ - message: t("jobs.errors.creating", { error: error }), - }); - setState({ ...state, error: error }); - }); - }; - - const handleFinish = (values) => { - let job = Object.assign( - {}, - values, - { date_open: new Date() }, - { date_estimated: new Date() }, - { - vehicle: - state.vehicle.selectedid || state.vehicle.none - ? null - : values.vehicle, - vehicleid: state.vehicle.selectedid || null, - }, - { - owner: state.owner.selectedid ? null : values.owner, - ownerid: state.owner.selectedid || null, - }, - { - status: bodyshop.md_ro_statuses.default_imported || "Open*", - shopid: bodyshop.id, - } +function JobsCreateContainer({bodyshop, setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + const contextState = useState({ + vehicle: { + new: false, + search: "", + selectedid: null, + vehicleObj: null, + none: false, + }, + owner: {new: false, search: "", selectedid: null}, + job: null, + created: false, + error: null, + newJobId: null, + newJobEstNum: null, + }); + const [form] = Form.useForm(); + const [state, setState] = contextState; + const [insertJob] = useMutation(INSERT_NEW_JOB); + const [loadOwner, RemoteOwnerData] = useLazyQuery( + QUERY_OWNER_FOR_JOB_CREATION ); - let ownerData; - if (!!!job.ownerid) { - ownerData = job.owner.data; - ownerData.shopid = bodyshop.id; - delete ownerData.allow_text_message; - delete ownerData.preferred_contact; - delete job.ownerid; - } else { - ownerData = _.cloneDeep(RemoteOwnerData.data.owners_by_pk); - delete ownerData.id; - delete ownerData.__typename; - } - if (!state.vehicle.none) { - if (!!!job.vehicleid) { - delete job.vehicleid; - job.vehicle.data.shopid = bodyshop.id; - job.plate_no = job.vehicle.data.plate_no; - job.plate_st = job.vehicle.data.plate_st; - job.v_vin = job.vehicle.data.v_vin; - job.v_model_yr = job.vehicle.data.v_model_yr; - job.v_model_desc = job.vehicle.data.v_model_desc; - job.v_make_desc = job.vehicle.data.v_make_desc; - job.v_color = job.vehicle.data.v_color; - } else { - job.plate_no = state.vehicle.vehicleObj.plate_no; - job.plate_st = state.vehicle.vehicleObj.plate_st; - job.v_vin = state.vehicle.vehicleObj.v_vin; - job.v_model_yr = state.vehicle.vehicleObj.v_model_yr; - job.v_model_desc = state.vehicle.vehicleObj.v_model_desc; - job.v_make_desc = state.vehicle.vehicleObj.v_make_desc; - job.v_color = state.vehicle.vehicleObj.v_color; - } - } + useEffect(() => { + if (!!state.owner.selectedid) { + loadOwner({ + variables: {id: state.owner.selectedid}, + }); + } + }, [state.owner.selectedid, loadOwner]); - job = { ...job, ...ownerData }; - - if (job.owner === null) delete job.owner; - if (job.vehicle === null) delete job.vehicle; - - runInsertJob(job); - }; - - return ( - - -
    { + document.title = t("titles.jobs-create"); + setSelectedHeader("newjob"); + setBreadcrumbs([ + {link: "/manage/available", label: t("titles.bc.availablejobs")}, + { + link: "/manage/jobs/new", + label: t("titles.bc.jobs-new"), }, - materials: bodyshop.md_responsibility_centers.cieca_pfm, - cieca_pfl: bodyshop.md_responsibility_centers.cieca_pfl, - parts_tax_rates: bodyshop.md_responsibility_centers.parts_tax_rates, - }} - > - - -
    -
    - ); + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); + + const runInsertJob = (job) => { + insertJob({variables: {job: job}}) + .then((resp) => { + setState({ + ...state, + created: true, + error: null, + newJobId: resp.data.insert_jobs.returning[0].id, + }); + }) + .catch((error) => { + notification["error"]({ + message: t("jobs.errors.creating", {error: error}), + }); + setState({...state, error: error}); + }); + }; + + const handleFinish = (values) => { + let job = Object.assign( + {}, + values, + {date_open: new Date()}, + {date_estimated: new Date()}, + { + vehicle: + state.vehicle.selectedid || state.vehicle.none + ? null + : values.vehicle, + vehicleid: state.vehicle.selectedid || null, + }, + { + owner: state.owner.selectedid ? null : values.owner, + ownerid: state.owner.selectedid || null, + }, + { + status: bodyshop.md_ro_statuses.default_imported || "Open*", + shopid: bodyshop.id, + } + ); + + let ownerData; + if (!!!job.ownerid) { + ownerData = job.owner.data; + ownerData.shopid = bodyshop.id; + delete ownerData.allow_text_message; + delete ownerData.preferred_contact; + delete job.ownerid; + } else { + ownerData = _.cloneDeep(RemoteOwnerData.data.owners_by_pk); + delete ownerData.id; + delete ownerData.__typename; + } + if (!state.vehicle.none) { + if (!!!job.vehicleid) { + delete job.vehicleid; + job.vehicle.data.shopid = bodyshop.id; + job.plate_no = job.vehicle.data.plate_no; + job.plate_st = job.vehicle.data.plate_st; + job.v_vin = job.vehicle.data.v_vin; + job.v_model_yr = job.vehicle.data.v_model_yr; + job.v_model_desc = job.vehicle.data.v_model_desc; + job.v_make_desc = job.vehicle.data.v_make_desc; + job.v_color = job.vehicle.data.v_color; + } else { + job.plate_no = state.vehicle.vehicleObj.plate_no; + job.plate_st = state.vehicle.vehicleObj.plate_st; + job.v_vin = state.vehicle.vehicleObj.v_vin; + job.v_model_yr = state.vehicle.vehicleObj.v_model_yr; + job.v_model_desc = state.vehicle.vehicleObj.v_model_desc; + job.v_make_desc = state.vehicle.vehicleObj.v_make_desc; + job.v_color = state.vehicle.vehicleObj.v_color; + } + } + + job = {...job, ...ownerData}; + + if (job.owner === null) delete job.owner; + if (job.vehicle === null) delete job.vehicle; + + runInsertJob(job); + }; + + return ( + + +
    + + +
    +
    + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsCreateContainer); diff --git a/client/src/pages/jobs-create/jobs-create.context.js b/client/src/pages/jobs-create/jobs-create.context.js index 52f2f0a9e..de9dbc488 100644 --- a/client/src/pages/jobs-create/jobs-create.context.js +++ b/client/src/pages/jobs-create/jobs-create.context.js @@ -1,3 +1,4 @@ import React from "react"; + const JobCreateContext = React.createContext(null); export default JobCreateContext; diff --git a/client/src/pages/jobs-deliver/jobs-delivery.page.container.jsx b/client/src/pages/jobs-deliver/jobs-delivery.page.container.jsx index a87038f58..f7c80855a 100644 --- a/client/src/pages/jobs-deliver/jobs-delivery.page.container.jsx +++ b/client/src/pages/jobs-deliver/jobs-delivery.page.container.jsx @@ -1,82 +1,79 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useParams } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_DELIVER_CHECKLIST } from "../../graphql/bodyshop.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_DELIVER_CHECKLIST} from "../../graphql/bodyshop.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import JobchecklistComponent from "../../components/job-checklist/job-checklist.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function JobsDeliverContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); - const { jobId } = useParams(); - const { loading, error, data } = useQuery(QUERY_DELIVER_CHECKLIST, { - variables: { shopId: bodyshop.id, jobId: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); + const {jobId} = useParams(); + const {loading, error, data} = useQuery(QUERY_DELIVER_CHECKLIST, { + variables: {shopId: bodyshop.id, jobId: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - document.title = t("titles.jobs-deliver"); - setSelectedHeader("activejobs"); - setBreadcrumbs([ - { link: "/manage/jobs", label: t("titles.bc.jobs") }, - { - link: `/manage/jobs/${jobId}`, - label: t("titles.bc.jobs-detail", { - number: (data && data.jobs_by_pk && data.jobs_by_pk.ro_number) || "", - }), - }, - { - link: `/manage/jobs/${jobId}/deliver`, - label: t("titles.bc.jobs-deliver"), - }, - ]); - }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.jobs-deliver"); + setSelectedHeader("activejobs"); + setBreadcrumbs([ + {link: "/manage/jobs", label: t("titles.bc.jobs")}, + { + link: `/manage/jobs/${jobId}`, + label: t("titles.bc.jobs-detail", { + number: (data && data.jobs_by_pk && data.jobs_by_pk.ro_number) || "", + }), + }, + { + link: `/manage/jobs/${jobId}/deliver`, + label: t("titles.bc.jobs-deliver"), + }, + ]); + }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]); - if (loading) return ; - if (error) return ; - if (data && !!!data.bodyshops_by_pk.deliverchecklist) + if (loading) return ; + if (error) return ; + if (data && !!!data.bodyshops_by_pk.deliverchecklist) + return ( + + ); return ( - + +
    + +
    +
    ); - return ( - -
    - -
    -
    - ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDeliverContainer); diff --git a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx index e27201959..193b1dcb5 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -1,31 +1,25 @@ import Icon, { - BarsOutlined, - CalendarFilled, - DollarCircleOutlined, - FileImageFilled, - HistoryOutlined, - PrinterFilled, - SyncOutlined, - ToolFilled, + BarsOutlined, + CalendarFilled, + DollarCircleOutlined, + FileImageFilled, + HistoryOutlined, + PrinterFilled, + SyncOutlined, + ToolFilled, } from "@ant-design/icons"; -import { - Button, - Divider, - Form, - PageHeader, - Space, - Tabs, - notification, -} from "antd"; +import {Button, Divider, Form, notification, Space, Tabs,} from "antd"; +import {PageHeader} from "@ant-design/pro-layout"; + import Axios from "axios"; -import moment from "moment"; +import dayjs from "../../utils/day"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { FaHardHat, FaRegStickyNote, FaShieldAlt } from "react-icons/fa"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {FaHardHat, FaRegStickyNote, FaShieldAlt} from "react-icons/fa"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component"; import JobAuditTrail from "../../components/job-audit-trail/job-audit-trail.component"; import JobsLinesContainer from "../../components/job-detail-lines/job-lines.container"; @@ -43,409 +37,364 @@ import JobsDetailPliContainer from "../../components/jobs-detail-pli/jobs-detail import JobsDetailRates from "../../components/jobs-detail-rates/jobs-detail-rates.component"; import JobsDetailTotals from "../../components/jobs-detail-totals/jobs-detail-totals.component"; import JobsDocumentsGalleryContainer from "../../components/jobs-documents-gallery/jobs-documents-gallery.container"; -import JobsDocumentsLocalGallery from "../../components/jobs-documents-local-gallery/jobs-documents-local-gallery.container"; +import JobsDocumentsLocalGallery + from "../../components/jobs-documents-local-gallery/jobs-documents-local-gallery.container"; import JobNotesContainer from "../../components/jobs-notes/jobs-notes.container"; import NoteUpsertModalComponent from "../../components/note-upsert-modal/note-upsert-modal.container"; import ScheduleJobModalContainer from "../../components/schedule-job-modal/schedule-job-modal.container"; -import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {insertAuditTrail} from "../../redux/application/application.actions"; +import {selectJobReadOnly} from "../../redux/application/application.selectors"; +import {setModalContext} from "../../redux/modals/modals.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import UndefinedToNull from "../../utils/undefinedtonull"; import _ from "lodash"; import JobProfileDataWarning from "../../components/job-profile-data-warning/job-profile-data-warning.component"; -import { DateTimeFormat } from "./../../utils/DateFormatter"; +import {DateTimeFormat} from "./../../utils/DateFormatter"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - jobRO: selectJobReadOnly, + bodyshop: selectBodyshop, + jobRO: selectJobReadOnly, }); const mapDispatchToProps = (dispatch) => ({ - setPrintCenterContext: (context) => - dispatch(setModalContext({ context: context, modal: "printCenter" })), - insertAuditTrail: ({ jobid, operation }) => - dispatch(insertAuditTrail({ jobid, operation })), + setPrintCenterContext: (context) => + dispatch(setModalContext({context: context, modal: "printCenter"})), + insertAuditTrail: ({jobid, operation}) => + dispatch(insertAuditTrail({jobid, operation})), }); + export function JobsDetailPage({ - bodyshop, - setPrintCenterContext, - jobRO, - job, - mutationUpdateJob, - handleSubmit, - insertAuditTrail, - refetch, -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const history = useHistory(); - const [loading, setLoading] = useState(false); - const search = queryString.parse(useLocation().search); + bodyshop, + setPrintCenterContext, + jobRO, + job, + mutationUpdateJob, + handleSubmit, + insertAuditTrail, + refetch, + }) { + const {t} = useTranslation(); + const [form] = Form.useForm(); + const history = useNavigate(); + const [loading, setLoading] = useState(false); + const search = queryString.parse(useLocation().search); + const formItemLayout = { + layout: "vertical", + }; - const formItemLayout = { - layout: "vertical", - }; - - useEffect(() => { - //form.setFieldsValue(transormJobToForm(job)); - form.resetFields(); - }, [form, job]); - - //useKeyboardSaveShortcut(form.submit); - - const handleFinish = async (values) => { - setLoading(true); - - const result = await mutationUpdateJob({ - variables: { - jobId: job.id, - job: { - ...UndefinedToNull(values, [ - "alt_transport", - "category", - "referral_source", - ]), - // The union and spread is required to keep values coming in from the estimating system that aren't displayed. - parts_tax_rates: _.union( - Object.keys(job.parts_tax_rates), - Object.keys(values.parts_tax_rates) - ).reduce((acc, val) => { - acc[val] = { - ...job.parts_tax_rates[val], - ...values.parts_tax_rates[val], - }; - return acc; - }, {}), - materials: _.union( - Object.keys(job.materials), - Object.keys(values.materials) - ).reduce((acc, val) => { - acc[val] = { - ...job.materials[val], - ...values.materials[val], - }; - return acc; - }, {}), - cieca_pfl: _.union( - Object.keys(job.cieca_pfl), - Object.keys(values.cieca_pfl) - ).reduce((acc, val) => { - acc[val] = { - ...job.cieca_pfl[val], - ...values.cieca_pfl[val], - }; - return acc; - }, {}), - cieca_pfo: { ...job.cieca_pfo, ...values.cieca_pfo }, - }, - }, - }); - try { - const newTotals = await Axios.post("/job/totalsssu", { - id: job.id, - }); - - if (newTotals.status !== 200 || result.errors) { - notification["error"]({ - message: t("jobs.errors.totalscalc"), - }); - } else { - notification["success"]({ - message: t("jobs.successes.savetitle"), - }); - const changedAuditFields = form.getFieldsValue( - [ - "scheduled_in", - "actual_in", - "scheduled_completion", - "actual_completion", - "scheduled_delivery", - "actual_delivery", - "date_invoiced", - "ins_co_nm", - "ded_amt", - "ded_status", - "date_exported", - "special_coverage_policy", - "ca_gst_registrant", - "ca_bc_pvrt", - "scheduled_in", - "rate_la1", - "rate_la2", - "rate_la3", - "rate_la4", - "rate_laa", - "rate_lab", - "rate_lad", - "rate_lae", - "rate_laf", - "rate_lag", - "rate_lam", - "rate_lar", - "rate_las", - "rate_lau", - "rate_ma2s", - "rate_ma2t", - "rate_ma3s", - "rate_mabl", - "rate_macs", - "rate_mapa", - "rate_mahw", - "rate_mash", - "rate_matd", - ], - (meta) => meta && meta.touched - ); - - Object.keys(changedAuditFields).forEach((key) => { - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobfieldchange( - key, - changedAuditFields[key] instanceof moment - ? DateTimeFormat(changedAuditFields[key]) - : changedAuditFields[key] - ), - }); - }); - - await refetch(); - form.setFieldsValue(transormJobToForm(job)); + useEffect(() => { + //form.setFieldsValue(transormJobToForm(job)); form.resetFields(); - } - } catch (error) { - notification["error"]({ - message: t("jobs.errors.totalscalc"), - }); - } finally { - setLoading(false); - } - }; + }, [form, job]); - const menuExtra = ( - - - - - - - - - - ); + }); + try { + const newTotals = await Axios.post("/job/totalsssu", { + id: job.id, + }); - return ( -
    - - - - -
    - window.history.back()} - title={job.ro_number || t("general.labels.na")} - extra={menuExtra} - /> - - - - - history.push({ search: `?tab=${key}` })} - tabBarStyle={{ fontWeight: "bold", borderBottom: "10px" }} - > - - - {t("menus.jobsdetail.general")} - + if (newTotals.status !== 200 || result.errors) { + notification["error"]({ + message: t("jobs.errors.totalscalc"), + }); + } else { + notification["success"]({ + message: t("jobs.successes.savetitle"), + }); + const changedAuditFields = form.getFieldsValue( + [ + "scheduled_in", + "actual_in", + "scheduled_completion", + "actual_completion", + "scheduled_delivery", + "actual_delivery", + "date_invoiced", + "ins_co_nm", + "ded_amt", + "ded_status", + "date_exported", + "special_coverage_policy", + "ca_gst_registrant", + "ca_bc_pvrt", + "scheduled_in", + "rate_la1", + "rate_la2", + "rate_la3", + "rate_la4", + "rate_laa", + "rate_lab", + "rate_lad", + "rate_lae", + "rate_laf", + "rate_lag", + "rate_lam", + "rate_lar", + "rate_las", + "rate_lau", + "rate_ma2s", + "rate_ma2t", + "rate_ma3s", + "rate_mabl", + "rate_macs", + "rate_mapa", + "rate_mahw", + "rate_mash", + "rate_matd", + ], + (meta) => meta && meta.touched + ); + + Object.keys(changedAuditFields).forEach((key) => { + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobfieldchange( + key, + changedAuditFields[key] instanceof dayjs + ? DateTimeFormat(changedAuditFields[key]) + : changedAuditFields[key] + ), + }); + }); + + await refetch(); + form.setFieldsValue(transormJobToForm(job)); + form.resetFields(); } - key="general" - > - - - - - {t("menus.jobsdetail.repairdata")} - - } - key="repairdata" - > - + + + + + - - - - {t("menus.jobsdetail.rates")} - - } - key="rates" - > - - - - - {t("menus.jobsdetail.totals")} - - } - key="totals" - > - - - - - {t("menus.jobsdetail.partssublet")} - - } - key="partssublet" - > - - - - - {t("menus.jobsdetail.labor")} - - } - key="labor" - > - - - - - {t("menus.jobsdetail.dates")} - - } - key="dates" - > - - - - - {t("jobs.labels.documents")} - - } - key="documents" - > - {bodyshop.uselocalmediaserver ? ( - - ) : ( - - )} - - - - {t("jobs.labels.notes")} - - } - key="notes" - > - - - - - {t("jobs.labels.audit")} - - } - key="audit" - > - - - - -
    - ); + + + + ); + + return ( +
    + + + + +
    + window.history.back()} + title={job.ro_number || t("general.labels.na")} + extra={menuExtra} + /> + + + + + history({search: `?tab=${key}`})} + tabBarStyle={{fontWeight: "bold", borderBottom: "10px"}} + items={[ + { + key: "general", + icon: , + label: t("menus.jobsdetail.general"), + forceRender: true, + children: , + }, + { + key: "repairdata", + icon: , + label: t("menus.jobsdetail.repairdata"), + forceRender: true, + children: ( + + ), + }, + { + key: "rates", + icon: , + label: t("menus.jobsdetail.rates"), + forceRender: true, + children: , + }, + { + key: "totals", + icon: , + label: t("menus.jobsdetail.totals"), + children: , + }, + { + key: "partssublet", + icon: , + label: t("menus.jobsdetail.partssublet"), + children: , + }, + { + key: "labor", + icon: , + label: t("menus.jobsdetail.labor"), + children: , + }, + { + key: "dates", + icon: , + label: t("menus.jobsdetail.dates"), + forceRender: true, + children: , + }, + { + key: "documents", + icon: , + label: t("jobs.labels.documents"), + children: bodyshop.uselocalmediaserver ? ( + + ) : ( + + ), + }, + { + key: "notes", + icon: , + label: t("jobs.labels.notes"), + children: , + }, + { + key: "audit", + icon: , + label: t("jobs.labels.audit"), + children: , + }, + ]} + /> + +
    + ); } + export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailPage); const transormJobToForm = (job) => { - Object.keys(job.parts_tax_rates).forEach((parttype) => { - Object.keys(job.parts_tax_rates[parttype]).forEach((key) => { - if (key.includes("tx_in")) { - if ( - job.parts_tax_rates[parttype][key] === "Y" || - job.parts_tax_rates[parttype][key] === true - ) { - job.parts_tax_rates[parttype][key] = true; - } else { - job.parts_tax_rates[parttype][key] = false; - } - } + Object.keys(job.parts_tax_rates).forEach((parttype) => { + Object.keys(job.parts_tax_rates[parttype]).forEach((key) => { + if (key.includes("tx_in")) { + if ( + job.parts_tax_rates[parttype][key] === "Y" || + job.parts_tax_rates[parttype][key] === true + ) { + job.parts_tax_rates[parttype][key] = true; + } else { + job.parts_tax_rates[parttype][key] = false; + } + } + }); }); - }); - return { - ...job, - loss_date: job.loss_date ? moment(job.loss_date) : null, - date_estimated: job.date_estimated ? moment(job.date_estimated) : null, - }; + return { + ...job, + loss_date: job.loss_date ? dayjs(job.loss_date) : null, + date_estimated: job.date_estimated ? dayjs(job.date_estimated) : null, + }; }; diff --git a/client/src/pages/jobs-detail/jobs-detail.page.container.jsx b/client/src/pages/jobs-detail/jobs-detail.page.container.jsx index 30f2d112b..791351d89 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.container.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.container.jsx @@ -1,121 +1,121 @@ -import { useMutation, useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import {useMutation, useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from 'react-router-dom'; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import SpinComponent from "../../components/loading-spinner/loading-spinner.component"; import NotFound from "../../components/not-found/not-found.component"; -import { OwnerNameDisplayFunction } from "../../components/owner-name-display/owner-name-display.component"; +import {OwnerNameDisplayFunction} from "../../components/owner-name-display/owner-name-display.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { GET_JOB_BY_PK, UPDATE_JOB } from "../../graphql/jobs.queries"; +import {GET_JOB_BY_PK, UPDATE_JOB} from "../../graphql/jobs.queries"; import { addRecentItem, setBreadcrumbs, setJobReadOnly, setSelectedHeader, } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { CreateRecentItem } from "../../utils/create-recent-item"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {CreateRecentItem} from "../../utils/create-recent-item"; import IsJobReadOnly from "../../utils/jobReadOnly"; import JobsDetailPage from "./jobs-detail.page.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - addRecentItem: (item) => dispatch(addRecentItem(item)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), - setJobReadOnly: (bool) => dispatch(setJobReadOnly(bool)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setJobReadOnly: (bool) => dispatch(setJobReadOnly(bool)), }); function JobsDetailPageContainer({ - bodyshop, - match, - setBreadcrumbs, - addRecentItem, - setSelectedHeader, - setJobReadOnly, -}) { - const { jobId } = match.params; - const { t } = useTranslation(); + setBreadcrumbs, + addRecentItem, + setSelectedHeader, + setJobReadOnly, + }) { + const {jobId} = useParams(); + const {t} = useTranslation(); - const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, { - variables: { id: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const [mutationUpdateJob] = useMutation(UPDATE_JOB); + const {loading, error, data, refetch} = useQuery(GET_JOB_BY_PK, { + variables: {id: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const [mutationUpdateJob] = useMutation(UPDATE_JOB); - useEffect(() => { - setSelectedHeader("activejobs"); - document.title = loading - ? t("titles.app") - : error - ? t("titles.app") - : t("titles.jobsdetail", { - ro_number: - (data.jobs_by_pk && data.jobs_by_pk.ro_number) || - t("general.labels.na"), - }); - setBreadcrumbs([ - { link: "/manage/jobs", label: t("titles.bc.jobs") }, - { - link: `/manage/jobs/${jobId}`, - label: t("titles.bc.jobs-detail", { - number: - (data && data.jobs_by_pk && data.jobs_by_pk.ro_number) || - t("general.labels.na"), - }), - }, + useEffect(() => { + setSelectedHeader("activejobs"); + document.title = loading + ? t("titles.app") + : error + ? t("titles.app") + : t("titles.jobsdetail", { + ro_number: + (data.jobs_by_pk && data.jobs_by_pk.ro_number) || + t("general.labels.na"), + }); + setBreadcrumbs([ + {link: "/manage/jobs", label: t("titles.bc.jobs")}, + { + link: `/manage/jobs/${jobId}`, + label: t("titles.bc.jobs-detail", { + number: + (data && data.jobs_by_pk && data.jobs_by_pk.ro_number) || + t("general.labels.na"), + }), + }, + ]); + + if (data && data.jobs_by_pk) { + setJobReadOnly(IsJobReadOnly(data.jobs_by_pk)); + + addRecentItem( + CreateRecentItem( + jobId, + "job", + + `${ + data.jobs_by_pk.ro_number || t("general.labels.na") + } | ${OwnerNameDisplayFunction(data.jobs_by_pk)}`, + `/manage/jobs/${jobId}` + ) + ); + } + }, [ + loading, + data, + t, + error, + setBreadcrumbs, + jobId, + addRecentItem, + setSelectedHeader, + setJobReadOnly, ]); - if (data && data.jobs_by_pk) { - setJobReadOnly(IsJobReadOnly(data.jobs_by_pk)); + if (loading) return ; + if (error) return ; + if (!!!data.jobs_by_pk) return ; - addRecentItem( - CreateRecentItem( - jobId, - "job", - - `${ - data.jobs_by_pk.ro_number || t("general.labels.na") - } | ${OwnerNameDisplayFunction(data.jobs_by_pk)}`, - `/manage/jobs/${jobId}` - ) - ); - } - }, [ - loading, - data, - t, - error, - setBreadcrumbs, - jobId, - addRecentItem, - setSelectedHeader, - setJobReadOnly, - ]); - - if (loading) return ; - if (error) return ; - if (!!!data.jobs_by_pk) return ; - - return data.jobs_by_pk ? ( - - - - ) : ( - - ); + return data.jobs_by_pk ? ( + + + + ) : ( + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsDetailPageContainer); diff --git a/client/src/pages/jobs-intake/jobs-intake.page.container.jsx b/client/src/pages/jobs-intake/jobs-intake.page.container.jsx index fcdbed72b..02dc48402 100644 --- a/client/src/pages/jobs-intake/jobs-intake.page.container.jsx +++ b/client/src/pages/jobs-intake/jobs-intake.page.container.jsx @@ -1,96 +1,93 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useParams } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import JobChecklist from "../../components/job-checklist/job-checklist.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { QUERY_INTAKE_CHECKLIST } from "../../graphql/bodyshop.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_INTAKE_CHECKLIST} from "../../graphql/bodyshop.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { Result } from "antd"; +import {Result} from "antd"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function JobsIntakeContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); - const { jobId } = useParams(); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); + const {jobId} = useParams(); - const { loading, error, data } = useQuery(QUERY_INTAKE_CHECKLIST, { - variables: { shopId: bodyshop.id, jobId: jobId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + const {loading, error, data} = useQuery(QUERY_INTAKE_CHECKLIST, { + variables: {shopId: bodyshop.id, jobId: jobId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - useEffect(() => { - document.title = t("titles.jobs-intake"); - setSelectedHeader("activejobs"); - setBreadcrumbs([ - { link: "/manage/jobs", label: t("titles.bc.jobs") }, - { - link: `/manage/jobs/${jobId}`, - label: t("titles.bc.jobs-detail", { - number: - data && - ((data.jobs_by_pk && data.jobs_by_pk.ro_number) || - t("general.labels.na")), - }), - }, - { - link: `/manage/jobs/${jobId}/intake`, - label: t("titles.bc.jobs-intake"), - }, - ]); - }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.jobs-intake"); + setSelectedHeader("activejobs"); + setBreadcrumbs([ + {link: "/manage/jobs", label: t("titles.bc.jobs")}, + { + link: `/manage/jobs/${jobId}`, + label: t("titles.bc.jobs-detail", { + number: + data && + ((data.jobs_by_pk && data.jobs_by_pk.ro_number) || + t("general.labels.na")), + }), + }, + { + link: `/manage/jobs/${jobId}/intake`, + label: t("titles.bc.jobs-intake"), + }, + ]); + }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; + + if (data && !!!data.bodyshops_by_pk.intakechecklist) + return ( + + ); - if (data && !!!data.bodyshops_by_pk.intakechecklist) return ( - + +
    + {!!data.jobs_by_pk.intakechecklist || + !bodyshop.md_ro_statuses.pre_production_statuses.includes( + data.jobs_by_pk.status + ) ? ( + + ) : ( + + )} +
    +
    ); - - return ( - -
    - {!!data.jobs_by_pk.intakechecklist || - !bodyshop.md_ro_statuses.pre_production_statuses.includes( - data.jobs_by_pk.status - ) ? ( - - ) : ( - - )} -
    -
    - ); } export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(JobsIntakeContainer); diff --git a/client/src/pages/jobs-ready/jobs-ready.page.jsx b/client/src/pages/jobs-ready/jobs-ready.page.jsx index e2f6662e7..664ba2f7c 100644 --- a/client/src/pages/jobs-ready/jobs-ready.page.jsx +++ b/client/src/pages/jobs-ready/jobs-ready.page.jsx @@ -1,36 +1,33 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import JobDetailCards from "../../components/job-detail-cards/job-detail-cards.component"; import JobsReadyList from "../../components/jobs-ready-list/jobs-ready-list.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function JobsReadyPage({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function JobsReadyPage({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.readyjobs"); - setSelectedHeader("readyjobs"); - setBreadcrumbs([ - { link: "/manage/jobs", label: t("titles.bc.jobs-ready") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.readyjobs"); + setSelectedHeader("readyjobs"); + setBreadcrumbs([ + {link: "/manage/jobs", label: t("titles.bc.jobs-ready")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - - ); + return ( + + + + + ); } export default connect(null, mapDispatchToProps)(JobsReadyPage); diff --git a/client/src/pages/jobs/jobs.page.jsx b/client/src/pages/jobs/jobs.page.jsx index 865d8a6f7..680801f79 100644 --- a/client/src/pages/jobs/jobs.page.jsx +++ b/client/src/pages/jobs/jobs.page.jsx @@ -1,36 +1,33 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import JobDetailCards from "../../components/job-detail-cards/job-detail-cards.component"; import JobsList from "../../components/jobs-list/jobs-list.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function JobsPage({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function JobsPage({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.jobs"); - setSelectedHeader("activejobs"); - setBreadcrumbs([ - { link: "/manage/jobs", label: t("titles.bc.jobs-active") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.jobs"); + setSelectedHeader("activejobs"); + setBreadcrumbs([ + {link: "/manage/jobs", label: t("titles.bc.jobs-active")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - - ); + return ( + + + + + ); } export default connect(null, mapDispatchToProps)(JobsPage); diff --git a/client/src/pages/landing/landing.page.jsx b/client/src/pages/landing/landing.page.jsx index 9677488e6..1877c90b2 100644 --- a/client/src/pages/landing/landing.page.jsx +++ b/client/src/pages/landing/landing.page.jsx @@ -1,19 +1,24 @@ -import React from "react"; -import { connect } from "react-redux"; -import { Redirect } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; +import React, {useEffect} from "react"; +import {connect} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; +import {selectCurrentUser} from "../../redux/user/user.selectors"; import LandingPageStatic from "../../landing/index"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, + currentUser: selectCurrentUser, }); export default connect(mapStateToProps, null)(LandingPage); -export function LandingPage({ currentUser }) { - if (currentUser.authorized) return ; +export function LandingPage({currentUser}) { + const navigate = useNavigate(); - return ; - //return ; + useEffect(() => { + if (currentUser.authorized) { + navigate('/manage/jobs'); + } + }, [currentUser, navigate]); + + return ; } diff --git a/client/src/pages/manage-root/manage-root.page.component.jsx b/client/src/pages/manage-root/manage-root.page.component.jsx index 1d15268f2..57d1b4853 100644 --- a/client/src/pages/manage-root/manage-root.page.component.jsx +++ b/client/src/pages/manage-root/manage-root.page.component.jsx @@ -1,14 +1,20 @@ -import React from "react"; +import React, {useEffect} from "react"; //import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component"; -import { Redirect } from "react-router-dom"; +import {useNavigate} from "react-router-dom"; + export default function ManageRootPageComponent() { - //const client = useApolloClient(); + //const client = useApolloClient(); + const navigate = useNavigate(); - return ; + useEffect(() => { + navigate('/manage/jobs'); + }, [navigate]); + + return
    ; + // return ( + //
    + // + //
    + // ); - // return ( - //
    - // - //
    - // ); } diff --git a/client/src/pages/manage-root/manage-root.page.container.jsx b/client/src/pages/manage-root/manage-root.page.container.jsx index 2616da67b..0dd55c657 100644 --- a/client/src/pages/manage-root/manage-root.page.container.jsx +++ b/client/src/pages/manage-root/manage-root.page.container.jsx @@ -1,29 +1,30 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setBreadcrumbs } from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setBreadcrumbs} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ManageRootPageComponent from "./manage-root.page.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), }); -export function ManageRootPageContainer({ setBreadcrumbs, bodyshop }) { - const { t } = useTranslation(); - useEffect(() => { - document.title = t("titles.manageroot"); - setBreadcrumbs([]); - }, [t, setBreadcrumbs]); +export function ManageRootPageContainer({setBreadcrumbs, bodyshop}) { + const {t} = useTranslation(); + useEffect(() => { + document.title = t("titles.manageroot"); + setBreadcrumbs([]); + }, [t, setBreadcrumbs]); - return ; + return ; } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ManageRootPageContainer); diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index da52ac064..d58ac7048 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -1,10 +1,10 @@ -import { BackTop, Layout } from "antd"; +import {FloatButton, Layout} from "antd"; import preval from "preval.macro"; -import React, { lazy, Suspense, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, Route, Switch } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {lazy, Suspense, useEffect, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, Route, Routes} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import BreadCrumbs from "../../components/breadcrumbs/breadcrumbs.component"; import ChatAffixContainer from "../../components/chat-affix/chat-affix.container"; import ConflictComponent from "../../components/conflict/conflict.component"; @@ -17,436 +17,400 @@ import PartnerPingComponent from "../../components/partner-ping/partner-ping.com import PrintCenterModalContainer from "../../components/print-center-modal/print-center-modal.container"; import ShopSubStatusComponent from "../../components/shop-sub-status/shop-sub-status.component"; import TestComponent from "../../components/_test/test.page"; -import { requestForToken } from "../../firebase/firebase.utils"; -import { - selectBodyshop, - selectInstanceConflict, -} from "../../redux/user/user.selectors"; +import {requestForToken} from "../../firebase/firebase.utils"; +import {selectBodyshop, selectInstanceConflict,} from "../../redux/user/user.selectors"; import * as Sentry from "@sentry/react"; import "./manage.page.styles.scss"; import UpdateAlert from "../../components/update-alert/update-alert.component"; -const ManageRootPage = lazy(() => - import("../manage-root/manage-root.page.container") -); const JobsPage = lazy(() => import("../jobs/jobs.page")); const CardPaymentModalContainer = lazy(() => - import("../../components/card-payment-modal/card-payment-modal.container.") + import("../../components/card-payment-modal/card-payment-modal.container.") ); const JobsDetailPage = lazy(() => - import("../jobs-detail/jobs-detail.page.container") + import("../jobs-detail/jobs-detail.page.container") ); const InventoryListPage = lazy(() => import("../inventory/inventory.page")); const ProfilePage = lazy(() => import("../profile/profile.container.page")); const JobsAvailablePage = lazy(() => - import("../jobs-available/jobs-available.page.container") + import("../jobs-available/jobs-available.page.container") ); const ScheduleContainer = lazy(() => - import("../schedule/schedule.page.container") + import("../schedule/schedule.page.container") ); const VehiclesContainer = lazy(() => - import("../vehicles/vehicles.page.container") + import("../vehicles/vehicles.page.container") ); const VehiclesDetailContainer = lazy(() => - import("../vehicles-detail/vehicles-detail.page.container") + import("../vehicles-detail/vehicles-detail.page.container") ); const OwnersContainer = lazy(() => import("../owners/owners.page.container")); const OwnersDetailContainer = lazy(() => - import("../owners-detail/owners-detail.page.container") + import("../owners-detail/owners-detail.page.container") ); const ShopPage = lazy(() => import("../shop/shop.page.component")); const ShopVendorPageContainer = lazy(() => - import("../shop-vendor/shop-vendor.page.container") + import("../shop-vendor/shop-vendor.page.container") ); const EmailOverlayContainer = lazy(() => - import("../../components/email-overlay/email-overlay.container.jsx") + import("../../components/email-overlay/email-overlay.container.jsx") ); const JobsCreateContainerPage = lazy(() => - import("../jobs-create/jobs-create.container") + import("../jobs-create/jobs-create.container") ); const CourtesyCarCreateContainer = lazy(() => - import("../courtesy-car-create/courtesy-car-create.page.container") + import("../courtesy-car-create/courtesy-car-create.page.container") ); const CourtesyCarDetailContainer = lazy(() => - import("../courtesy-car-detail/courtesy-car-detail.page.container") + import("../courtesy-car-detail/courtesy-car-detail.page.container") ); const CourtesyCarsPage = lazy(() => - import("../courtesy-cars/courtesy-cars.page.container") + import("../courtesy-cars/courtesy-cars.page.container") ); const ContractCreatePage = lazy(() => - import("../contract-create/contract-create.page.container") + import("../contract-create/contract-create.page.container") ); const ContractDetailPage = lazy(() => - import("../contract-detail/contract-detail.page.container") + import("../contract-detail/contract-detail.page.container") ); const ContractsList = lazy(() => - import("../contracts/contracts.page.container") + import("../contracts/contracts.page.container") ); const BillsListPage = lazy(() => import("../bills/bills.page.container")); const JobCostingModal = lazy(() => - import("../../components/job-costing-modal/job-costing-modal.container") + import("../../components/job-costing-modal/job-costing-modal.container") ); const ReportCenterModal = lazy(() => - import("../../components/report-center-modal/report-center-modal.container") + import("../../components/report-center-modal/report-center-modal.container") ); const BillEnterModalContainer = lazy(() => - import("../../components/bill-enter-modal/bill-enter-modal.container") + import("../../components/bill-enter-modal/bill-enter-modal.container") ); const TimeTicketModalContainer = lazy(() => - import("../../components/time-ticket-modal/time-ticket-modal.container") + import("../../components/time-ticket-modal/time-ticket-modal.container") ); const TimeTicketModalTask = lazy(() => - import( - "../../components/time-ticket-task-modal/time-ticket-task-modal.container" - ) + import( + "../../components/time-ticket-task-modal/time-ticket-task-modal.container" + ) ); const PaymentModalContainer = lazy(() => - import("../../components/payment-modal/payment-modal.container") + import("../../components/payment-modal/payment-modal.container") ); const ProductionListPage = lazy(() => - import("../production-list/production-list.container") + import("../production-list/production-list.container") ); const ProductionBoardPage = lazy(() => - import("../production-board/production-board.container") + import("../production-board/production-board.container") ); // const ShopTemplates = lazy(() => // import("../shop-templates/shop-templates.container") // ); const JobIntake = lazy(() => - import("../jobs-intake/jobs-intake.page.container") + import("../jobs-intake/jobs-intake.page.container") ); const JobChecklistView = lazy(() => - import("../jobs-checklist-view/jobs-checklist-view.page") + import("../jobs-checklist-view/jobs-checklist-view.page") ); const JobDeliver = lazy(() => - import("../jobs-deliver/jobs-delivery.page.container") + import("../jobs-deliver/jobs-delivery.page.container") ); const AccountingQboCallback = lazy(() => - import("../accounting-qbo/accounting-qbo.page") + import("../accounting-qbo/accounting-qbo.page") ); const AccountingReceivables = lazy(() => - import("../accounting-receivables/accounting-receivables.container") + import("../accounting-receivables/accounting-receivables.container") ); const AccountingPayables = lazy(() => - import("../accounting-payables/accounting-payables.container") + import("../accounting-payables/accounting-payables.container") ); const AccountingPayments = lazy(() => - import("../accounting-payments/accounting-payments.container") + import("../accounting-payments/accounting-payments.container") ); const AllJobs = lazy(() => import("../jobs-all/jobs-all.container")); const ReadyJobs = lazy(() => import("../jobs-ready/jobs-ready.page")); const JobsClose = lazy(() => import("../jobs-close/jobs-close.container")); const JobsAdmin = lazy(() => import("../jobs-admin/jobs-admin.page")); const TempDocs = lazy(() => - import("../temporary-docs/temporary-docs.container") + import("../temporary-docs/temporary-docs.container") ); const ShopCsiPageContainer = lazy(() => - import("../shop-csi/shop-csi.container.page") + import("../shop-csi/shop-csi.container.page") ); const PaymentsAll = lazy(() => - import("../payments-all/payments-all.container.page") + import("../payments-all/payments-all.container.page") ); const ShiftClock = lazy(() => import("../shift-clock/shift-clock.page")); const Scoreboard = lazy(() => - import("../scoreboard/scoreboard.page.container") + import("../scoreboard/scoreboard.page.container") ); const TimeTicketsAll = lazy(() => - import("../time-tickets/time-tickets.container") + import("../time-tickets/time-tickets.container") ); const Help = lazy(() => import("../help/help.page")); const PartsQueue = lazy(() => - import("../parts-queue/parts-queue.page.container") + import("../parts-queue/parts-queue.page.container") ); const ExportLogs = lazy(() => - import("../export-logs/export-logs.page.container") + import("../export-logs/export-logs.page.container") ); const Phonebook = lazy(() => import("../phonebook/phonebook.page.container")); const EmailTest = lazy(() => - import("../../components/email-test/email-test-component") + import("../../components/email-test/email-test-component") ); const Dashboard = lazy(() => import("../dashboard/dashboard.container")); const Dms = lazy(() => import("../dms/dms.container")); const DmsPayables = lazy(() => - import("../dms-payables/dms-payables.container") + import("../dms-payables/dms-payables.container") +); +const ManageRootPage = lazy(() => + import("../manage-root/manage-root.page.container") ); const TtApprovals = lazy(() => - import("../tt-approvals/tt-approvals.page.container") + import("../tt-approvals/tt-approvals.page.container") ); -const { Content, Footer } = Layout; +const {Content, Footer} = Layout; const mapStateToProps = createStructuredSelector({ - conflict: selectInstanceConflict, - bodyshop: selectBodyshop, + conflict: selectInstanceConflict, + bodyshop: selectBodyshop, }); -export function Manage({ match, conflict, bodyshop }) { - const { t } = useTranslation(); - useEffect(() => { - const widgetId = "mQdqARMzkZRUVugJ6TdS"; - window.noticeable.render("widget", widgetId); - try { - requestForToken(); - } catch (error) { - console.log("Unable to request for token.", error); - } - }, []); +export function Manage({conflict, bodyshop}) { + const {t} = useTranslation(); + const [chatVisible] = useState(false); - useEffect(() => { - document.title = t("titles.app"); - }, [t]); - const AppRouteTable = ( - } - > - + useEffect(() => { + const widgetId = "mQdqARMzkZRUVugJ6TdS"; + window.noticeable.render("widget", widgetId); + requestForToken().catch((error) => { + console.error(`Unable to request for token.`, error) + }); + }, []); - + useEffect(() => { + document.title = t("titles.app"); + }, [t]); + const AppRouteTable = ( + } This + > + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + }/> + }/> + }/> + } + /> + } + /> + } + /> + } + /> + } + /> + }/> + }/> + } + /> + }/> + }/> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + }/> + } + /> + } + /> + } + /> + } + /> + }/> + }/> + } + /> + } + /> + } + /> + }/> + { + // } + // /> + } + } + /> + } + /> - - + } + /> - - - - - - - - - - - - - - { - // - } - - + } + /> + } + /> + } + /> + } + /> + }/> + }/> + }/> - + }/> + }/> + }/> + } + /> + }/> + }/> + }/> + }/> + }/> + + + ); - - - - - - - + let PageContent; - - - - - - - - - - - ); + if (conflict) PageContent = ; + else if (bodyshop && bodyshop.sub_status !== "active") + PageContent = ; + else PageContent = AppRouteTable; - let PageContent; + return ( + <> + + + + + + + } showDialog> + {PageContent} + - if (conflict) PageContent = ; - else if (bodyshop && bodyshop.sub_status !== "active") - PageContent = ; - else PageContent = AppRouteTable; + - return ( - <> - - - - - - - - } showDialog> - {PageContent} - - - -
    -
    -
    -
    - {`${t("titles.app")} ${ - process.env.REACT_APP_GIT_SHA - } - ${preval`module.exports = new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles"});`}`} -
    -
    -
    - - Disclaimer & Notices - -
    -
    -
    -
    - - ); +
    +
    +
    +
    +
    + {`${t("titles.app")} ${ + process.env.REACT_APP_GIT_SHA + } - ${preval`module.exports = new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles"});`}`} +
    +
    +
    + + Disclaimer & Notices + +
    +
    +
    + + ); } + export default connect(mapStateToProps, null)(Manage); diff --git a/client/src/pages/manage/manage.page.container.jsx b/client/src/pages/manage/manage.page.container.jsx index 04505ce2a..4a35b3415 100644 --- a/client/src/pages/manage/manage.page.container.jsx +++ b/client/src/pages/manage/manage.page.container.jsx @@ -1,37 +1,37 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries"; -import { setBodyshop } from "../../redux/user/user.actions"; +import {QUERY_BODYSHOP} from "../../graphql/bodyshop.queries"; +import {setBodyshop} from "../../redux/user/user.actions"; //import "../../utils/RegisterSw"; import ManagePage from "./manage.page.component"; const mapDispatchToProps = (dispatch) => ({ - setBodyshop: (bs) => dispatch(setBodyshop(bs)), + setBodyshop: (bs) => dispatch(setBodyshop(bs)), }); -function ManagePageContainer({ match, setBodyshop }) { - const { loading, error, data } = useQuery(QUERY_BODYSHOP, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); +function ManagePageContainer({setBodyshop}) { + const {loading, error, data} = useQuery(QUERY_BODYSHOP, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const { t } = useTranslation(); + const {t} = useTranslation(); - useEffect(() => { - if (data) { - setBodyshop(data.bodyshops[0] || { notfound: true }); - } - }, [data, setBodyshop]); + useEffect(() => { + if (data) { + setBodyshop(data.bodyshops[0] || {notfound: true}); + } + }, [data, setBodyshop]); - if (loading) - return ; - if (error) return ; + if (loading) + return ; + if (error) return ; - return ; + return ; } export default connect(null, mapDispatchToProps)(ManagePageContainer); diff --git a/client/src/pages/owners-detail/owners-detail.page.component.jsx b/client/src/pages/owners-detail/owners-detail.page.component.jsx index 63d3d09e8..3522e5657 100644 --- a/client/src/pages/owners-detail/owners-detail.page.component.jsx +++ b/client/src/pages/owners-detail/owners-detail.page.component.jsx @@ -1,18 +1,18 @@ -import { Col, Divider, Row } from "antd"; +import {Col, Divider, Row} from "antd"; import React from "react"; import OwnerDetailForm from "../../components/owner-detail-form/owner-detail-form.container"; import OwnerDetailJobsComponent from "../../components/owner-detail-jobs/owner-detail-jobs.component"; -export default function OwnersDetailComponent({ owner, refetch }) { - return ( - -
    - - - - - - - - ); +export default function OwnersDetailComponent({owner, refetch}) { + return ( + + + + + + + + + + ); } diff --git a/client/src/pages/owners-detail/owners-detail.page.container.jsx b/client/src/pages/owners-detail/owners-detail.page.container.jsx index 0c7fff449..36346cabf 100644 --- a/client/src/pages/owners-detail/owners-detail.page.container.jsx +++ b/client/src/pages/owners-detail/owners-detail.page.container.jsx @@ -1,76 +1,73 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useParams} from 'react-router-dom'; import AlertComponent from "../../components/alert/alert.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries"; -import { - addRecentItem, - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { CreateRecentItem } from "../../utils/create-recent-item"; +import {QUERY_OWNER_BY_ID} from "../../graphql/owners.queries"; +import {addRecentItem, setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {CreateRecentItem} from "../../utils/create-recent-item"; import OwnersDetailComponent from "./owners-detail.page.component"; import NotFound from "../../components/not-found/not-found.component"; -import { OwnerNameDisplayFunction } from "../../components/owner-name-display/owner-name-display.component"; +import {OwnerNameDisplayFunction} from "../../components/owner-name-display/owner-name-display.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - addRecentItem: (item) => dispatch(addRecentItem(item)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function OwnersDetailContainer({ - match, - setBreadcrumbs, - addRecentItem, - setSelectedHeader, -}) { - const { ownerId } = match.params; - const { t } = useTranslation(); + setBreadcrumbs, + addRecentItem, + setSelectedHeader, + }) { + const {ownerId} = useParams(); + const {t} = useTranslation(); - const { loading, data, error, refetch } = useQuery(QUERY_OWNER_BY_ID, { - variables: { id: ownerId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - useEffect(() => { - document.title = t("titles.owners-detail", { - name: data ? OwnerNameDisplayFunction(data.owners_by_pk) : "", + const {loading, data, error, refetch} = useQuery(QUERY_OWNER_BY_ID, { + variables: {id: ownerId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - setSelectedHeader("owners"); - setBreadcrumbs([ - { link: "/manage/owners", label: t("titles.bc.owners") }, - { - link: `/manage/owners/${ownerId}`, - label: t("titles.bc.owner-detail", { - name: data ? OwnerNameDisplayFunction(data.owners_by_pk) : "", - }), - }, - ]); - if (data && data.owners_by_pk) - addRecentItem( - CreateRecentItem( - ownerId, - "owner", - OwnerNameDisplayFunction(data.owners_by_pk), - `/manage/owners/${ownerId}` - ) - ); - }, [setBreadcrumbs, t, data, ownerId, addRecentItem, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.owners-detail", { + name: data ? OwnerNameDisplayFunction(data.owners_by_pk) : "", + }); + setSelectedHeader("owners"); + setBreadcrumbs([ + {link: "/manage/owners", label: t("titles.bc.owners")}, + { + link: `/manage/owners/${ownerId}`, + label: t("titles.bc.owner-detail", { + name: data ? OwnerNameDisplayFunction(data.owners_by_pk) : "", + }), + }, + ]); - if (loading) return ; - if (error) return ; - if (!!!data.owners_by_pk) return ; + if (data && data.owners_by_pk) + addRecentItem( + CreateRecentItem( + ownerId, + "owner", + OwnerNameDisplayFunction(data.owners_by_pk), + `/manage/owners/${ownerId}` + ) + ); + }, [setBreadcrumbs, t, data, ownerId, addRecentItem, setSelectedHeader]); - return ( - - - - ); + if (loading) return ; + if (error) return ; + if (!!!data.owners_by_pk) return ; + + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(OwnersDetailContainer); diff --git a/client/src/pages/owners/owners.page.component.jsx b/client/src/pages/owners/owners.page.component.jsx index 2a975c373..60927893e 100644 --- a/client/src/pages/owners/owners.page.component.jsx +++ b/client/src/pages/owners/owners.page.component.jsx @@ -2,5 +2,5 @@ import React from "react"; import OwnersListContainer from "../../components/owners-list/owners-list.container"; export default function OwnersPageComponent() { - return ; + return ; } diff --git a/client/src/pages/owners/owners.page.container.jsx b/client/src/pages/owners/owners.page.container.jsx index 394e6b8af..e8e18b021 100644 --- a/client/src/pages/owners/owners.page.container.jsx +++ b/client/src/pages/owners/owners.page.container.jsx @@ -1,30 +1,31 @@ -import React, { useEffect } from "react"; +import React, {useEffect} from "react"; import OwnersPageComponent from "./owners.page.component"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import { - setBreadcrumbs, - setSelectedHeader, + setBreadcrumbs, + setSelectedHeader, } from "../../redux/application/application.actions"; -import { connect } from "react-redux"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function OwnersPageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - useEffect(() => { - document.title = t("titles.owners"); - setSelectedHeader("owners"); - setBreadcrumbs([{ link: "/manage/owners", label: t("titles.bc.owners") }]); - }, [t, setBreadcrumbs, setSelectedHeader]); +export function OwnersPageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + useEffect(() => { + document.title = t("titles.owners"); + setSelectedHeader("owners"); + setBreadcrumbs([{link: "/manage/owners", label: t("titles.bc.owners")}]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(OwnersPageContainer); diff --git a/client/src/pages/parts-queue/parts-queue.page.component.jsx b/client/src/pages/parts-queue/parts-queue.page.component.jsx index 62970d788..5d6ab2f5e 100644 --- a/client/src/pages/parts-queue/parts-queue.page.component.jsx +++ b/client/src/pages/parts-queue/parts-queue.page.component.jsx @@ -1,315 +1,317 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Input, Space, Table } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Input, Space, Table} from "antd"; import _ from "lodash"; import queryString from "query-string"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Link, useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Link, useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import JobPartsQueueCount from "../../components/job-parts-queue-count/job-parts-queue-count.component"; -import JobRemoveFromPartsQueue from "../../components/job-remove-from-parst-queue/job-remove-from-parts-queue.component"; +import JobRemoveFromPartsQueue + from "../../components/job-remove-from-parst-queue/job-remove-from-parts-queue.component"; import OwnerNameDisplay from "../../components/owner-name-display/owner-name-display.component"; -import ProductionListColumnComment from "../../components/production-list-columns/production-list-columns.comment.component"; -import { QUERY_PARTS_QUEUE } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { DateTimeFormatter, TimeAgoFormatter } from "../../utils/DateFormatter"; -import { alphaSort, dateSort } from "../../utils/sorters"; +import ProductionListColumnComment + from "../../components/production-list-columns/production-list-columns.comment.component"; +import {QUERY_PARTS_QUEUE} from "../../graphql/jobs.queries"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {DateTimeFormatter, TimeAgoFormatter} from "../../utils/DateFormatter"; +import {alphaSort, dateSort} from "../../utils/sorters"; import useLocalStorage from "../../utils/useLocalStorage"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); -export function PartsQueuePageComponent({ bodyshop }) { - const searchParams = queryString.parse(useLocation().search); - const { - //page, - sortcolumn, - sortorder, - statusFilters, - } = searchParams; - const history = useHistory(); - const [filter, setFilter] = useLocalStorage("filter_parts_queue", null); +export function PartsQueuePageComponent({bodyshop}) { + const searchParams = queryString.parse(useLocation().search); + const { + //page, + sortcolumn, + sortorder, + statusFilters, + } = searchParams; + const history = useNavigate(); + const [filter, setFilter] = useLocalStorage("filter_parts_queue", null); - const { loading, error, data, refetch } = useQuery(QUERY_PARTS_QUEUE, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - // offset: page ? (page - 1) * 25 : 0, - // limit: 25, - statuses: (statusFilters && JSON.parse(statusFilters)) || - bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"], - order: [ - { - [sortcolumn || "ro_number"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", + const {loading, error, data, refetch} = useQuery(QUERY_PARTS_QUEUE, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + // offset: page ? (page - 1) * 25 : 0, + // limit: 25, + statuses: (statusFilters && JSON.parse(statusFilters)) || + bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"], + order: [ + { + [sortcolumn || "ro_number"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], }, - ], - }, - }); + }); - const { t } = useTranslation(); - const [searchText, setSearchText] = useState(""); + const {t} = useTranslation(); + const [searchText, setSearchText] = useState(""); - if (error) return ; + if (error) return ; - const jobs = data - ? searchText === "" - ? data.jobs - : data.jobs.filter( - (j) => - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_co_nm || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : []; + const jobs = data + ? searchText === "" + ? data.jobs + : data.jobs.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; - const handleTableChange = (pagination, filters, sorter) => { - // searchParams.page = pagination.current; - searchParams.sortcolumn = sorter.columnKey; - searchParams.sortorder = sorter.order; + const handleTableChange = (pagination, filters, sorter) => { + // searchParams.page = pagination.current; + searchParams.sortcolumn = sorter.columnKey; + searchParams.sortorder = sorter.order; - if (filters.status) { - searchParams.statusFilters = JSON.stringify( - _.flattenDeep(filters.status) - ); - } else { - delete searchParams.statusFilters; - } - setFilter(filters); - history.push({ search: queryString.stringify(searchParams) }); - }; + if (filters.status) { + searchParams.statusFilters = JSON.stringify( + _.flattenDeep(filters.status) + ); + } else { + delete searchParams.statusFilters; + } + setFilter(filters); + history({search: queryString.stringify(searchParams)}); + }; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: sortcolumn === "ro_number" && sortorder, + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: sortcolumn === "ro_number" && sortorder, - render: (text, record) => ( - - {record.ro_number || t("general.labels.na")} - - ), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "ownr_ln", - key: "ownr_ln", - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: sortcolumn === "ownr_ln" && sortorder, - render: (text, record) => { - return record.ownerid ? ( - - - - ) : ( - - + render: (text, record) => ( + + {record.ro_number || t("general.labels.na")} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "ownr_ln", + key: "ownr_ln", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: sortcolumn === "ownr_ln" && sortorder, + render: (text, record) => { + return record.ownerid ? ( + + + + ) : ( + + - ); - }, - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: sortcolumn === "status" && sortorder, - filteredValue: statusFilters ? JSON.parse(statusFilters) : null, - filters: - bodyshop.md_ro_statuses.active_statuses.map((s) => { - return { - text: s || "No Status*", - value: [s], - }; - }) || [], - render: (text, record) => { - return record.status || t("general.labels.na"); - }, - }, - - { - title: t("jobs.fields.scheduled_in"), - dataIndex: "scheduled_in", - key: "scheduled_in", - ellipsis: true, - sorter: (a, b) => dateSort(a.scheduled_in, b.scheduled_in), - sortOrder: sortcolumn === "scheduled_in" && sortorder, - render: (text, record) => ( - {record.scheduled_in} - ), - }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => { - return record.vehicleid ? ( - - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - - ) : ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ); - }, - }, - // { - // title: t("vehicles.fields.plate_no"), - // dataIndex: "plate_no", - // key: "plate_no", - // sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), - // sortOrder: sortcolumn === "plate_no" && sortorder, - // render: (text, record) => { - // return record.plate_no ? record.plate_no : ""; - // }, - // }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: sortcolumn === "clm_no" && sortorder, - }, - // { - // title: t("jobs.fields.clm_total"), - // dataIndex: "clm_total", - // key: "clm_total", - // sorter: (a, b) => a.clm_total - b.clm_total, - // sortOrder: sortcolumn === "clm_total" && sortorder, - // render: (text, record) => { - // return record.clm_total ? ( - // {record.clm_total} - // ) : ( - // t("general.labels.unknown") - // ); - // }, - // }, - { - title: t("jobs.fields.updated_at"), - dataIndex: "updated_at", - key: "updated_at", - sorter: (a, b) => dateSort(a.updated_at, b.updated_at), - sortOrder: sortcolumn === "updated_at" && sortorder, - render: (text, record) => ( - {record.updated_at} - ), - }, - { - title: t("jobs.fields.partsstatus"), - dataIndex: "partsstatus", - key: "partsstatus", - render: (text, record) => ( - - ), - }, - { - title: t("jobs.fields.comment"), - dataIndex: "comment", - key: "comment", - render: (text, record) => , - }, - { - title: t("jobs.fields.queued_for_parts"), - dataIndex: "queued_for_parts", - key: "queued_for_parts", - sorter: (a, b) => a.queued_for_parts - b.queued_for_parts, - sortOrder: sortcolumn === "queued_for_parts" && sortorder, - filteredValue: filter?.queued_for_parts || null, - filters: [ - { - text: "Queued", - value: true, + ); + }, }, { - text: "Unqueued", - value: false, + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: sortcolumn === "status" && sortorder, + filteredValue: statusFilters ? JSON.parse(statusFilters) : null, + filters: + bodyshop.md_ro_statuses.active_statuses.map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + }) || [], + render: (text, record) => { + return record.status || t("general.labels.na"); + }, }, - ], - onFilter: (value, record) => record.queued_for_parts === value, - render: (text, record) => ( - - ), - }, - ]; - return ( - - - { - setSearchText(e.target.value); - }} - value={searchText} - enterButton - /> - - } - > -
    - - ); + { + title: t("jobs.fields.scheduled_in"), + dataIndex: "scheduled_in", + key: "scheduled_in", + ellipsis: true, + sorter: (a, b) => dateSort(a.scheduled_in, b.scheduled_in), + sortOrder: sortcolumn === "scheduled_in" && sortorder, + render: (text, record) => ( + {record.scheduled_in} + ), + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + // { + // title: t("vehicles.fields.plate_no"), + // dataIndex: "plate_no", + // key: "plate_no", + // sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), + // sortOrder: sortcolumn === "plate_no" && sortorder, + // render: (text, record) => { + // return record.plate_no ? record.plate_no : ""; + // }, + // }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: sortcolumn === "clm_no" && sortorder, + }, + // { + // title: t("jobs.fields.clm_total"), + // dataIndex: "clm_total", + // key: "clm_total", + // sorter: (a, b) => a.clm_total - b.clm_total, + // sortOrder: sortcolumn === "clm_total" && sortorder, + // render: (text, record) => { + // return record.clm_total ? ( + // {record.clm_total} + // ) : ( + // t("general.labels.unknown") + // ); + // }, + // }, + { + title: t("jobs.fields.updated_at"), + dataIndex: "updated_at", + key: "updated_at", + sorter: (a, b) => dateSort(a.updated_at, b.updated_at), + sortOrder: sortcolumn === "updated_at" && sortorder, + render: (text, record) => ( + {record.updated_at} + ), + }, + { + title: t("jobs.fields.partsstatus"), + dataIndex: "partsstatus", + key: "partsstatus", + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.comment"), + dataIndex: "comment", + key: "comment", + render: (text, record) => , + }, + { + title: t("jobs.fields.queued_for_parts"), + dataIndex: "queued_for_parts", + key: "queued_for_parts", + sorter: (a, b) => a.queued_for_parts - b.queued_for_parts, + sortOrder: sortcolumn === "queued_for_parts" && sortorder, + filteredValue: filter?.queued_for_parts || null, + filters: [ + { + text: "Queued", + value: true, + }, + { + text: "Unqueued", + value: false, + }, + ], + onFilter: (value, record) => record.queued_for_parts === value, + render: (text, record) => ( + + ), + }, + ]; + + return ( + + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> + + } + > +
    + + ); } export default connect(mapStateToProps, null)(PartsQueuePageComponent); diff --git a/client/src/pages/parts-queue/parts-queue.page.container.jsx b/client/src/pages/parts-queue/parts-queue.page.container.jsx index 5f5d8d617..fb0f352a7 100644 --- a/client/src/pages/parts-queue/parts-queue.page.container.jsx +++ b/client/src/pages/parts-queue/parts-queue.page.container.jsx @@ -1,33 +1,31 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import PartsQueuePage from "./parts-queue.page.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function PartsQueuePageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function PartsQueuePageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.parts-queue"); - setSelectedHeader("parts-queue"); - setBreadcrumbs([ - { link: "/manage/partsqueue", label: t("titles.bc.parts-queue") }, - ]); - }, [setBreadcrumbs, t, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.parts-queue"); + setSelectedHeader("parts-queue"); + setBreadcrumbs([ + {link: "/manage/partsqueue", label: t("titles.bc.parts-queue")}, + ]); + }, [setBreadcrumbs, t, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(PartsQueuePageContainer); diff --git a/client/src/pages/payments-all/payments-all.container.page.jsx b/client/src/pages/payments-all/payments-all.container.page.jsx index 3d3cb6287..d276b6ad1 100644 --- a/client/src/pages/payments-all/payments-all.container.page.jsx +++ b/client/src/pages/payments-all/payments-all.container.page.jsx @@ -1,78 +1,75 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import PaymentsListPaginated from "../../components/payments-list-paginated/payment-list-paginated.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { QUERY_ALL_PAYMENTS_PAGINATED } from "../../graphql/payments.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {QUERY_ALL_PAYMENTS_PAGINATED} from "../../graphql/payments.queries"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function AllJobs({ bodyshop, setBreadcrumbs, setSelectedHeader }) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, searchObj } = searchParams; +export function AllJobs({bodyshop, setBreadcrumbs, setSelectedHeader}) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, searchObj} = searchParams; - const { loading, error, data, refetch } = useQuery( - QUERY_ALL_PAYMENTS_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - searchObj - ? JSON.parse(searchObj) - : { - [sortcolumn || "date"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "desc", - }, - ], - }, - } - ); - const { t } = useTranslation(); + const {loading, error, data, refetch} = useQuery( + QUERY_ALL_PAYMENTS_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + searchObj + ? JSON.parse(searchObj) + : { + [sortcolumn || "date"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.payments-all"); - setSelectedHeader("allpayments"); - setBreadcrumbs([ - { link: "/manage/payments", label: t("titles.bc.payments-all") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.payments-all"); + setSelectedHeader("allpayments"); + setBreadcrumbs([ + {link: "/manage/payments", label: t("titles.bc.payments-all")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - if (error) return ; - return ( - - - - ); + if (error) return ; + return ( + + + + ); } export default connect(mapStateToProps, mapDispatchToProps)(AllJobs); diff --git a/client/src/pages/phonebook/phonebook.page.component.jsx b/client/src/pages/phonebook/phonebook.page.component.jsx index 5ce863444..af61bfca0 100644 --- a/client/src/pages/phonebook/phonebook.page.component.jsx +++ b/client/src/pages/phonebook/phonebook.page.component.jsx @@ -1,219 +1,216 @@ -import { SyncOutlined } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Input, Space, Table, Typography } from "antd"; +import {SyncOutlined} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Input, Space, Table, Typography} from "antd"; import _ from "lodash"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_PHONEBOOK_PAGINATED } from "../../graphql/phonebook.queries"; -import { - selectAuthLevel, - selectBodyshop, -} from "../../redux/user/user.selectors"; +import {QUERY_PHONEBOOK_PAGINATED} from "../../graphql/phonebook.queries"; +import {selectAuthLevel, selectBodyshop,} from "../../redux/user/user.selectors"; import ChatOpenButton from "../../components/chat-open-button/chat-open-button.component"; -import { alphaSort } from "../../utils/sorters"; -import { HasRbacAccess } from "../../components/rbac-wrapper/rbac-wrapper.component"; +import {alphaSort} from "../../utils/sorters"; +import {HasRbacAccess} from "../../components/rbac-wrapper/rbac-wrapper.component"; import {pageLimit} from "../../utils/config"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - authLevel: selectAuthLevel, + bodyshop: selectBodyshop, + authLevel: selectAuthLevel, }); -export function PhonebookPageComponent({ bodyshop, authLevel }) { - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder, search, phonebookentry } = searchParams; - const history = useHistory(); +export function PhonebookPageComponent({bodyshop, authLevel}) { + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder, search, phonebookentry} = searchParams; + const history = useNavigate(); - const { loading, error, data, refetch } = useQuery( - QUERY_PHONEBOOK_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "lastname"]: sortorder - ? sortorder === "descend" - ? "desc" - : "asc" - : "asc", - }, - ], - }, - } - ); - - const { t } = useTranslation(); - - if (error) return ; - - const handleTableChange = (pagination, filters, sorter) => { - searchParams.page = pagination.current; - searchParams.sortcolumn = sorter.columnKey; - searchParams.sortorder = sorter.order; - if (filters.status) { - searchParams.statusFilters = JSON.stringify( - _.flattenDeep(filters.status) - ); - } else { - delete searchParams.statusFilters; - } - history.push({ search: queryString.stringify(searchParams) }); - }; - - const columns = [ - { - title: t("phonebook.fields.firstname"), - dataIndex: "firstname", - key: "firstname", - sorter: (a, b) => alphaSort(a.firstname, b.firstname), - sortOrder: sortcolumn === "firstname" && sortorder, - }, - { - title: t("phonebook.fields.lastname"), - dataIndex: "lastname", - key: "lastname", - sorter: (a, b) => alphaSort(a.lastname, b.lastname), - sortOrder: sortcolumn === "lastname" && sortorder, - }, - { - title: t("phonebook.fields.company"), - dataIndex: "company", - key: "company", - sorter: (a, b) => alphaSort(a.company, b.company), - sortOrder: sortcolumn === "company" && sortorder, - }, - { - title: t("phonebook.fields.category"), - dataIndex: "category", - key: "category", - sorter: (a, b) => alphaSort(a.category, b.category), - sortOrder: sortcolumn === "category" && sortorder, - }, - { - title: t("phonebook.fields.email"), - dataIndex: "email", - key: "email", - }, - { - title: t("phonebook.fields.phone1"), - dataIndex: "phone1", - key: "phone1", - render: (text, record) => , - }, - { - title: t("phonebook.fields.phone2"), - dataIndex: "phone2", - key: "phone2", - render: (text, record) => , - }, - { - title: t("phonebook.fields.address1"), - dataIndex: "address1", - key: "address1", - }, - { - title: t("phonebook.fields.city"), - dataIndex: "city", - key: "city", - }, - ]; - - const handleNewPhonebook = () => { - searchParams.phonebookentry = "new"; - history.push({ search: queryString.stringify(searchParams) }); - }; - - const handleOnRowClick = (record) => { - if (record) { - searchParams.phonebookentry = record.id; - history.push({ search: queryString.stringify(searchParams) }); - } else { - delete searchParams.phonebookentry; - history.push({ search: queryString.stringify(searchParams) }); - } - }; - const hasNoAccess = !HasRbacAccess({ - bodyshop, - authLevel, - action: "phonebook:edit", - }); - - return ( - - {searchParams.search && ( - <> - - {t("general.labels.searchresults", { - search: searchParams.search, - })} - - - - )} - - - { - searchParams.search = value; - searchParams.page = 1; - history.push({ search: queryString.stringify(searchParams) }); - }} - /> - - } - > -
    { - return { - onClick: (event) => { - handleOnRowClick(record); + const {loading, error, data, refetch} = useQuery( + QUERY_PHONEBOOK_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + search: search || "", + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "lastname"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "asc", + }, + ], }, - }; - }} - /> - - ); + } + ); + + const {t} = useTranslation(); + + if (error) return ; + + const handleTableChange = (pagination, filters, sorter) => { + searchParams.page = pagination.current; + searchParams.sortcolumn = sorter.columnKey; + searchParams.sortorder = sorter.order; + if (filters.status) { + searchParams.statusFilters = JSON.stringify( + _.flattenDeep(filters.status) + ); + } else { + delete searchParams.statusFilters; + } + history({search: queryString.stringify(searchParams)}); + }; + + const columns = [ + { + title: t("phonebook.fields.firstname"), + dataIndex: "firstname", + key: "firstname", + sorter: (a, b) => alphaSort(a.firstname, b.firstname), + sortOrder: sortcolumn === "firstname" && sortorder, + }, + { + title: t("phonebook.fields.lastname"), + dataIndex: "lastname", + key: "lastname", + sorter: (a, b) => alphaSort(a.lastname, b.lastname), + sortOrder: sortcolumn === "lastname" && sortorder, + }, + { + title: t("phonebook.fields.company"), + dataIndex: "company", + key: "company", + sorter: (a, b) => alphaSort(a.company, b.company), + sortOrder: sortcolumn === "company" && sortorder, + }, + { + title: t("phonebook.fields.category"), + dataIndex: "category", + key: "category", + sorter: (a, b) => alphaSort(a.category, b.category), + sortOrder: sortcolumn === "category" && sortorder, + }, + { + title: t("phonebook.fields.email"), + dataIndex: "email", + key: "email", + }, + { + title: t("phonebook.fields.phone1"), + dataIndex: "phone1", + key: "phone1", + render: (text, record) => , + }, + { + title: t("phonebook.fields.phone2"), + dataIndex: "phone2", + key: "phone2", + render: (text, record) => , + }, + { + title: t("phonebook.fields.address1"), + dataIndex: "address1", + key: "address1", + }, + { + title: t("phonebook.fields.city"), + dataIndex: "city", + key: "city", + }, + ]; + + const handleNewPhonebook = () => { + searchParams.phonebookentry = "new"; + history({search: queryString.stringify(searchParams)}); + }; + + const handleOnRowClick = (record) => { + if (record) { + searchParams.phonebookentry = record.id; + history({search: queryString.stringify(searchParams)}); + } else { + delete searchParams.phonebookentry; + history({search: queryString.stringify(searchParams)}); + } + }; + const hasNoAccess = !HasRbacAccess({ + bodyshop, + authLevel, + action: "phonebook:edit", + }); + + return ( + + {searchParams.search && ( + <> + + {t("general.labels.searchresults", { + search: searchParams.search, + })} + + + + )} + + + { + searchParams.search = value; + searchParams.page = 1; + history({search: queryString.stringify(searchParams)}); + }} + /> + + } + > +
    { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + + ); } export default connect(mapStateToProps, null)(PhonebookPageComponent); diff --git a/client/src/pages/phonebook/phonebook.page.container.jsx b/client/src/pages/phonebook/phonebook.page.container.jsx index a1cd33107..1aeee64ce 100644 --- a/client/src/pages/phonebook/phonebook.page.container.jsx +++ b/client/src/pages/phonebook/phonebook.page.container.jsx @@ -1,68 +1,69 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import PhonebookPage from "./phonebook.page.component"; -import { Drawer, Grid } from "antd"; -import queryString from "query-string"; -import { useHistory, useLocation } from "react-router-dom"; +import {Drawer, Grid} from "antd"; +import {useLocation, useNavigate} from "react-router-dom"; import PhonebookFormContainer from "../../components/phonebook-form/phonebook-form.container"; +import queryString from "query-string"; + const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function PhonebookContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function PhonebookContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.phonebook"); - setSelectedHeader("phonebook"); - setBreadcrumbs([ - { - link: "/manage/phonebook", - label: t("titles.bc.phonebook"), - }, - ]); - }, [setBreadcrumbs, t, setSelectedHeader]); - const search = queryString.parse(useLocation().search); - const { phonebookentry } = search; - const history = useHistory(); + useEffect(() => { + document.title = t("titles.phonebook"); + setSelectedHeader("phonebook"); + setBreadcrumbs([ + { + link: "/manage/phonebook", + label: t("titles.bc.phonebook"), + }, + ]); + }, [setBreadcrumbs, t, setSelectedHeader]); - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; + const search = queryString.parse(useLocation().search); + const {phonebookentry} = search; - const bpoints = { - xs: "100%", - sm: "100%", - md: "100%", - lg: "50%", - xl: "50%", - xxl: "45%", - }; - const drawerPercentage = selectedBreakpoint - ? bpoints[selectedBreakpoint[0]] - : "100%"; + const navigate = useNavigate(); - return ( - - - { - delete search.phonebookentry; - history.push({ search: queryString.stringify(search) }); - }} - visible={phonebookentry} - > - - - - ); + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; + + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "50%", + xl: "50%", + xxl: "45%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; + + return ( + ( + + { + delete search.phonebookentry; + navigate({search: queryString.stringify(search)}); + }} + open={phonebookentry} + > + + + ) + ); } -export default connect(null, mapDispatchToProps)(PhonebookContainer); + +export default connect(null, mapDispatchToProps)(PhonebookContainer); \ No newline at end of file diff --git a/client/src/pages/production-board/production-board.component.jsx b/client/src/pages/production-board/production-board.component.jsx index 9b69da414..02a1d3a7b 100644 --- a/client/src/pages/production-board/production-board.component.jsx +++ b/client/src/pages/production-board/production-board.component.jsx @@ -2,5 +2,5 @@ import React from "react"; import ProductionBoardKanbanContainer from "../../components/production-board-kanban/production-board-kanban.container"; export default function ProductionBoardComponent() { - return ; + return ; } diff --git a/client/src/pages/production-board/production-board.container.jsx b/client/src/pages/production-board/production-board.container.jsx index 20fc35d51..4a99fc480 100644 --- a/client/src/pages/production-board/production-board.container.jsx +++ b/client/src/pages/production-board/production-board.container.jsx @@ -1,52 +1,50 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ProductionBoardComponent from "./production-board.component"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function ProductionBoardContainer({ - setBreadcrumbs, - bodyshop, - setSelectedHeader, -}) { - const { t } = useTranslation(); + setBreadcrumbs, + bodyshop, + setSelectedHeader, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.productionboard"); - setSelectedHeader("productionboard"); - setBreadcrumbs([ - { - link: "/manage/production/board", - label: t("titles.bc.productionboard"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.productionboard"); + setSelectedHeader("productionboard"); + setBreadcrumbs([ + { + link: "/manage/production/board", + label: t("titles.bc.productionboard"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - - - ); + return ( + + + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ProductionBoardContainer); diff --git a/client/src/pages/production-list/production-list.component.jsx b/client/src/pages/production-list/production-list.component.jsx index 116d6cb20..dd5b29a86 100644 --- a/client/src/pages/production-list/production-list.component.jsx +++ b/client/src/pages/production-list/production-list.component.jsx @@ -2,5 +2,5 @@ import React from "react"; import ProductionListTable from "../../components/production-list-table/production-list-table.container"; export default function ProductionListComponent() { - return ; + return ; } diff --git a/client/src/pages/production-list/production-list.container.jsx b/client/src/pages/production-list/production-list.container.jsx index c8275c1ea..396cbc777 100644 --- a/client/src/pages/production-list/production-list.container.jsx +++ b/client/src/pages/production-list/production-list.container.jsx @@ -1,37 +1,35 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import ProductionListComponent from "./production-list.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function ProductionListContainer({ - setBreadcrumbs, + setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); + setSelectedHeader, + }) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.productionlist"); - setSelectedHeader("productionlist"); - setBreadcrumbs([ - { link: "/manage/production/list", label: t("titles.bc.productionlist") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.productionlist"); + setSelectedHeader("productionlist"); + setBreadcrumbs([ + {link: "/manage/production/list", label: t("titles.bc.productionlist")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(ProductionListContainer); diff --git a/client/src/pages/profile/profile.container.page.jsx b/client/src/pages/profile/profile.container.page.jsx index 961e2b834..4a2270799 100644 --- a/client/src/pages/profile/profile.container.page.jsx +++ b/client/src/pages/profile/profile.container.page.jsx @@ -1,27 +1,25 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import ProfilePage from "./profile.page"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function ProfileContainerPage({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - useEffect(() => { - setSelectedHeader("profile"); - setBreadcrumbs([ - { link: "/manage/profile", label: t("titles.bc.profile") }, - ]); - document.title = t("titles.profile"); - }, [t, setBreadcrumbs, setSelectedHeader]); +export function ProfileContainerPage({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + useEffect(() => { + setSelectedHeader("profile"); + setBreadcrumbs([ + {link: "/manage/profile", label: t("titles.bc.profile")}, + ]); + document.title = t("titles.profile"); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ; + return ; } + export default connect(null, mapDispatchToProps)(ProfileContainerPage); diff --git a/client/src/pages/profile/profile.page.jsx b/client/src/pages/profile/profile.page.jsx index 3d897eda8..478d1cfe4 100644 --- a/client/src/pages/profile/profile.page.jsx +++ b/client/src/pages/profile/profile.page.jsx @@ -1,15 +1,15 @@ -import { Row } from "antd"; +import {Row} from "antd"; import React from "react"; import ProfileMyComponent from "../../components/profile-my/profile-my.component"; import ProfileShopsContainer from "../../components/profile-shops/profile-shops.container"; export default function ProfilePage() { - return ( -
    - - - - -
    - ); + return ( +
    + + + + +
    + ); } diff --git a/client/src/pages/reset-password/reset-password.component.jsx b/client/src/pages/reset-password/reset-password.component.jsx index 90a11c226..4e088c429 100644 --- a/client/src/pages/reset-password/reset-password.component.jsx +++ b/client/src/pages/reset-password/reset-password.component.jsx @@ -1,14 +1,14 @@ -import queryString from "query-string"; import React from "react"; -import { useLocation } from "react-router-dom"; +import {useLocation} from "react-router-dom"; import UserRequestResetPw from "../../components/user-request-pw-reset/user-request-reset-pw.component"; import UserValidatePwReset from "../../components/user-validate-pw-reset/user-validate-pw-reset.component"; +import queryString from "query-string"; export default function ResetPassword() { - const searchParams = queryString.parse(useLocation().search); - const { mode, oobCode } = searchParams; + const searchParams = queryString.parse(useLocation().search); + const {mode, oobCode} = searchParams; - if (mode === "resetPassword") - return ; - return ; -} + if (mode === "resetPassword") + return ; + return ; +} \ No newline at end of file diff --git a/client/src/pages/schedule/schedule.page.component.jsx b/client/src/pages/schedule/schedule.page.component.jsx index 3be49895f..7be62df2f 100644 --- a/client/src/pages/schedule/schedule.page.component.jsx +++ b/client/src/pages/schedule/schedule.page.component.jsx @@ -2,5 +2,5 @@ import React from "react"; import ScheduleCalendarContainer from "../../components/schedule-calendar/schedule-calendar.container"; export default function SchedulePageComponent() { - return ; + return ; } diff --git a/client/src/pages/schedule/schedule.page.container.jsx b/client/src/pages/schedule/schedule.page.container.jsx index ed55bda6c..3be56c9f8 100644 --- a/client/src/pages/schedule/schedule.page.container.jsx +++ b/client/src/pages/schedule/schedule.page.container.jsx @@ -1,33 +1,31 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import SchedulePageComponent from "./schedule.page.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function SchedulePageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function SchedulePageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.schedule"); - setSelectedHeader("schedule"); - setBreadcrumbs([ - { link: "/manage/schedule", label: t("titles.bc.schedule") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.schedule"); + setSelectedHeader("schedule"); + setBreadcrumbs([ + {link: "/manage/schedule", label: t("titles.bc.schedule")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect(null, mapDispatchToProps)(SchedulePageContainer); diff --git a/client/src/pages/scoreboard/scoreboard.page.container.jsx b/client/src/pages/scoreboard/scoreboard.page.container.jsx index 1ef4b273f..1550a6087 100644 --- a/client/src/pages/scoreboard/scoreboard.page.container.jsx +++ b/client/src/pages/scoreboard/scoreboard.page.container.jsx @@ -1,103 +1,109 @@ -import Icon, { FieldTimeOutlined } from "@ant-design/icons"; -import { Tabs } from "antd"; +import Icon, {FieldTimeOutlined} from "@ant-design/icons"; +import {Tabs} from "antd"; import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { FaShieldAlt } from "react-icons/fa"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {FaShieldAlt} from "react-icons/fa"; +import {connect} from "react-redux"; +import {useLocation, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import ScoreboardDisplay from "../../components/scoreboard-display/scoreboard-display.component"; import ScoreboardTimeTicketsStats from "../../components/scoreboard-timetickets-stats/scoreboard-timetickets.component"; import ScoreboardTimeTickets from "../../components/scoreboard-timetickets/scoreboard-timetickets.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +/** + * Mapping state to props + */ const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); +/** + * Mapping dispatch to props + */ const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function ScoreboardContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); - const searchParams = queryString.parse(useLocation().search); - const { tab } = searchParams; - const history = useHistory(); - useEffect(() => { - document.title = t("titles.scoreboard"); - setSelectedHeader("scoreboard"); - setBreadcrumbs([ - { - link: "/manage/scoreboard", - label: t("titles.bc.scoreboard"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); +/** + * ScoreboardContainer component + * @param {Object} props - The props that were defined by the caller of this component. + * @param {Function} props.setBreadcrumbs - Function to set breadcrumbs. + * @param {Function} props.setSelectedHeader - Function to set selected header. + */ +export function ScoreboardContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + const searchParams = queryString.parse(useLocation().search); + const {tab} = searchParams; + const history = useNavigate(); - return ( - - - { - searchParams.tab = key; - history.push({ - search: queryString.stringify(searchParams), - }); - }} - > - - - {t("scoreboard.labels.jobs")} - - } - destroyInactiveTabPane - key="sb" - > - - - - - {t("scoreboard.labels.timeticketsemployee")} - - } - destroyInactiveTabPane - key="tickets" - > - - - - - {t("scoreboard.labels.allemployeetimetickets")} - - } - destroyInactiveTabPane - key="ticketsstats" - > - - - - - - ); + /** + * useEffect hook to set document title, selected header and breadcrumbs + */ + useEffect(() => { + document.title = t("titles.scoreboard"); + setSelectedHeader("scoreboard"); + setBreadcrumbs([ + { + link: "/manage/scoreboard", + label: t("titles.bc.scoreboard"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); + + /** + * Render the component + */ + return ( + + + { + searchParams.tab = key; + history({ + search: queryString.stringify(searchParams), + }); + }} + items={[ + { + key: "sb", + icon: , + label: t("scoreboard.labels.jobs"), + forceRender: true, + children: , + }, + { + key: "tickets", + icon: , + label: t("scoreboard.labels.timeticketsemployee"), + forceRender: true, + children: , + }, + { + key: "ticketsstats", + icon: , + label: t("scoreboard.labels.allemployeetimetickets"), + forceRender: true, + children: , + }, + ]} + /> + + + ); } + +/** + * Connecting the component to Redux store + */ export default connect( - mapStateToProps, - mapDispatchToProps -)(ScoreboardContainer); + mapStateToProps, + mapDispatchToProps +)(ScoreboardContainer); \ No newline at end of file diff --git a/client/src/pages/shift-clock/shift-clock.page.jsx b/client/src/pages/shift-clock/shift-clock.page.jsx index d026da567..582f5491a 100644 --- a/client/src/pages/shift-clock/shift-clock.page.jsx +++ b/client/src/pages/shift-clock/shift-clock.page.jsx @@ -3,9 +3,9 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container"; export default function ShiftClock() { - return ( - - - - ); + return ( + + + + ); } diff --git a/client/src/pages/shop-csi/shop-csi.container.page.jsx b/client/src/pages/shop-csi/shop-csi.container.page.jsx index f0c295685..f77986b94 100644 --- a/client/src/pages/shop-csi/shop-csi.container.page.jsx +++ b/client/src/pages/shop-csi/shop-csi.container.page.jsx @@ -1,98 +1,87 @@ -import { Row, Col } from "antd"; -import { useQuery } from "@apollo/client"; -import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {Col, Row} from "antd"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import CsiResponseFormContainer from "../../components/csi-response-form/csi-response-form.container"; -import CsiResponseListPaginated from "../../components/csi-response-list-paginated/csi-response-list-paginated.component"; -import { QUERY_CSI_RESPONSE_PAGINATED } from "../../graphql/csi.queries"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import CsiResponseListPaginated + from "../../components/csi-response-list-paginated/csi-response-list-paginated.component"; +import {QUERY_CSI_RESPONSE_PAGINATED} from "../../graphql/csi.queries"; +import {setBreadcrumbs, setSelectedHeader} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import {pageLimit} from "../../utils/config"; +import queryString from "query-string"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function ShopCsiContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); +export function ShopCsiContainer({bodyshop, setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); + const searchParams = queryString.parse(useLocation().search); + const {page, sortcolumn, sortorder} = searchParams; - const searchParams = queryString.parse(useLocation().search); - const { page, sortcolumn, sortorder } = searchParams; + const {loading, error, data, refetch} = useQuery( + QUERY_CSI_RESPONSE_PAGINATED, + { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + variables: { + offset: page ? (page - 1) * pageLimit : 0, + limit: pageLimit, + order: [ + { + [sortcolumn || "completedon"]: sortorder + ? sortorder === "descend" + ? "desc_nulls_last" + : "asc" + : "desc_nulls_last", + }, + ], + }, + } + ); - const { loading, error, data, refetch } = useQuery( - QUERY_CSI_RESPONSE_PAGINATED, - { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - variables: { - //search: search || "", - offset: page ? (page - 1) * pageLimit : 0, - limit: pageLimit, - order: [ - { - [sortcolumn || "completedon"]: sortorder - ? sortorder === "descend" - ? "desc_nulls_last" - : "asc" - : "desc_nulls_last", - }, - ], - }, - } - ); + useEffect(() => { + document.title = t("titles.shop-csi"); + setSelectedHeader("shop-csi"); + setBreadcrumbs([ + { + link: "/manage/shop", + label: t("titles.bc.shop", {shopname: bodyshop.shopname}), + }, + {link: "/manage/shop/csi", label: t("titles.bc.shop-csi")}, + ]); + }, [t, setBreadcrumbs, bodyshop.shopname, setSelectedHeader]); - useEffect(() => { - document.title = t("titles.shop-csi"); - setSelectedHeader("shop-csi"); - setBreadcrumbs([ - { - link: "/manage/shop", - label: t("titles.bc.shop", { shopname: bodyshop.shopname }), - }, - { link: "/manage/shop/csi", label: t("titles.bc.shop-csi") }, - ]); - }, [t, setBreadcrumbs, bodyshop.shopname, setSelectedHeader]); + if (error) return ; - if (error) return ; - - return ( - - // } - > - -
    - - - - - - - - ); + return ( + + + + + + + + + + + ); } -export default connect(mapStateToProps, mapDispatchToProps)(ShopCsiContainer); + +export default connect(mapStateToProps, mapDispatchToProps)(ShopCsiContainer); \ No newline at end of file diff --git a/client/src/pages/shop-templates/shop-templates.container.js b/client/src/pages/shop-templates/shop-templates.container.js index f1f4b3b69..02d06a91c 100644 --- a/client/src/pages/shop-templates/shop-templates.container.js +++ b/client/src/pages/shop-templates/shop-templates.container.js @@ -42,7 +42,7 @@ // return ( // //
    -// +// // // //
    diff --git a/client/src/pages/shop-vendor/shop-vendor.page.component.jsx b/client/src/pages/shop-vendor/shop-vendor.page.component.jsx index 6eb6e2064..97098713b 100644 --- a/client/src/pages/shop-vendor/shop-vendor.page.component.jsx +++ b/client/src/pages/shop-vendor/shop-vendor.page.component.jsx @@ -1,45 +1,43 @@ -import { Drawer, Grid } from "antd"; -import queryString from "query-string"; +import {Drawer, Grid} from "antd"; import React from "react"; -import { useHistory, useLocation } from "react-router-dom"; +import {useNavigate, useSearchParams} from "react-router-dom"; import VendorsFormContainer from "../../components/vendors-form/vendors-form.container"; import VendorsListContainer from "../../components/vendors-list/vendors-list.container"; export default function ShopVendorPageComponent() { - const search = queryString.parse(useLocation().search); - const { selectedvendor } = search; - const history = useHistory(); + const [searchParams] = useSearchParams(); + const {selectedvendor} = Object.fromEntries(searchParams); + const navigate = useNavigate(); - const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) - .filter((screen) => !!screen[1]) - .slice(-1)[0]; + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; - const bpoints = { - xs: "100%", - sm: "100%", - md: "100%", - lg: "50%", - xl: "50%", - xxl: "45%", - }; - const drawerPercentage = selectedBreakpoint - ? bpoints[selectedBreakpoint[0]] - : "100%"; + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "50%", + xl: "50%", + xxl: "45%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; - return ( -
    - - - { - delete search.selectedvendor; - history.push({ search: queryString.stringify(search) }); - }} - visible={selectedvendor} - > - - -
    - ); -} + return ( + (
    + + { + searchParams.delete("selectedvendor"); + navigate({search: searchParams.toString()}); + }} + open={selectedvendor} + > + + +
    ) + ); +} \ No newline at end of file diff --git a/client/src/pages/shop-vendor/shop-vendor.page.container.jsx b/client/src/pages/shop-vendor/shop-vendor.page.container.jsx index 5b681fd22..8d092bd02 100644 --- a/client/src/pages/shop-vendor/shop-vendor.page.container.jsx +++ b/client/src/pages/shop-vendor/shop-vendor.page.container.jsx @@ -1,48 +1,47 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import ShopVendorPageComponent from "./shop-vendor.page.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function ShopVendorPageContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); - useEffect(() => { - document.title = t("titles.shop_vendors"); - setSelectedHeader("shop-vendors"); - setBreadcrumbs([ - { - link: "/manage/shop", - label: t("titles.bc.shop", { shopname: bodyshop.shopname }), - }, - { link: "/manage/shop/vendors", label: t("titles.bc.shop-vendors") }, - ]); - }, [t, bodyshop.shopname, setBreadcrumbs, setSelectedHeader]); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); + useEffect(() => { + document.title = t("titles.shop_vendors"); + setSelectedHeader("shop-vendors"); + setBreadcrumbs([ + { + link: "/manage/shop", + label: t("titles.bc.shop", {shopname: bodyshop.shopname}), + }, + {link: "/manage/shop/vendors", label: t("titles.bc.shop-vendors")}, + ]); + }, [t, bodyshop.shopname, setBreadcrumbs, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(ShopVendorPageContainer); diff --git a/client/src/pages/shop/shop.page.component.jsx b/client/src/pages/shop/shop.page.component.jsx index e7987ee9e..6c21ac75e 100644 --- a/client/src/pages/shop/shop.page.component.jsx +++ b/client/src/pages/shop/shop.page.component.jsx @@ -1,77 +1,89 @@ -import { Tabs } from "antd"; -import React, { useEffect } from "react"; -import { useHistory, useLocation } from "react-router-dom"; +import {Tabs} from "antd"; +import React, {useEffect} from "react"; +import {useLocation, useNavigate} from "react-router-dom"; import queryString from "query-string"; -import { useTranslation } from "react-i18next"; +import {useTranslation} from "react-i18next"; import ShopEmployeesContainer from "../../components/shop-employees/shop-employees.container"; import ShopInfoContainer from "../../components/shop-info/shop-info.container"; import ShopCsiConfig from "../../components/shop-csi-config/shop-csi-config.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - setSelectedHeader, - setBreadcrumbs, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import ShopInfoUsersComponent from "../../components/shop-users/shop-users.component"; + import ShopTeamsContainer from "../../components/shop-teams/shop-teams.container"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), }); -export function ShopPage({ bodyshop, setSelectedHeader, setBreadcrumbs }) { - const { t } = useTranslation(); - const history = useHistory(); - const search = queryString.parse(useLocation().search); +export function ShopPage({bodyshop, setSelectedHeader, setBreadcrumbs}) { + const {t} = useTranslation(); + const history = useNavigate(); + const search = queryString.parse(useLocation().search); - useEffect(() => { - document.title = t("titles.shop"); - setSelectedHeader("shop"); - setBreadcrumbs([ - { - link: "/manage/shop", - label: t("titles.bc.shop", { shopname: bodyshop.shopname }), - }, - ]); - }, [t, setSelectedHeader, setBreadcrumbs, bodyshop.shopname]); + useEffect(() => { + document.title = t("titles.shop"); + setSelectedHeader("shop"); + setBreadcrumbs([ + { + link: "/manage/shop", + label: t("titles.bc.shop", {shopname: bodyshop.shopname}), + }, + ]); + }, [t, setSelectedHeader, setBreadcrumbs, bodyshop.shopname]); - useEffect(() => { - if (!search.tab) history.push({ search: "?tab=info" }); - }, [history, search]); + useEffect(() => { + if (!search.tab) history({search: "?tab=info"}); + }, [history, search]); - return ( - - history.push({ search: `?tab=${key}` })} - > - - - - - - + const items = [ { - bodyshop.md_tasks_presets.enable_tasks && - - - - } - - - - - - - - - ); + key: "info", + label: t("bodyshop.labels.shopinfo"), + children: , + }, + { + key: "employees", + label: t("bodyshop.labels.employees"), + children: , + }]; + + if (bodyshop.md_tasks_presets.enable_tasks) { + items.push({ + key: "teams", + label: t("bodyshop.labels.employee_teams"), + children: + }); + } + + items.push({ + key: "licensing", + label: t("bodyshop.labels.licensing"), + children: , + }, + { + key: "csiq", + label: t("bodyshop.labels.csiq"), + children: , + }); + + return ( + + history({search: `?tab=${key}`})} + items={items} + /> + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(ShopPage); diff --git a/client/src/pages/sign-in/sign-in.page.jsx b/client/src/pages/sign-in/sign-in.page.jsx index 973b853d6..26257fb9e 100644 --- a/client/src/pages/sign-in/sign-in.page.jsx +++ b/client/src/pages/sign-in/sign-in.page.jsx @@ -2,9 +2,9 @@ import React from "react"; import SignIn from "../../components/sign-in-form/sign-in-form.component"; export default function SignInPage() { - return ( -
    - -
    - ); + return ( +
    + +
    + ); } diff --git a/client/src/pages/tech-assigned-prod-jobs/tech-assigned-prod-jobs.component.jsx b/client/src/pages/tech-assigned-prod-jobs/tech-assigned-prod-jobs.component.jsx index 65b71f409..31ec8bead 100644 --- a/client/src/pages/tech-assigned-prod-jobs/tech-assigned-prod-jobs.component.jsx +++ b/client/src/pages/tech-assigned-prod-jobs/tech-assigned-prod-jobs.component.jsx @@ -1,261 +1,261 @@ -import { useQuery } from "@apollo/client"; -import React, { useState } from "react"; -import { Table } from "antd"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { QUERY_JOBS_TECH_ASIGNED_TO_BY_TEAM } from "../../graphql/jobs.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { alphaSort } from "../../utils/sorters"; -import { SyncOutlined } from "@ant-design/icons"; -import { Button, Card, Input, Space } from "antd"; +import {useQuery} from "@apollo/client"; +import React, {useState} from "react"; +import {Button, Card, Input, Space, Table} from "antd"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {QUERY_JOBS_TECH_ASIGNED_TO_BY_TEAM} from "../../graphql/jobs.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {alphaSort} from "../../utils/sorters"; +import {SyncOutlined} from "@ant-design/icons"; import queryString from "query-string"; -import { useTranslation } from "react-i18next"; -import { useHistory, useLocation } from "react-router-dom"; -import { onlyUnique } from "../../utils/arrayHelper"; +import {useTranslation} from "react-i18next"; +import {useNavigate, useLocation} from "react-router-dom"; +import {onlyUnique} from "../../utils/arrayHelper"; import AlertComponent from "../../components/alert/alert.component"; import OwnerNameDisplay from "../../components/owner-name-display/owner-name-display.component"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import {setModalContext} from "../../redux/modals/modals.actions"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - technician: selectTechnician, - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + technician: selectTechnician, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setTimeTicketTaskContext: (context) => - dispatch(setModalContext({ context: context, modal: "timeTicketTask" })), + setTimeTicketTaskContext: (context) => + dispatch(setModalContext({context: context, modal: "timeTicketTask"})), }); export function TechAssignedProdJobs({ - setTimeTicketTaskContext, - technician, - bodyshop, -}) { - const { loading, error, data, refetch } = useQuery( - QUERY_JOBS_TECH_ASIGNED_TO_BY_TEAM, - { - variables: { - teamIds: bodyshop.employee_teams - .filter((et) => - et.employee_team_members.find( - (etm) => etm.employeeid === technician.id + setTimeTicketTaskContext, + technician, + bodyshop, + }) { + const {loading, error, data, refetch} = useQuery( + QUERY_JOBS_TECH_ASIGNED_TO_BY_TEAM, + { + variables: { + teamIds: bodyshop.employee_teams + .filter((et) => + et.employee_team_members.find( + (etm) => etm.employeeid === technician.id + ) + ) + .map((et) => et.id), + }, + } + ); + + const searchParams = queryString.parse(useLocation().search); + const {selected} = searchParams; + + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {text: ""}, + }); + const {t} = useTranslation(); + const history = useNavigate(); + const [searchText, setSearchText] = useState(""); + if (error) return ; + + const jobs = data + ? searchText === "" + ? data.jobs + : data.jobs.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) ) - ) - .map((et) => et.id), - }, - } - ); + : []; + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - const searchParams = queryString.parse(useLocation().search); - const { selected } = searchParams; - - const [state, setState] = useState({ - sortedInfo: {}, - filteredInfo: { text: "" }, - }); - const { t } = useTranslation(); - const history = useHistory(); - const [searchText, setSearchText] = useState(""); - if (error) return ; - - const jobs = data - ? searchText === "" - ? data.jobs - : data.jobs.filter( - (j) => - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_co_nm || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : []; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - sortOrder: - state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, - - render: (text, record) => record.ro_number || t("general.labels.na"), - }, - { - title: t("jobs.fields.owner"), - dataIndex: "owner", - key: "owner", - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, - ellipsis: true, - render: (text, record) => ( - - + render: (text, record) => record.ro_number || t("general.labels.na"), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + ellipsis: true, + render: (text, record) => ( + + - ), - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - filters: - (jobs && - jobs - .map((j) => j.status) - .filter(onlyUnique) - .map((s) => { - return { - text: s || "No Status*", - value: [s], - }; - })) || - [], - onFilter: (value, record) => value.includes(record.status), - render: (text, record) => { - return record.status || t("general.labels.na"); - }, - }, + ), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + (jobs && + jobs + .map((j) => j.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), + render: (text, record) => { + return record.status || t("general.labels.na"); + }, + }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => ( - {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ - record.v_model_desc || "" - }`} - ), - }, - { - title: t("vehicles.fields.plate_no"), - dataIndex: "plate_no", - key: "plate_no", - sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), - sortOrder: - state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, - render: (text, record) => { - return record.plate_no ? record.plate_no : ""; - }, - }, - { - title: t("jobs.fields.clm_no"), - dataIndex: "clm_no", - key: "clm_no", - ellipsis: true, - sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), - sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, - render: (text, record) => { - return record.clm_no ? ( - {record.clm_no} - ) : ( - t("general.labels.unknown") - ); - }, - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - + ), + }, + ]; + const handleTableChange = (pagination, filters, sorter) => { + setState({...state, filteredInfo: filters, sortedInfo: sorter}); + }; + + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + history({ + search: queryString.stringify({ + ...searchParams, + selected: record.id, + }), + }); + } + } + }; + return ( + + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> + + } > - {t("timetickets.actions.claimtasks")} - - ), - }, - ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - history.push({ - search: queryString.stringify({ - ...searchParams, - selected: record.id, - }), - }); - } - } - }; - return ( - - - { - setSearchText(e.target.value); - }} - value={searchText} - enterButton - /> - - } - > -
    { - handleOnRowClick(record); - }, - selectedRowKeys: [selected], - type: "radio", - }} - onChange={handleTableChange} - // onRow={(record, rowIndex) => { - // return { - // onClick: (event) => { - // handleOnRowClick(record); - // }, - // }; - // }} - /> - - ); +
    { + handleOnRowClick(record); + }, + selectedRowKeys: [selected], + type: "radio", + }} + onChange={handleTableChange} + // onRow={(record, rowIndex) => { + // return { + // onClick: (event) => { + // handleOnRowClick(record); + // }, + // }; + // }} + /> + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TechAssignedProdJobs); diff --git a/client/src/pages/tech-dispatched-parts/tech-dispatched-parts.page.jsx b/client/src/pages/tech-dispatched-parts/tech-dispatched-parts.page.jsx index 9508b8bad..55619945f 100644 --- a/client/src/pages/tech-dispatched-parts/tech-dispatched-parts.page.jsx +++ b/client/src/pages/tech-dispatched-parts/tech-dispatched-parts.page.jsx @@ -1,139 +1,137 @@ -import { - MinusCircleTwoTone, - PlusCircleTwoTone, - SyncOutlined, -} from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Card, Space, Table } from "antd"; +import {MinusCircleTwoTone, PlusCircleTwoTone, SyncOutlined,} from "@ant-design/icons"; +import {useQuery} from "@apollo/client"; +import {Button, Card, Space, Table} from "antd"; import queryString from "query-string"; import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useHistory, useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useNavigate, useLocation} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import PartsDispatchExpander from "../../components/parts-dispatch-expander/parts-dispatch-expander.component"; -import { GET_UNACCEPTED_PARTS_DISPATCH } from "../../graphql/parts-dispatch.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { alphaSort } from "../../utils/sorters"; +import {GET_UNACCEPTED_PARTS_DISPATCH} from "../../graphql/parts-dispatch.queries"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {alphaSort} from "../../utils/sorters"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser - technician: selectTechnician, - bodyshop: selectBodyshop, + //currentUser: selectCurrentUser + technician: selectTechnician, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); -export function TechDispatchedParts({ technician, bodyshop }) { - const searchParams = queryString.parse(useLocation().search); - const { page } = searchParams; +export function TechDispatchedParts({technician, bodyshop}) { + const searchParams = queryString.parse(useLocation().search); + const {page} = searchParams; - const { loading, error, data, refetch } = useQuery( - GET_UNACCEPTED_PARTS_DISPATCH, - { - variables: { - techId: technician.id, - offset: page ? (page - 1) * 25 : 0, - limit: 25, - }, - } - ); + const {loading, error, data, refetch} = useQuery( + GET_UNACCEPTED_PARTS_DISPATCH, + { + variables: { + techId: technician.id, + offset: page ? (page - 1) * 25 : 0, + limit: 25, + }, + } + ); - const { t } = useTranslation(); - const history = useHistory(); + const {t} = useTranslation(); + const history = useNavigate(); - if (error) return ; + if (error) return ; - const parts_dispatch = data?.parts_dispatch; + const parts_dispatch = data?.parts_dispatch; - const columns = [ - { - title: t("jobs.fields.ro_number"), - dataIndex: "job.ro_number", - key: "ro_number", - sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "job.ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), - render: (text, record) => record.job.ro_number || t("general.labels.na"), - }, - { - title: t("jobs.fields.status"), - dataIndex: "status", - key: "status", - sorter: (a, b) => alphaSort(a.status, b.status), - render: (text, record) => { - return record.job.status || t("general.labels.na"); - }, - }, + render: (text, record) => record.job.ro_number || t("general.labels.na"), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + render: (text, record) => { + return record.job.status || t("general.labels.na"); + }, + }, - { - title: t("jobs.fields.vehicle"), - dataIndex: "vehicle", - key: "vehicle", - ellipsis: true, - render: (text, record) => ( - {`${record.job.v_model_yr || ""} ${ - record.job.v_make_desc || "" - } ${record.job.v_model_desc || ""}`} - ), - }, - { - title: t("general.labels.actions"), - dataIndex: "actions", - key: "actions", - render: (text, record) => ( - - ), - }, - ]; - const handleTableChange = (pagination, filters, sorter) => { - searchParams.page = pagination.current; - history.push({ search: queryString.stringify(searchParams) }); - }; - - return ( - - - - } - > -
    ( - - ), - rowExpandable: (record) => true, - //expandRowByClick: true, - expandIcon: ({ expanded, onExpand, record }) => - expanded ? ( - onExpand(record, e)} /> - ) : ( - onExpand(record, e)} /> + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => ( + {`${record.job.v_model_yr || ""} ${ + record.job.v_make_desc || "" + } ${record.job.v_model_desc || ""}`} ), - }} - /> - - ); + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + ), + }, + ]; + const handleTableChange = (pagination, filters, sorter) => { + searchParams.page = pagination.current; + history({search: queryString.stringify(searchParams)}); + }; + + return ( + + + + } + > +
    ( + + ), + rowExpandable: (record) => true, + //expandRowByClick: true, + expandIcon: ({expanded, onExpand, record}) => + expanded ? ( + onExpand(record, e)}/> + ) : ( + onExpand(record, e)}/> + ), + }} + /> + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TechDispatchedParts); diff --git a/client/src/pages/tech-job-clock/tech-job-clock.component.jsx b/client/src/pages/tech-job-clock/tech-job-clock.component.jsx index 0d64068eb..1b95af5f4 100644 --- a/client/src/pages/tech-job-clock/tech-job-clock.component.jsx +++ b/client/src/pages/tech-job-clock/tech-job-clock.component.jsx @@ -1,16 +1,23 @@ -import { Divider } from "antd"; -import React from "react"; +import {Divider} from "antd"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import TechClockInFormContainer from "../../components/tech-job-clock-in-form/tech-job-clock-in-form.container"; import TechClockedInList from "../../components/tech-job-clocked-in-list/tech-job-clocked-in-list.component"; import TechJobStatistics from "../../components/tech-job-statistics/tech-job-statistics.component"; export default function TechClockComponent() { - return ( -
    - - - - -
    - ); + const {t} = useTranslation(); + + useEffect(() => { + document.title = t("titles.techjobclock"); + }, [t]); + + return ( +
    + + + + +
    + ); } diff --git a/client/src/pages/tech-lookup/tech-lookup.container.jsx b/client/src/pages/tech-lookup/tech-lookup.container.jsx index 3368c1325..f83e97239 100644 --- a/client/src/pages/tech-lookup/tech-lookup.container.jsx +++ b/client/src/pages/tech-lookup/tech-lookup.container.jsx @@ -1,13 +1,20 @@ -import React from "react"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import RbacWrapperComponent from "../../components/rbac-wrapper/rbac-wrapper.component"; import TechLookupJobsList from "../../components/tech-lookup-jobs-list/tech-lookup-jobs-list.component"; export default function TechLookupContainer() { - return ( -
    - - - -
    - ); + const {t} = useTranslation(); + + useEffect(() => { + document.title = t("titles.techjoblookup"); + }, [t]); + + return ( +
    + + + +
    + ); } diff --git a/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx b/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx index 52e0e99c7..5c25dc897 100644 --- a/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx +++ b/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx @@ -1,10 +1,17 @@ -import React from "react"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container"; export default function TechShiftClock() { - return ( -
    - -
    - ); + const {t} = useTranslation(); + + useEffect(() => { + document.title = t("titles.techshiftclock"); + }, [t]); + + return ( +
    + +
    + ); } diff --git a/client/src/pages/tech/tech.page.component.jsx b/client/src/pages/tech/tech.page.component.jsx index b2f4cbfd0..a2e1ac601 100644 --- a/client/src/pages/tech/tech.page.component.jsx +++ b/client/src/pages/tech/tech.page.component.jsx @@ -1,9 +1,9 @@ -import { BackTop, Layout } from "antd"; -import React, { Suspense, lazy, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { Redirect, Route, Switch } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {FloatButton, Layout} from "antd"; +import React, {lazy, Suspense, useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {Route, Routes, useNavigate} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import ErrorBoundary from "../../components/error-boundary/error-boundary.component"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; @@ -12,132 +12,107 @@ 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 UpdateAlert from "../../components/update-alert/update-alert.component"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import "./tech.page.styles.scss"; +import {selectTechnician} from "../../redux/tech/tech.selectors"; import "./tech.page.styles.scss"; + const TimeTicketModalContainer = lazy(() => - import("../../components/time-ticket-modal/time-ticket-modal.container") + import("../../components/time-ticket-modal/time-ticket-modal.container") ); const EmailOverlayContainer = lazy(() => - import("../../components/email-overlay/email-overlay.container.jsx") + import("../../components/email-overlay/email-overlay.container.jsx") ); const PrintCenterModalContainer = lazy(() => - import("../../components/print-center-modal/print-center-modal.container") + import("../../components/print-center-modal/print-center-modal.container") ); const TechLogin = lazy(() => - import("../../components/tech-login/tech-login.component") + import("../../components/tech-login/tech-login.component") ); const TechLookup = lazy(() => import("../tech-lookup/tech-lookup.container")); const ProductionListPage = lazy(() => - import("../production-list/production-list.container") + import("../production-list/production-list.container") ); const ProductionBoardPage = lazy(() => - import("../production-board/production-board.container") + import("../production-board/production-board.container") ); const TechJobClock = lazy(() => - import("../tech-job-clock/tech-job-clock.component") + import("../tech-job-clock/tech-job-clock.component") ); const TechShiftClock = lazy(() => - import("../tech-shift-clock/tech-shift-clock.component") + import("../tech-shift-clock/tech-shift-clock.component") ); const TimeTicketModalTask = lazy(() => - import( - "../../components/time-ticket-task-modal/time-ticket-task-modal.container" - ) + import( + "../../components/time-ticket-task-modal/time-ticket-task-modal.container" + ) ); const TechAssignedProdJobs = lazy(() => - import("../tech-assigned-prod-jobs/tech-assigned-prod-jobs.component") + import("../tech-assigned-prod-jobs/tech-assigned-prod-jobs.component") ); const TechDispatchedParts = lazy(() => - import("../tech-dispatched-parts/tech-dispatched-parts.page") + import("../tech-dispatched-parts/tech-dispatched-parts.page") ); -const { Content } = Layout; +const {Content} = Layout; const mapStateToProps = createStructuredSelector({ - technician: selectTechnician, + technician: selectTechnician, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function TechPage({ technician, match }) { - const { t } = useTranslation(); +export function TechPage({technician}) { + const {t} = useTranslation(); + const navigate = useNavigate(); - useEffect(() => { - document.title = t("titles.app"); - }, [t]); + useEffect(() => { + document.title = t("titles.app"); + }, [t]); - return ( - - - - {technician ? null : } - - - - - - - } - > - - - - - - - - - - - - - - - - - - + useEffect(() => { + if (!technician) { + navigate(`/tech/login`); + } + }, [technician, navigate]); - - - - - ); + return ( + + + + + + + + + + } + > + + + + + + + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + + + + + + + + + + ); } -export default connect(mapStateToProps, mapDispatchToProps)(TechPage); + +export default connect(mapStateToProps, mapDispatchToProps)(TechPage); \ No newline at end of file diff --git a/client/src/pages/tech/tech.page.container.jsx b/client/src/pages/tech/tech.page.container.jsx index 6b74b522c..8af2c0f83 100644 --- a/client/src/pages/tech/tech.page.container.jsx +++ b/client/src/pages/tech/tech.page.container.jsx @@ -1,38 +1,40 @@ -import { useQuery } from "@apollo/client"; -import React, { useEffect } from "react"; -import { connect } from "react-redux"; +import {useQuery} from "@apollo/client"; +import React, {useEffect} from "react"; +import {connect} from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries"; -import { setBodyshop } from "../../redux/user/user.actions"; +import {QUERY_BODYSHOP} from "../../graphql/bodyshop.queries"; +import {setBodyshop} from "../../redux/user/user.actions"; import TechPage from "./tech.page.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { useTranslation } from "react-i18next"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { createStructuredSelector } from "reselect"; +import {useTranslation} from "react-i18next"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import {createStructuredSelector} from "reselect"; //import "../../utils/RegisterSw"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBodyshop: (bs) => dispatch(setBodyshop(bs)), + setBodyshop: (bs) => dispatch(setBodyshop(bs)), }); -export function TechPageContainer({ bodyshop, setBodyshop, match }) { - const { loading, error, data } = useQuery(QUERY_BODYSHOP, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - const { t } = useTranslation(); - useEffect(() => { - if (data) setBodyshop(data.bodyshops[0]); - }, [data, setBodyshop]); +export function TechPageContainer({bodyshop, setBodyshop}) { + const {loading, error, data} = useQuery(QUERY_BODYSHOP, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); + const {t} = useTranslation(); - if (loading || !bodyshop) - return ; - if (error) return ; - return ; + useEffect(() => { + if (data) setBodyshop(data.bodyshops[0]); + }, [data, setBodyshop]); + + + if (loading || !bodyshop) + return ; + if (error) return ; + return ; } export default connect(mapStateToProps, mapDispatchToProps)(TechPageContainer); diff --git a/client/src/pages/temporary-docs/temporary-docs.component.jsx b/client/src/pages/temporary-docs/temporary-docs.component.jsx index 6ac4e6c03..d9a9f1053 100644 --- a/client/src/pages/temporary-docs/temporary-docs.component.jsx +++ b/client/src/pages/temporary-docs/temporary-docs.component.jsx @@ -1,45 +1,47 @@ -import { useQuery } from "@apollo/client"; +import {useQuery} from "@apollo/client"; import React from "react"; import AlertComponent from "../../components/alert/alert.component"; import JobsDocumentsComponent from "../../components/jobs-documents-gallery/jobs-documents-gallery.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { QUERY_TEMPORARY_DOCS } from "../../graphql/documents.queries"; +import {QUERY_TEMPORARY_DOCS} from "../../graphql/documents.queries"; + +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; +import {selectBodyshop} from "../../redux/user/user.selectors"; +import JobsDocumentsLocalGallery + from "../../components/jobs-documents-local-gallery/jobs-documents-local-gallery.container"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import JobsDocumentsLocalGallery from "../../components/jobs-documents-local-gallery/jobs-documents-local-gallery.container"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TemporaryDocsComponent); -export function TemporaryDocsComponent({ bodyshop }) { - const { loading, error, data, refetch } = useQuery(QUERY_TEMPORARY_DOCS, { - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - skip: bodyshop.uselocalmediaserver, - }); +export function TemporaryDocsComponent({bodyshop}) { + const {loading, error, data, refetch} = useQuery(QUERY_TEMPORARY_DOCS, { + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + skip: bodyshop.uselocalmediaserver, + }); - if (loading) return ; - if (error) return ; + if (loading) return ; + if (error) return ; - if (bodyshop.uselocalmediaserver) { - return ; - } - return ( - - ); + if (bodyshop.uselocalmediaserver) { + return ; + } + return ( + + ); } diff --git a/client/src/pages/temporary-docs/temporary-docs.container.jsx b/client/src/pages/temporary-docs/temporary-docs.container.jsx index b67d19413..d4c50d31f 100644 --- a/client/src/pages/temporary-docs/temporary-docs.container.jsx +++ b/client/src/pages/temporary-docs/temporary-docs.container.jsx @@ -1,45 +1,43 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; import TemporaryDocsComponent from "./temporary-docs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function TempDocumentsContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function TempDocumentsContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.temporarydocs"); - setSelectedHeader("temporarydocs"); - setBreadcrumbs([ - { - link: "/manage/temporarydocs", - label: t("titles.bc.temporarydocs"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.temporarydocs"); + setSelectedHeader("temporarydocs"); + setBreadcrumbs([ + { + link: "/manage/temporarydocs", + label: t("titles.bc.temporarydocs"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect( - mapStateToProps, - mapDispatchToProps + mapStateToProps, + mapDispatchToProps )(TempDocumentsContainer); diff --git a/client/src/pages/time-tickets/time-tickets.container.jsx b/client/src/pages/time-tickets/time-tickets.container.jsx index 0730fca95..1d6dba1f4 100644 --- a/client/src/pages/time-tickets/time-tickets.container.jsx +++ b/client/src/pages/time-tickets/time-tickets.container.jsx @@ -1,100 +1,99 @@ -import { useQuery } from "@apollo/client"; -import { Col, Row, Space } from "antd"; -import moment from "moment"; -import queryString from "query-string"; -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { useLocation } from "react-router-dom"; -import { createStructuredSelector } from "reselect"; +import {useQuery} from "@apollo/client"; +import {Col, Row, Space} from "antd"; +import dayjs from "../../utils/day"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {useSearchParams} from "react-router-dom"; +import {createStructuredSelector} from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import TimeTicketsDatesSelector from "../../components/ticket-tickets-dates-selector/time-tickets-dates-selector.component"; +import TimeTicketsDatesSelector + from "../../components/ticket-tickets-dates-selector/time-tickets-dates-selector.component"; import TimeTicketList from "../../components/time-ticket-list/time-ticket-list.component"; import TimeTicketsPayrollTable from "../../components/time-tickets-payroll-table/time-tickets-payroll-table.component"; -import TimeTicketsSummaryEmployees from "../../components/time-tickets-summary-employees/time-tickets-summary-employees.component"; -import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries"; -import TimeTicketsAttendanceTable from "../../components/time-tickets-attendance-table/time-tickets-attendance-table.component"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; +import TimeTicketsSummaryEmployees + from "../../components/time-tickets-summary-employees/time-tickets-summary-employees.component"; +import {QUERY_TIME_TICKETS_IN_RANGE} from "../../graphql/timetickets.queries"; +import TimeTicketsAttendanceTable + from "../../components/time-tickets-attendance-table/time-tickets-attendance-table.component"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; import TimeTicketsCommit from "../../components/time-tickets-commit/time-tickets-commit.component"; const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function TimeTicketsContainer({ - bodyshop, - setBreadcrumbs, - setSelectedHeader, -}) { - const { t } = useTranslation(); - useEffect(() => { - document.title = t("titles.timetickets"); - setSelectedHeader("timetickets"); - setBreadcrumbs([ - { - link: "/manage/timetickets", - label: t("titles.bc.timetickets"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + bodyshop, + setBreadcrumbs, + setSelectedHeader, + }) { + const {t} = useTranslation(); + const [searchParams] = useSearchParams(); + const {start, end} = Object.fromEntries(searchParams); - const searchParams = queryString.parse(useLocation().search); - const { start, end } = searchParams; + const startDate = start + ? dayjs(start) + : dayjs().startOf("week").subtract(7, "day"); + const endDate = end ? dayjs(end) : dayjs().endOf("week"); - const startDate = start - ? moment(start) - : moment().startOf("week").subtract(7, "days"); - const endDate = end ? moment(end) : moment().endOf("week"); + const {loading, error, data} = useQuery(QUERY_TIME_TICKETS_IN_RANGE, { + variables: { + start: startDate, + end: endDate, + }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", + }); - const { loading, error, data } = useQuery(QUERY_TIME_TICKETS_IN_RANGE, { - variables: { - start: startDate, - end: endDate, - }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); + useEffect(() => { + document.title = t("titles.timetickets"); + setSelectedHeader("timetickets"); + setBreadcrumbs([ + { + link: "/manage/timetickets", + label: t("titles.bc.timetickets"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - if (error) return ; + if (error) return ; - return ( - - -
    - - - - - - - } - /> - - - - - - - ); + return ( + + + + + + + + + + } + /> + + + + + + + ); } export default connect( - mapStateToProps, - mapDispatchToProps -)(TimeTicketsContainer); + mapStateToProps, + mapDispatchToProps +)(TimeTicketsContainer); \ No newline at end of file diff --git a/client/src/pages/tt-approvals/tt-approvals.page.container.jsx b/client/src/pages/tt-approvals/tt-approvals.page.container.jsx index 1d8b689ef..dcd34ff01 100644 --- a/client/src/pages/tt-approvals/tt-approvals.page.container.jsx +++ b/client/src/pages/tt-approvals/tt-approvals.page.container.jsx @@ -1,42 +1,40 @@ -import React, { useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import React, {useEffect} from "react"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; +import {createStructuredSelector} from "reselect"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import TtApprovalsList from "../../components/tt-approvals-list/tt-approvals-list.container"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { selectBodyshop } from "../../redux/user/user.selectors"; +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {selectBodyshop} from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, + bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function TtApprovalsPage({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function TtApprovalsPage({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.ttapprovals"); - setSelectedHeader("ttapprovals"); - setBreadcrumbs([ - { - link: "/manage/ttapprovals", - label: t("titles.bc.ttapprovals"), - }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.ttapprovals"); + setSelectedHeader("ttapprovals"); + setBreadcrumbs([ + { + link: "/manage/ttapprovals", + label: t("titles.bc.ttapprovals"), + }, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ( - - - - ); + return ( + + + + ); } + export default connect(mapStateToProps, mapDispatchToProps)(TtApprovalsPage); diff --git a/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx b/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx index 6f8489f62..38fce6c88 100644 --- a/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx +++ b/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx @@ -1,20 +1,20 @@ -import { Col, Divider, Row } from "antd"; +import {Col, Divider, Row} from "antd"; import React from "react"; import VehicleDetailFormContainer from "../../components/vehicle-detail-form/vehicle-detail-form.container"; import VehicleDetailJobsComponent from "../../components/vehicle-detail-jobs/vehicle-detail-jobs.component"; -export default function VehicleDetailComponent({ vehicle, refetch }) { - return ( -
    - -
    - - - - - - - - - ); +export default function VehicleDetailComponent({vehicle, refetch}) { + return ( +
    + +
    + + + + + + + + + ); } diff --git a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx index 77baa7bfd..04209b583 100644 --- a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx +++ b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx @@ -1,94 +1,90 @@ -import React, { useEffect } from "react"; +import React, {useEffect} from "react"; import VehicleDetailComponent from "./vehicles-detail.page.component"; -import { useQuery } from "@apollo/client"; -import { QUERY_VEHICLE_BY_ID } from "../../graphql/vehicles.queries"; +import {useQuery} from "@apollo/client"; +import {useParams} from 'react-router-dom'; +import {QUERY_VEHICLE_BY_ID} from "../../graphql/vehicles.queries"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import AlertComponent from "../../components/alert/alert.component"; -import { useTranslation } from "react-i18next"; -import { - setBreadcrumbs, - addRecentItem, - setSelectedHeader, -} from "../../redux/application/application.actions"; -import { connect } from "react-redux"; -import { CreateRecentItem } from "../../utils/create-recent-item"; +import {useTranslation} from "react-i18next"; +import {addRecentItem, setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; +import {connect} from "react-redux"; +import {CreateRecentItem} from "../../utils/create-recent-item"; import NotFound from "../../components/not-found/not-found.component"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - addRecentItem: (item) => dispatch(addRecentItem(item)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); export function VehicleDetailContainer({ - match, - setBreadcrumbs, - addRecentItem, - setSelectedHeader, -}) { - const { vehId } = match.params; - const { t } = useTranslation(); + setBreadcrumbs, + addRecentItem, + setSelectedHeader, + }) { + const {vehId} = useParams(); + const {t} = useTranslation(); - const { loading, data, error, refetch } = useQuery(QUERY_VEHICLE_BY_ID, { - variables: { id: vehId }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only", - }); - - useEffect(() => { - document.title = t("titles.vehicledetail", { - vehicle: - data && data.vehicles_by_pk - ? `${(data.vehicles_by_pk && data.vehicles_by_pk.v_model_yr) || ""} ${ - (data.vehicles_by_pk && data.vehicles_by_pk.v_make_desc) || "" - } ${ - (data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc) || "" - }` - : "", + const {loading, data, error, refetch} = useQuery(QUERY_VEHICLE_BY_ID, { + variables: {id: vehId}, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only", }); - setSelectedHeader("vehicles"); - setBreadcrumbs([ - { link: "/manage/vehicles", label: t("titles.bc.vehicles") }, - { - link: `/manage/vehicles/${vehId}`, - label: t("titles.bc.vehicle-details", { - vehicle: - data && data.vehicles_by_pk - ? `${ - (data.vehicles_by_pk && data.vehicles_by_pk.v_model_yr) || "" - } ${ - (data.vehicles_by_pk && data.vehicles_by_pk.v_make_desc) || "" - } ${ - (data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc) || - "" - }` - : "", - }), - }, - ]); + useEffect(() => { + document.title = t("titles.vehicledetail", { + vehicle: + data && data.vehicles_by_pk + ? `${(data.vehicles_by_pk && data.vehicles_by_pk.v_model_yr) || ""} ${ + (data.vehicles_by_pk && data.vehicles_by_pk.v_make_desc) || "" + } ${ + (data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc) || "" + }` + : "", + }); + setSelectedHeader("vehicles"); - if (data && data.vehicles_by_pk) - addRecentItem( - CreateRecentItem( - vehId, - "vehicle", - `${data.vehicles_by_pk.v_vin || "N/A"} | ${ - data.vehicles_by_pk.v_model_yr || "" - } ${data.vehicles_by_pk.v_make_desc || ""} ${ - data.vehicles_by_pk.v_model_desc || "" - }`.trim(), - `/manage/vehicles/${vehId}` - ) - ); - }, [t, data, setBreadcrumbs, vehId, addRecentItem, setSelectedHeader]); + setBreadcrumbs([ + {link: "/manage/vehicles", label: t("titles.bc.vehicles")}, + { + link: `/manage/vehicles/${vehId}`, + label: t("titles.bc.vehicle-details", { + vehicle: + data && data.vehicles_by_pk + ? `${ + (data.vehicles_by_pk && data.vehicles_by_pk.v_model_yr) || "" + } ${ + (data.vehicles_by_pk && data.vehicles_by_pk.v_make_desc) || "" + } ${ + (data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc) || + "" + }` + : "", + }), + }, + ]); - if (loading) return ; - if (error) return ; + if (data && data.vehicles_by_pk) + addRecentItem( + CreateRecentItem( + vehId, + "vehicle", + `${data.vehicles_by_pk.v_vin || "N/A"} | ${ + data.vehicles_by_pk.v_model_yr || "" + } ${data.vehicles_by_pk.v_make_desc || ""} ${ + data.vehicles_by_pk.v_model_desc || "" + }`.trim(), + `/manage/vehicles/${vehId}` + ) + ); + }, [t, data, setBreadcrumbs, vehId, addRecentItem, setSelectedHeader]); - if (!!!data.vehicles_by_pk) return ; - return ( - - ); + if (loading) return ; + if (error) return ; + if (!data.vehicles_by_pk) return ; + return ( + + ); } + export default connect(null, mapDispatchToProps)(VehicleDetailContainer); diff --git a/client/src/pages/vehicles/vehicles.page.component.jsx b/client/src/pages/vehicles/vehicles.page.component.jsx index 706a37a13..c1fc6ceac 100644 --- a/client/src/pages/vehicles/vehicles.page.component.jsx +++ b/client/src/pages/vehicles/vehicles.page.component.jsx @@ -2,5 +2,5 @@ import React from "react"; import VehiclesListContainer from "../../components/vehicles-list/vehicles-list.container"; export default function VehiclesPageComponent() { - return ; + return ; } diff --git a/client/src/pages/vehicles/vehicles.page.container.jsx b/client/src/pages/vehicles/vehicles.page.container.jsx index 7e57a7add..d65f45deb 100644 --- a/client/src/pages/vehicles/vehicles.page.container.jsx +++ b/client/src/pages/vehicles/vehicles.page.container.jsx @@ -1,28 +1,27 @@ -import React, { useEffect } from "react"; +import React, {useEffect} from "react"; import VehiclesPageComponent from "./vehicles.page.component"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; +import {useTranslation} from "react-i18next"; +import {connect} from "react-redux"; + +import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions"; -import { - setBreadcrumbs, - setSelectedHeader, -} from "../../redux/application/application.actions"; const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), }); -export function VehiclesPageContainer({ setBreadcrumbs, setSelectedHeader }) { - const { t } = useTranslation(); +export function VehiclesPageContainer({setBreadcrumbs, setSelectedHeader}) { + const {t} = useTranslation(); - useEffect(() => { - document.title = t("titles.vehicles"); - setSelectedHeader("vehicles"); - setBreadcrumbs([ - { link: "/manage/vehicles", label: t("titles.bc.vehicles") }, - ]); - }, [t, setBreadcrumbs, setSelectedHeader]); + useEffect(() => { + document.title = t("titles.vehicles"); + setSelectedHeader("vehicles"); + setBreadcrumbs([ + {link: "/manage/vehicles", label: t("titles.bc.vehicles")}, + ]); + }, [t, setBreadcrumbs, setSelectedHeader]); - return ; + return ; } + export default connect(null, mapDispatchToProps)(VehiclesPageContainer); diff --git a/client/src/redux/application/application.sagas.js b/client/src/redux/application/application.sagas.js index 447fed0e6..64bdd48ce 100644 --- a/client/src/redux/application/application.sagas.js +++ b/client/src/redux/application/application.sagas.js @@ -1,4 +1,4 @@ -import moment from "moment"; +import dayjs from "../../utils/day"; import { all, call, put, select, takeLatest } from "redux-saga/effects"; import { QUERY_SCHEDULE_LOAD_DATA } from "../../graphql/appointments.queries"; import { INSERT_AUDIT_TRAIL } from "../../graphql/audit_trail.queries"; @@ -18,8 +18,8 @@ export function* onCalculateScheduleLoad() { ); } export function* calculateScheduleLoad({ payload: end }) { - //REMINDER: Moment.js is not immutable. Today WILL change when adjusted. - const today = moment().startOf("day"); + //REMINDER: dayjs.js is not immutable. Today WILL change when adjusted. + const today = dayjs().startOf("day"); const state = yield select(); const buckets = state.user.bodyshop.ssbuckets; @@ -47,7 +47,7 @@ export function* calculateScheduleLoad({ payload: end }) { //Add all of the jobs currently in production to the buckets so that we have a starting point. if ( !item.actual_completion && - moment(item.scheduled_completion).isBefore(moment().startOf("day")) + dayjs(item.scheduled_completion).isBefore(dayjs().startOf("day")) ) { problemJobs.push({ ...item, @@ -57,7 +57,7 @@ export function* calculateScheduleLoad({ payload: end }) { if ( item.actual_completion && - moment(item.actual_completion).isBefore(moment().startOf("day")) + dayjs(item.actual_completion).isBefore(dayjs().startOf("day")) ) { problemJobs.push({ ...item, @@ -98,7 +98,7 @@ export function* calculateScheduleLoad({ payload: end }) { code: "Job has an actual in date, but no actual completion date and is not marked as in production", }); } - if (item.actual_in && moment(item.actual_in).isAfter(moment())) { + if (item.actual_in && dayjs(item.actual_in).isAfter(dayjs())) { problemJobs.push({ ...item, code: "Job has an actual in date set in the future", @@ -106,7 +106,7 @@ export function* calculateScheduleLoad({ payload: end }) { } if ( item.actual_completion && - moment(item.actual_completion).isAfter(moment()) + dayjs(item.actual_completion).isAfter(dayjs()) ) { problemJobs.push({ ...item, @@ -120,8 +120,8 @@ export function* calculateScheduleLoad({ payload: end }) { }); } - const itemDate = moment(item.actual_in || item.scheduled_in).format( - "yyyy-MM-DD" + const itemDate = dayjs(item.actual_in || item.scheduled_in).format( + "YYYY-MM-DD" ); const AddJobForSchedulingCalc = !item.inproduction; @@ -169,9 +169,9 @@ export function* calculateScheduleLoad({ payload: end }) { const AddJobForSchedulingCalc = inProdJobs || inArrJobs; - const itemDate = moment( + const itemDate = dayjs( item.actual_completion || item.scheduled_completion - ).format("yyyy-MM-DD"); + ).format("YYYY-MM-DD"); //Skip it, it's already completed. if (!!load[itemDate]) { @@ -207,12 +207,12 @@ export function* calculateScheduleLoad({ payload: end }) { //Propagate the expected load to each day. - const range = Math.round(moment.duration(end.diff(today)).asDays()) + 1; + const range = Math.round(dayjs.duration(end.diff(today)).asDays()) + 1; for (var day = 0; day < range; day++) { - const current = moment(today).add(day, "days").format("yyyy-MM-DD"); - const prev = moment(today) - .add(day - 1, "days") - .format("yyyy-MM-DD"); + const current = dayjs(today).add(day, "day").format("YYYY-MM-DD"); + const prev = dayjs(today) + .add(day - 1, "day") + .format("YYYY-MM-DD"); if (!!!load[current]) { load[current] = {}; } diff --git a/client/src/redux/email/email.reducer.js b/client/src/redux/email/email.reducer.js index 5c114bc62..37dd26fb1 100644 --- a/client/src/redux/email/email.reducer.js +++ b/client/src/redux/email/email.reducer.js @@ -10,7 +10,7 @@ const INITIAL_STATE = { template: { name: null, variables: {} }, }, - visible: false, + open: false, error: null, }; @@ -19,13 +19,13 @@ const emailReducer = (state = INITIAL_STATE, action) => { case EmailActionTypes.TOGGLE_EMAIL_OVERLAY_VISIBLE: return { ...state, - visible: !state.visible, + open: !state.open, }; case EmailActionTypes.SET_EMAIL_OPTIONS: return { ...state, emailConfig: { ...action.payload }, - visible: true, + open: true, }; default: return state; diff --git a/client/src/redux/email/email.selectors.js b/client/src/redux/email/email.selectors.js index 5730e36df..9a5a49a7a 100644 --- a/client/src/redux/email/email.selectors.js +++ b/client/src/redux/email/email.selectors.js @@ -4,7 +4,7 @@ const selectEmail = (state) => state.email; export const selectEmailVisible = createSelector( [selectEmail], - (email) => email.visible + (email) => email.open ); export const selectEmailConfig = createSelector( diff --git a/client/src/redux/messaging/messaging.reducer.js b/client/src/redux/messaging/messaging.reducer.js index d70048c5b..56ef5f177 100644 --- a/client/src/redux/messaging/messaging.reducer.js +++ b/client/src/redux/messaging/messaging.reducer.js @@ -1,7 +1,7 @@ import MessagingActionTypes from "./messaging.types"; const INITIAL_STATE = { - visible: false, + open: false, selectedConversationId: null, isSending: false, error: null, @@ -16,7 +16,7 @@ const messagingReducer = (state = INITIAL_STATE, action) => { case MessagingActionTypes.TOGGLE_CHAT_VISIBLE: return { ...state, - visible: !state.visible, + open: !state.open, }; case MessagingActionTypes.OPEN_CHAT_BY_PHONE: return { @@ -26,7 +26,7 @@ const messagingReducer = (state = INITIAL_STATE, action) => { case MessagingActionTypes.SET_SELECTED_CONVERSATION: return { ...state, - visible: true, + open: true, searchingForConversation: false, selectedConversationId: action.payload, }; diff --git a/client/src/redux/messaging/messaging.selectors.js b/client/src/redux/messaging/messaging.selectors.js index 84038cee7..265690f4b 100644 --- a/client/src/redux/messaging/messaging.selectors.js +++ b/client/src/redux/messaging/messaging.selectors.js @@ -4,7 +4,7 @@ const selectMessaging = (state) => state.messaging; export const selectChatVisible = createSelector( [selectMessaging], - (messaging) => messaging.visible + (messaging) => messaging.open ); export const selectIsSending = createSelector( diff --git a/client/src/redux/modals/modals.reducer.js b/client/src/redux/modals/modals.reducer.js index ad08c88e3..c049326fd 100644 --- a/client/src/redux/modals/modals.reducer.js +++ b/client/src/redux/modals/modals.reducer.js @@ -1,7 +1,7 @@ import ModalsActionTypes from "./modals.types"; const baseModal = { - visible: false, + open: false, context: {}, actions: { refetch: null, @@ -36,7 +36,7 @@ const modalsReducer = (state = INITIAL_STATE, action) => { ...state, [action.payload]: { ...state[action.payload], - visible: !state[action.payload].visible, + open: !state[action.payload].open, }, }; case ModalsActionTypes.SET_MODAL_CONTEXT: @@ -45,7 +45,7 @@ const modalsReducer = (state = INITIAL_STATE, action) => { [action.payload.modal]: { ...state[action.payload.modal], ...action.payload.context, - visible: true, + open: true, }, }; default: diff --git a/client/src/redux/store.js b/client/src/redux/store.js index 55452833d..ae8a328d2 100644 --- a/client/src/redux/store.js +++ b/client/src/redux/store.js @@ -1,5 +1,7 @@ -import { createStore, applyMiddleware, compose } from "redux"; -import { persistStore } from "redux-persist"; +import { configureStore } from '@reduxjs/toolkit'; +import { + persistStore, +} from "redux-persist"; import { createLogger } from "redux-logger"; import createSagaMiddleware from "redux-saga"; import { @@ -26,24 +28,21 @@ const middlewares = [ sagaMiddleWare, createStateSyncMiddleware(reduxSyncConfig), ]; + if (process.env.NODE_ENV === "development") { middlewares.push(createLogger({ collapsed: true, diff: true })); } -//middlewares.push(Tracker.use(trackerRedux())); -const composeEnhancers = - typeof window === "object" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ - ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ - // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize... - }) - : compose; -const enhancer = composeEnhancers( - applyMiddleware(...middlewares), - sentryReduxEnhancer - // other store enhancers if any -); +export const store = configureStore({ + reducer: rootReducer, + middleware: (getDefaultMiddleware) => getDefaultMiddleware({ + serializableCheck: false, + }).concat(middlewares), + // middleware: middlewares, + devTools: process.env.NODE_ENV !== 'production', + enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat(sentryReduxEnhancer) +}); -export const store = createStore(rootReducer, enhancer); sagaMiddleWare.run(rootSaga); initMessageListener(store); @@ -53,4 +52,4 @@ export default e; if (window.Cypress) { window.store = store; -} +} \ No newline at end of file diff --git a/client/src/redux/user/user.sagas.js b/client/src/redux/user/user.sagas.js index db6e4c4e1..948dc377a 100644 --- a/client/src/redux/user/user.sagas.js +++ b/client/src/redux/user/user.sagas.js @@ -266,7 +266,7 @@ export function* SetAuthLevelFromShopDetails({ payload }) { const userEmail = yield select((state) => state.user.currentUser.email); try { //console.log("Setting shop timezone."); - // moment.tz.setDefault(payload.timezone); + // dayjs.tz.setDefault(payload.timezone); } catch (error) { console.log(error); } diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index ed0ad9475..5afca83e5 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1762,6 +1762,7 @@ "estimator": "Estimator", "filehandler": "Adjuster", "insurance": "Insurance Details", + "more": "More", "notes": "Notes", "parts": "Parts", "totals": "Totals", @@ -2093,7 +2094,7 @@ "joblookup": "Job Lookup", "login": "Login", "logout": "Logout", - "productionboard": "Production Board - Visual", + "productionboard": "Production Visual", "productionlist": "Production List", "shiftclockin": "Shift Clock" } @@ -2719,6 +2720,7 @@ "open_orders": "Open Orders by Date", "open_orders_csr": "Open Orders by CSR", "open_orders_estimator": "Open Orders by Estimator", + "open_orders_excel": "Open Orders - Excel", "open_orders_ins_co": "Open Orders by Insurance Company", "open_orders_referral": "Open Orders by Referral Source", "open_orders_specific_csr": "Open Orders filtered by CSR", @@ -3014,7 +3016,7 @@ "parts-queue": "Parts Queue | $t(titles.app)", "payments-all": "Payments | $t(titles.app)", "phonebook": "Phonebook | $t(titles.app)", - "productionboard": "Production - Board", + "productionboard": "Production Board - Visual | $t(titles.app)", "productionlist": "Production Board - List | $t(titles.app)", "profile": "My Profile | $t(titles.app)", "readyjobs": "Ready Jobs | $t(titles.app)", @@ -3026,6 +3028,10 @@ "shop-csi": "CSI Responses | $t(titles.app)", "shop-templates": "Shop Templates | $t(titles.app)", "shop_vendors": "Vendors | $t(titles.app)", + "techconsole": "Technician Console | $t(titles.app)", + "techjoblookup": "Technician Job Lookup | $t(titles.app)", + "techjobclock": "Technician Job Clock | $t(titles.app)", + "techshiftclock": "Technician Shift Clock | $t(titles.app)", "temporarydocs": "Temporary Documents | $t(titles.app)", "timetickets": "Time Tickets | $t(titles.app)", "ttapprovals": "Time Ticket Approvals | $t(titles.app)", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 3938f6e90..f35c9bd0f 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -1762,6 +1762,7 @@ "estimator": "Estimador", "filehandler": "File Handler", "insurance": "detalles del seguro", + "more": "Más", "notes": "Notas", "parts": "Partes", "totals": "Totales", @@ -2719,6 +2720,7 @@ "open_orders": "", "open_orders_csr": "", "open_orders_estimator": "", + "open_orders_excel": "", "open_orders_ins_co": "", "open_orders_referral": "", "open_orders_specific_csr": "", @@ -3007,7 +3009,7 @@ "jobs-intake": "", "jobsavailable": "Empleos disponibles | $t(titles.app)", "jobsdetail": "Trabajo {{ro_number}} | $t(titles.app)", - "jobsdocuments": "Documentos de trabajo {{ro_number}} | $ t (títulos.app)", + "jobsdocuments": "Documentos de trabajo {{ro_number}} | $t(titles.app)", "manageroot": "Casa | $t(titles.app)", "owners": "Todos los propietarios | $t(titles.app)", "owners-detail": "", @@ -3026,6 +3028,10 @@ "shop-csi": "", "shop-templates": "", "shop_vendors": "Vendedores | $t(titles.app)", + "techconsole": "$t(titles.app)", + "techjoblookup": "$t(titles.app)", + "techjobclock": "$t(titles.app)", + "techshiftclock": "$t(titles.app)", "temporarydocs": "", "timetickets": "", "ttapprovals": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index eb99cdaf4..fc0974abd 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -1762,6 +1762,7 @@ "estimator": "Estimateur", "filehandler": "Gestionnaire de fichiers", "insurance": "Détails de l'assurance", + "more": "Plus", "notes": "Remarques", "parts": "les pièces", "totals": "Totaux", @@ -2719,6 +2720,7 @@ "open_orders": "", "open_orders_csr": "", "open_orders_estimator": "", + "open_orders_excel": "", "open_orders_ins_co": "", "open_orders_referral": "", "open_orders_specific_csr": "", @@ -3007,7 +3009,7 @@ "jobs-intake": "", "jobsavailable": "Emplois disponibles | $t(titles.app)", "jobsdetail": "Travail {{ro_number}} | $t(titles.app)", - "jobsdocuments": "Documents de travail {{ro_number}} | $ t (titres.app)", + "jobsdocuments": "Documents de travail {{ro_number}} | $t(titles.app)", "manageroot": "Accueil | $t(titles.app)", "owners": "Tous les propriétaires | $t(titles.app)", "owners-detail": "", @@ -3026,6 +3028,10 @@ "shop-csi": "", "shop-templates": "", "shop_vendors": "Vendeurs | $t(titles.app)", + "techconsole": "$t(titles.app)", + "techjoblookup": "$t(titles.app)", + "techjobclock": "$t(titles.app)", + "techshiftclock": "$t(titles.app)", "temporarydocs": "", "timetickets": "", "ttapprovals": "", diff --git a/client/src/utils/DateFormatter.jsx b/client/src/utils/DateFormatter.jsx index d034266e3..b7275b772 100644 --- a/client/src/utils/DateFormatter.jsx +++ b/client/src/utils/DateFormatter.jsx @@ -1,10 +1,10 @@ import { Tooltip } from "antd"; -import moment from "moment"; +import dayjs from "../utils/day"; import React from "react"; export function DateFormatter(props) { return props.children - ? moment(props.children).format( + ? dayjs(props.children).format( props.includeDay ? "ddd MM/DD/YYYY" : "MM/DD/YYYY" ) : null; @@ -12,19 +12,19 @@ export function DateFormatter(props) { export function DateTimeFormatter(props) { return props.children - ? moment(props.children).format( + ? dayjs(props.children).format( props.format ? props.format : "MM/DD/YYYY hh:mm a" ) : null; } export function TimeFormatter(props) { return props.children - ? moment(props.children).format(props.format ? props.format : "hh:mm a") + ? dayjs(props.children).format(props.format ? props.format : "hh:mm a") : null; } export function TimeAgoFormatter(props) { - const m = moment(props.children); + const m = dayjs(props.children); return props.children ? ( {m.fromNow()} @@ -33,5 +33,5 @@ export function TimeAgoFormatter(props) { } export function DateTimeFormat(value) { - return moment(value).format("MM/DD/YYYY hh:mm A"); + return dayjs(value).format("MM/DD/YYYY hh:mm A"); } diff --git a/client/src/utils/DatePickerRanges.js b/client/src/utils/DatePickerRanges.js index aeed206c5..dfb467866 100644 --- a/client/src/utils/DatePickerRanges.js +++ b/client/src/utils/DatePickerRanges.js @@ -1,27 +1,62 @@ -import moment from "moment"; -const range = { - Today: [moment(), moment()], - "Last 14 days": [moment().subtract(14, "days"), moment()], - "Last 7 days": [moment().subtract(7, "days"), moment()], - "Next 7 days": [moment(), moment().add(7, "days")], - "Next 14 days": [moment(), moment().add(14, "days")], - "Last Month": [ - moment().startOf("month").subtract(1, "month"), - moment().startOf("month").subtract(1, "month").endOf("month"), - ], - "This Month": [moment().startOf("month"), moment().endOf("month")], - "Next Month": [ - moment().startOf("month").add(1, "month"), - moment().startOf("month").add(1, "month").endOf("month"), - ], - "Last Quarter": [ - moment().startOf("quarter").subtract(1, "quarters"), - moment().startOf("quarter").subtract(1, "day"), - ], - "This Quarter": [ - moment().startOf("quarter"), - moment().startOf("quarter").add(1, "quarter").subtract(1, "day"), - ], - "Last 90 Days": [moment().add(-90, "days"), moment()], -}; +import dayjs from "./day"; + +const range = [ + { + label: 'Today', + value: [dayjs(), dayjs()] + }, + { + label: 'Last 14 days', + value: [dayjs().subtract(14, "day"), dayjs()] + }, + { + label: 'Last 7 days', + value: [dayjs().subtract(7, "day"), dayjs()] + }, + { + label: 'Next 7 days', + value: [dayjs(), dayjs().add(7, "day")] + }, + { + label: 'Next 14 days', + value: [dayjs(), dayjs().add(14, "day")], + }, + { + label: 'Last Month', + value: [ + dayjs().startOf("month").subtract(1, "month"), + dayjs().startOf("month").subtract(1, "month").endOf("month"), + ] + }, + { + label: 'This Month', + value: [dayjs().startOf("month"), dayjs().endOf("month")] + }, + { + label: 'Next Month', + value: [ + dayjs().startOf("month").add(1, "month"), + dayjs().startOf("month").add(1, "month").endOf("month"), + ] + }, + { + label: 'Last Quarter', + value: [ + dayjs().startOf("quarter").subtract(1, "quarter"), + dayjs().startOf("quarter").subtract(1, "day"), + ] + }, + { + label: 'This Quarter', + value: [ + dayjs().startOf("quarter"), + dayjs().startOf("quarter").add(1, "quarter").subtract(1, "day"), + ] + }, + { + label: 'Last 90 Days', + value: [dayjs().add(-90, "day"), dayjs()], + } +] + export default range; diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index 8cb4691fe..242420395 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -1,14 +1,15 @@ -import { gql } from "@apollo/client"; +import {gql} from "@apollo/client"; import jsreport from "@jsreport/browser-client"; -import { notification } from "antd"; +import {notification} from "antd"; import axios from "axios"; import _ from "lodash"; -import { auth } from "../firebase/firebase.utils"; -import { setEmailOptions } from "../redux/email/email.actions"; -import { store } from "../redux/store"; +import {auth} from "../firebase/firebase.utils"; +import {setEmailOptions} from "../redux/email/email.actions"; +import {store} from "../redux/store"; import client from "../utils/GraphQLClient"; import cleanAxios from "./CleanAxios"; -import { TemplateList } from "./TemplateConstants"; +import {TemplateList} from "./TemplateConstants"; + const server = process.env.REACT_APP_REPORTS_SERVER_URL; jsreport.serverUrl = server; @@ -16,343 +17,343 @@ jsreport.serverUrl = server; const Templates = TemplateList(); export default async function RenderTemplate( - templateObject, - bodyshop, - renderAsHtml = false, - renderAsExcel = false, - renderAsText = false -) { - if (window.jsr3) { - jsreport.serverUrl = "https://reports3.test.imex.online/"; - } - const jsrAuth = (await axios.post("/utils/jsr")).data; - - jsreport.headers["Authorization"] = jsrAuth; - - //Query assets that match the template name. Must be in format <>.query - let { contextData, useShopSpecificTemplate } = await fetchContextData( templateObject, - jsrAuth - ); - - const { ignoreCustomMargins } = Templates[templateObject.name]; - - let reportRequest = { - template: { - name: useShopSpecificTemplate - ? `/${bodyshop.imexshopid}/${templateObject.name}` - : `/${templateObject.name}`, - ...(renderAsHtml - ? {} - : { - recipe: "chrome-pdf", - ...(!ignoreCustomMargins && { - chrome: { - marginTop: - bodyshop.logo_img_path && - bodyshop.logo_img_path.headerMargin && - bodyshop.logo_img_path.headerMargin > 36 - ? bodyshop.logo_img_path.headerMargin - : "36px", - marginBottom: - bodyshop.logo_img_path && - bodyshop.logo_img_path.footerMargin && - bodyshop.logo_img_path.footerMargin > 50 - ? bodyshop.logo_img_path.footerMargin - : "50px", - }, - }), - }), - ...(renderAsExcel ? { recipe: "html-to-xlsx" } : {}), - ...(renderAsText ? { recipe: "text" } : {}), - }, - data: { - ...contextData, - ...templateObject.variables, - ...templateObject.context, - headerpath: `/${bodyshop.imexshopid}/header.html`, - footerpath: `/${bodyshop.imexshopid}/footer.html`, - bodyshop: bodyshop, - offset: bodyshop.timezone, //moment().utcOffset(), - }, - }; - - try { - const render = await jsreport.render(reportRequest); - - if (!renderAsHtml) { - render.download( - (Templates[templateObject.name] && - Templates[templateObject.name].title) || - "" - ); - } else { - let pdf; - if (bodyshop.attach_pdf_to_email) { - const pdfRequest = _.cloneDeep(reportRequest); //Updates to spread in the header details. - pdfRequest.template = { - ...pdfRequest.template, - ...{ - recipe: "chrome-pdf", - ...(!ignoreCustomMargins && { - chrome: { - marginTop: - bodyshop.logo_img_path && - bodyshop.logo_img_path.headerMargin && - bodyshop.logo_img_path.headerMargin > 36 - ? bodyshop.logo_img_path.headerMargin - : "36px", - marginBottom: - bodyshop.logo_img_path && - bodyshop.logo_img_path.footerMargin && - bodyshop.logo_img_path.footerMargin > 50 - ? bodyshop.logo_img_path.footerMargin - : "50px", - }, - }), - }, - }; - - const pdfRender = await jsreport.render(pdfRequest); - pdf = await pdfRender.toDataURI(); - } - const html = await render.toString(); - return new Promise((resolve, reject) => { - resolve({ - pdf, - filename: - Templates[templateObject.name] && - Templates[templateObject.name].title, - html, - }); - }); + bodyshop, + renderAsHtml = false, + renderAsExcel = false, + renderAsText = false +) { + if (window.jsr3) { + jsreport.serverUrl = "https://reports3.test.imex.online/"; + } + const jsrAuth = (await axios.post("/utils/jsr")).data; + + jsreport.headers["Authorization"] = jsrAuth; + + //Query assets that match the template name. Must be in format <>.query + let {contextData, useShopSpecificTemplate} = await fetchContextData( + templateObject, + jsrAuth + ); + + const {ignoreCustomMargins} = Templates[templateObject.name]; + + let reportRequest = { + template: { + name: useShopSpecificTemplate + ? `/${bodyshop.imexshopid}/${templateObject.name}` + : `/${templateObject.name}`, + ...(renderAsHtml + ? {} + : { + recipe: "chrome-pdf", + ...(!ignoreCustomMargins && { + chrome: { + marginTop: + bodyshop.logo_img_path && + bodyshop.logo_img_path.headerMargin && + bodyshop.logo_img_path.headerMargin > 36 + ? bodyshop.logo_img_path.headerMargin + : "36px", + marginBottom: + bodyshop.logo_img_path && + bodyshop.logo_img_path.footerMargin && + bodyshop.logo_img_path.footerMargin > 50 + ? bodyshop.logo_img_path.footerMargin + : "50px", + }, + }), + }), + ...(renderAsExcel ? {recipe: "html-to-xlsx"} : {}), + ...(renderAsText ? {recipe: "text"} : {}), + }, + data: { + ...contextData, + ...templateObject.variables, + ...templateObject.context, + headerpath: `/${bodyshop.imexshopid}/header.html`, + footerpath: `/${bodyshop.imexshopid}/footer.html`, + bodyshop: bodyshop, + offset: bodyshop.timezone, //dayjs().utcOffset(), + }, + }; + + try { + const render = await jsreport.render(reportRequest); + + if (!renderAsHtml) { + render.download( + (Templates[templateObject.name] && + Templates[templateObject.name].title) || + "" + ); + } else { + let pdf; + if (bodyshop.attach_pdf_to_email) { + const pdfRequest = _.cloneDeep(reportRequest); //Updates to spread in the header details. + pdfRequest.template = { + ...pdfRequest.template, + ...{ + recipe: "chrome-pdf", + ...(!ignoreCustomMargins && { + chrome: { + marginTop: + bodyshop.logo_img_path && + bodyshop.logo_img_path.headerMargin && + bodyshop.logo_img_path.headerMargin > 36 + ? bodyshop.logo_img_path.headerMargin + : "36px", + marginBottom: + bodyshop.logo_img_path && + bodyshop.logo_img_path.footerMargin && + bodyshop.logo_img_path.footerMargin > 50 + ? bodyshop.logo_img_path.footerMargin + : "50px", + }, + }), + }, + }; + + const pdfRender = await jsreport.render(pdfRequest); + pdf = await pdfRender.toDataURI(); + } + const html = await render.toString(); + return new Promise((resolve, reject) => { + resolve({ + pdf, + filename: + Templates[templateObject.name] && + Templates[templateObject.name].title, + html, + }); + }); + } + } catch (error) { + notification["error"]({message: JSON.stringify(error)}); } - } catch (error) { - notification["error"]({ message: JSON.stringify(error) }); - } } export async function RenderTemplates( - templateObjects, - bodyshop, - renderAsHtml = false + templateObjects, + bodyshop, + renderAsHtml = false ) { - //Query assets that match the template name. Must be in format <>.query - let unsortedTemplatesAndData = []; - let proms = []; - const jsrAuth = (await axios.post("/utils/jsr")).data; - jsreport.headers["Authorization"] = jsrAuth; + //Query assets that match the template name. Must be in format <>.query + let unsortedTemplatesAndData = []; + let proms = []; + const jsrAuth = (await axios.post("/utils/jsr")).data; + jsreport.headers["Authorization"] = jsrAuth; - templateObjects.forEach((template) => { - proms.push( - (async () => { - let { contextData, useShopSpecificTemplate } = await fetchContextData( - template, - jsrAuth + templateObjects.forEach((template) => { + proms.push( + (async () => { + let {contextData, useShopSpecificTemplate} = await fetchContextData( + template, + jsrAuth + ); + unsortedTemplatesAndData.push({ + templateObject: template, + contextData, + useShopSpecificTemplate, + }); + })() ); - unsortedTemplatesAndData.push({ - templateObject: template, - contextData, - useShopSpecificTemplate, - }); - })() - ); - }); - await Promise.all(proms); + }); + await Promise.all(proms); - //Re-order list to follow speedprint. - // var templateAndData = _.sortBy(unsortedTemplatesAndData, function (item) { - // return templateObjects.findIndex( - // (template) => template.name === item.templateObject.name - // ); - // }); - if (window.jsr3) { - jsreport.serverUrl = "https://reports3.test.imex.online/"; - } - - unsortedTemplatesAndData.sort(function (a, b) { - return ( - templateObjects.findIndex((x) => x.name === a.templateObject.name) - - templateObjects.findIndex((x) => x.name === b.templateObject.name) - ); - }); - const templateAndData = unsortedTemplatesAndData; - - let rootTemplate = templateAndData.shift(); - - let reportRequest = { - template: { - name: rootTemplate.useShopSpecificTemplate - ? `/${bodyshop.imexshopid}/${rootTemplate.templateObject.name}` - : `/${rootTemplate.templateObject.name}`, - ...(renderAsHtml - ? {} - : { - recipe: "chrome-pdf", - chrome: { - marginTop: - bodyshop.logo_img_path && - bodyshop.logo_img_path.headerMargin && - bodyshop.logo_img_path.headerMargin > 36 - ? bodyshop.logo_img_path.headerMargin - : "36px", - marginBottom: - bodyshop.logo_img_path && - bodyshop.logo_img_path.footerMargin && - bodyshop.logo_img_path.footerMargin > 50 - ? bodyshop.logo_img_path.footerMargin - : "50px", - }, - }), - pdfOperations: [ - { - template: { - name: "/components/Header-Footer", - recipe: "chrome-pdf", - engine: "handlebars", - }, - type: "merge", - }, - ...templateAndData.map((template) => { - return { - template: { - chrome: { - marginTop: - bodyshop.logo_img_path && - bodyshop.logo_img_path.headerMargin && - bodyshop.logo_img_path.headerMargin > 36 - ? bodyshop.logo_img_path.headerMargin - : "36px", - marginBottom: - bodyshop.logo_img_path && - bodyshop.logo_img_path.footerMargin && - bodyshop.logo_img_path.footerMargin > 50 - ? bodyshop.logo_img_path.footerMargin - : "50px", - }, - name: template.useShopSpecificTemplate - ? `/${bodyshop.imexshopid}/${template.templateObject.name}` - : `/${template.templateObject.name}`, - ...(renderAsHtml ? {} : { recipe: "chrome-pdf" }), - }, - type: "append", - - // mergeWholeDocument: true, - // renderForEveryPage: true, - }; - }), - ], - }, - data: { - ...extend( - rootTemplate.contextData, - ...templateAndData.map((temp) => temp.contextData) - ), - - // ...rootTemplate.templateObject.variables, - // ...rootTemplate.templateObject.context, - headerpath: `/${bodyshop.imexshopid}/header.html`, - footerpath: `/${bodyshop.imexshopid}/footer.html`, - bodyshop: bodyshop, - offset: bodyshop.timezone, - }, - }; - - try { - const render = await jsreport.render(reportRequest); - if (!renderAsHtml) { - render.download("Speed Print"); - } else { - return render.toString(); + //Re-order list to follow speedprint. + // var templateAndData = _.sortBy(unsortedTemplatesAndData, function (item) { + // return templateObjects.findIndex( + // (template) => template.name === item.templateObject.name + // ); + // }); + if (window.jsr3) { + jsreport.serverUrl = "https://reports3.test.imex.online/"; + } + + unsortedTemplatesAndData.sort(function (a, b) { + return ( + templateObjects.findIndex((x) => x.name === a.templateObject.name) - + templateObjects.findIndex((x) => x.name === b.templateObject.name) + ); + }); + const templateAndData = unsortedTemplatesAndData; + + let rootTemplate = templateAndData.shift(); + + let reportRequest = { + template: { + name: rootTemplate.useShopSpecificTemplate + ? `/${bodyshop.imexshopid}/${rootTemplate.templateObject.name}` + : `/${rootTemplate.templateObject.name}`, + ...(renderAsHtml + ? {} + : { + recipe: "chrome-pdf", + chrome: { + marginTop: + bodyshop.logo_img_path && + bodyshop.logo_img_path.headerMargin && + bodyshop.logo_img_path.headerMargin > 36 + ? bodyshop.logo_img_path.headerMargin + : "36px", + marginBottom: + bodyshop.logo_img_path && + bodyshop.logo_img_path.footerMargin && + bodyshop.logo_img_path.footerMargin > 50 + ? bodyshop.logo_img_path.footerMargin + : "50px", + }, + }), + pdfOperations: [ + { + template: { + name: "/components/Header-Footer", + recipe: "chrome-pdf", + engine: "handlebars", + }, + type: "merge", + }, + ...templateAndData.map((template) => { + return { + template: { + chrome: { + marginTop: + bodyshop.logo_img_path && + bodyshop.logo_img_path.headerMargin && + bodyshop.logo_img_path.headerMargin > 36 + ? bodyshop.logo_img_path.headerMargin + : "36px", + marginBottom: + bodyshop.logo_img_path && + bodyshop.logo_img_path.footerMargin && + bodyshop.logo_img_path.footerMargin > 50 + ? bodyshop.logo_img_path.footerMargin + : "50px", + }, + name: template.useShopSpecificTemplate + ? `/${bodyshop.imexshopid}/${template.templateObject.name}` + : `/${template.templateObject.name}`, + ...(renderAsHtml ? {} : {recipe: "chrome-pdf"}), + }, + type: "append", + + // mergeWholeDocument: true, + // renderForEveryPage: true, + }; + }), + ], + }, + data: { + ...extend( + rootTemplate.contextData, + ...templateAndData.map((temp) => temp.contextData) + ), + + // ...rootTemplate.templateObject.variables, + // ...rootTemplate.templateObject.context, + headerpath: `/${bodyshop.imexshopid}/header.html`, + footerpath: `/${bodyshop.imexshopid}/footer.html`, + bodyshop: bodyshop, + offset: bodyshop.timezone, + }, + }; + + try { + const render = await jsreport.render(reportRequest); + if (!renderAsHtml) { + render.download("Speed Print"); + } else { + return render.toString(); + } + } catch (error) { + notification["error"]({message: JSON.stringify(error)}); } - } catch (error) { - notification["error"]({ message: JSON.stringify(error) }); - } } export const GenerateDocument = async ( - template, - messageOptions, - sendType, - jobid + template, + messageOptions, + sendType, + jobid ) => { - const bodyshop = store.getState().user.bodyshop; - if (sendType === "e") { - store.dispatch( - setEmailOptions({ - jobid, - messageOptions: { - ...messageOptions, - to: Array.isArray(messageOptions.to) - ? messageOptions.to - : [messageOptions.to], - }, - template, - }) - ); - } else if (sendType === "x") { - console.log("excel"); - await RenderTemplate(template, bodyshop, false, true); - } else if (sendType === "text") { - await RenderTemplate(template, bodyshop, false, false, true); - } else { - await RenderTemplate(template, bodyshop); - } + const bodyshop = store.getState().user.bodyshop; + if (sendType === "e") { + store.dispatch( + setEmailOptions({ + jobid, + messageOptions: { + ...messageOptions, + to: Array.isArray(messageOptions.to) + ? messageOptions.to + : [messageOptions.to], + }, + template, + }) + ); + } else if (sendType === "x") { + console.log("excel"); + await RenderTemplate(template, bodyshop, false, true); + } else if (sendType === "text") { + await RenderTemplate(template, bodyshop, false, false, true); + } else { + await RenderTemplate(template, bodyshop); + } }; export const GenerateDocuments = async (templates) => { - const bodyshop = store.getState().user.bodyshop; - await RenderTemplates(templates, bodyshop); + const bodyshop = store.getState().user.bodyshop; + await RenderTemplates(templates, bodyshop); }; const fetchContextData = async (templateObject, jsrAuth) => { - const bodyshop = store.getState().user.bodyshop; + const bodyshop = store.getState().user.bodyshop; - jsreport.headers["FirebaseAuthorization"] = - "Bearer " + (await auth.currentUser.getIdToken()); + jsreport.headers["FirebaseAuthorization"] = + "Bearer " + (await auth.currentUser.getIdToken()); - const folders = await cleanAxios.get(`${server}/odata/folders`, { - headers: { Authorization: jsrAuth }, - }); - const shopSpecificFolder = folders.data.value.find( - (f) => f.name === bodyshop.imexshopid - ); - - const jsReportQueries = await cleanAxios.get( - `${server}/odata/assets?$filter=name eq '${templateObject.name}.query'`, - { headers: { Authorization: jsrAuth } } - ); - - let templateQueryToExecute; - let useShopSpecificTemplate = false; - // let shopSpecificTemplate; - - if (shopSpecificFolder) { - let shopSpecificTemplate = jsReportQueries.data.value.find( - (f) => f?.folder?.shortid === shopSpecificFolder.shortid - ); - if (shopSpecificTemplate) { - useShopSpecificTemplate = true; - templateQueryToExecute = atob(shopSpecificTemplate.content); - } - } - - if (!templateQueryToExecute) { - const generalTemplate = jsReportQueries.data.value.find((f) => !f.folder); - useShopSpecificTemplate = false; - templateQueryToExecute = atob(generalTemplate.content); - } - - let contextData = {}; - if (templateQueryToExecute) { - const { data } = await client.query({ - query: gql(templateQueryToExecute), - variables: { ...templateObject.variables }, + const folders = await cleanAxios.get(`${server}/odata/folders`, { + headers: {Authorization: jsrAuth}, }); - contextData = data; - } + const shopSpecificFolder = folders.data.value.find( + (f) => f.name === bodyshop.imexshopid + ); - return { contextData, useShopSpecificTemplate }; + const jsReportQueries = await cleanAxios.get( + `${server}/odata/assets?$filter=name eq '${templateObject.name}.query'`, + {headers: {Authorization: jsrAuth}} + ); + + let templateQueryToExecute; + let useShopSpecificTemplate = false; + // let shopSpecificTemplate; + + if (shopSpecificFolder) { + let shopSpecificTemplate = jsReportQueries.data.value.find( + (f) => f?.folder?.shortid === shopSpecificFolder.shortid + ); + if (shopSpecificTemplate) { + useShopSpecificTemplate = true; + templateQueryToExecute = atob(shopSpecificTemplate.content); + } + } + + if (!templateQueryToExecute) { + const generalTemplate = jsReportQueries.data.value.find((f) => !f.folder); + useShopSpecificTemplate = false; + templateQueryToExecute = atob(generalTemplate.content); + } + + let contextData = {}; + if (templateQueryToExecute) { + const {data} = await client.query({ + query: gql(templateQueryToExecute), + variables: {...templateObject.variables}, + }); + contextData = data; + } + + return {contextData, useShopSpecificTemplate}; }; //export const displayTemplateInWindow = (html) => { @@ -388,21 +389,21 @@ const fetchContextData = async (templateObject, jsrAuth) => { // }; function extend(o1, o2, o3) { - var result = {}, - obj; + var result = {}, + obj; - for (var i = 0; i < arguments.length; i++) { - obj = arguments[i]; - for (var key in obj) { - if (Object.prototype.toString.call(obj[key]) === "[object Object]") { - if (typeof result[key] === "undefined") { - result[key] = {}; + for (var i = 0; i < arguments.length; i++) { + obj = arguments[i]; + for (var key in obj) { + if (Object.prototype.toString.call(obj[key]) === "[object Object]") { + if (typeof result[key] === "undefined") { + result[key] = {}; + } + result[key] = extend(result[key], obj[key]); + } else { + result[key] = obj[key]; + } } - result[key] = extend(result[key], obj[key]); - } else { - result[key] = obj[key]; - } } - } - return result; + return result; } diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index b62ed7664..5bab99729 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -1,2422 +1,2435 @@ import i18n from "i18next"; //import { store } from "../redux/store"; export const EmailSettings = { - fromNameDefault: "Rome Online", - fromAddress: "noreply@romeonline.io", + fromNameDefault: "Rome Online", + fromAddress: "noreply@romeonline.io", }; export const TemplateList = (type, context) => { - //const { bodyshop } = store.getState().user; - return { - //If there's no type or the type is job, send it back. - ...(!type || type === "job" - ? { - casl_authorization: { - title: i18n.t("printcenter.jobs.casl_authorization"), - description: "", - subject: i18n.t("printcenter.jobs.casl_authorization"), - key: "casl_authorization", - disabled: false, - group: "authorization", - regions: { - CA: true, - }, - }, - fippa_authorization: { - title: i18n.t("printcenter.jobs.fippa_authorization"), - description: "", - subject: i18n.t("printcenter.jobs.fippa_authorization"), - key: "fippa_authorization", - disabled: false, - group: "authorization", - }, - diagnostic_authorization: { - title: i18n.t("printcenter.jobs.diagnostic_authorization"), - description: "", - subject: i18n.t("printcenter.jobs.diagnostic_authorization"), - key: "diagnostic_authorization", - disabled: false, - group: "authorization", - }, - mechanical_authorization: { - title: i18n.t("printcenter.jobs.mechanical_authorization"), - description: "", - subject: i18n.t("printcenter.jobs.mechanical_authorization"), - key: "mechanical_authorization", - disabled: false, - group: "authorization", - }, - appointment_reminder: { - title: i18n.t("printcenter.jobs.appointment_reminder"), - description: "", - subject: i18n.t("printcenter.jobs.appointment_reminder"), - key: "appointment_reminder", - disabled: false, - group: "pre", - }, - estimate_followup: { - title: i18n.t("printcenter.jobs.estimate_followup"), - description: "", - subject: i18n.t("printcenter.jobs.estimate_followup"), - key: "estimate_followup", - disabled: false, - group: "pre", - }, - express_repair_checklist: { - title: i18n.t("printcenter.jobs.express_repair_checklist"), - description: "", - subject: i18n.t("printcenter.jobs.express_repair_checklist"), - key: "express_repair_checklist", - disabled: false, - group: "pre", - }, - glass_express_checklist: { - title: i18n.t("printcenter.jobs.glass_express_checklist"), - description: "", - subject: i18n.t("printcenter.jobs.glass_express_checklist"), - key: "glass_express_checklist", - disabled: false, - group: "pre", - }, - stolen_recovery_checklist: { - title: i18n.t("printcenter.jobs.stolen_recovery_checklist"), - description: "", - subject: i18n.t("printcenter.jobs.stolen_recovery_checklist"), - key: "stolen_recovery_checklist", - disabled: false, - group: "pre", - }, - vehicle_check_in: { - title: i18n.t("printcenter.jobs.vehicle_check_in"), - description: "", - subject: i18n.t("printcenter.jobs.vehicle_check_in"), - key: "vehicle_check_in", - disabled: false, - group: "pre", - }, - parts_order_history: { - title: i18n.t("printcenter.jobs.parts_order_history"), - description: "", - subject: i18n.t("printcenter.jobs.parts_order_history"), - key: "parts_order_history", - disabled: false, - group: "ro", - }, - job_notes: { - title: i18n.t("printcenter.jobs.job_notes"), - description: "", - subject: i18n.t("printcenter.jobs.job_notes"), - key: "job_notes", - disabled: false, - group: "ro", - }, - ro_with_description: { - title: i18n.t("printcenter.jobs.ro_with_description"), - description: "", - subject: i18n.t("printcenter.jobs.ro_with_description"), - key: "ro_with_description", - disabled: false, - group: "ro", - }, - window_tag: { - title: i18n.t("printcenter.jobs.window_tag"), - description: "", - subject: i18n.t("printcenter.jobs.window_tag"), - key: "window_tag", - disabled: false, - group: "ro", - }, - supplement_request: { - title: i18n.t("printcenter.jobs.supplement_request"), - description: "", - subject: i18n.t("printcenter.jobs.supplement_request"), - key: "supplement_request", - disabled: false, - group: "ro", - }, - estimate: { - title: i18n.t("printcenter.jobs.estimate"), - description: "", - subject: i18n.t("printcenter.jobs.estimate"), - key: "estimate", - disabled: false, - group: "ro", - }, - parts_list: { - title: i18n.t("printcenter.jobs.parts_list"), - description: "", - subject: i18n.t("printcenter.jobs.parts_list"), - key: "parts_list", - disabled: false, - group: "ro", - }, - coversheet_portrait: { - title: i18n.t("printcenter.jobs.coversheet_portrait"), - description: "", - subject: i18n.t("printcenter.jobs.coversheet_portrait"), - key: "coversheet_portrait", - disabled: false, - group: "ro", - }, - coversheet_landscape: { - title: i18n.t("printcenter.jobs.coversheet_landscape"), - description: "", - subject: i18n.t("printcenter.jobs.coversheet_landscape"), - key: "coversheet_landscape", - disabled: false, - group: "ro", - }, - key_tag: { - title: i18n.t("printcenter.jobs.key_tag"), - description: "", - subject: i18n.t("printcenter.jobs.key_tag"), - key: "key_tag", - disabled: false, - group: "ro", - }, - paint_grid: { - title: i18n.t("printcenter.jobs.paint_grid"), - description: "", - subject: i18n.t("printcenter.jobs.paint_grid"), - key: "paint_grid", - disabled: false, - group: "ro", - }, - worksheet_by_line_number: { - title: i18n.t("printcenter.jobs.worksheet_by_line_number"), - description: "", - subject: i18n.t("printcenter.jobs.worksheet_by_line_number"), - key: "worksheet_by_line_number", - disabled: false, - group: "worksheet", - enhanced_payroll: false, - }, - worksheet_by_line_number_enhanced: { - title: i18n.t("printcenter.jobs.worksheet_by_line_number"), - description: "", - subject: i18n.t("printcenter.jobs.worksheet_by_line_number"), - key: "worksheet_by_line_number_enhanced", - disabled: false, - group: "worksheet", - enhanced_payroll: true, - }, - worksheet_sorted_by_operation_type: { - title: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_type" - ), - description: "", - subject: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_type" - ), - key: "worksheet_sorted_by_operation_type", - disabled: false, - group: "worksheet", - enhanced_payroll: false, - }, - worksheet_sorted_by_operation_type_enhanced: { - title: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_type" - ), - description: "", - subject: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_type" - ), - key: "worksheet_sorted_by_operation_type_enhanced", - disabled: false, - group: "worksheet", - enhanced_payroll: true, - }, - worksheet_sorted_by_operation: { - title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), - description: "", - subject: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), - key: "worksheet_sorted_by_operation", - disabled: false, - group: "worksheet", - enhanced_payroll: false, - }, - worksheet_sorted_by_operation_enhanced: { - title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), - description: "", - subject: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), - key: "worksheet_sorted_by_operation_enhanced", - disabled: false, - group: "worksheet", - enhanced_payroll: true, - }, - worksheet_sorted_by_operation_no_hours: { - title: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_no_hours" - ), - description: "", - subject: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_no_hours" - ), - key: "worksheet_sorted_by_operation_no_hours", - disabled: false, - group: "worksheet", - enhanced_payroll: false, - }, - worksheet_sorted_by_operation_no_hours_enhanced: { - title: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_no_hours" - ), - description: "", - subject: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_no_hours" - ), - key: "worksheet_sorted_by_operation_no_hours_enhanced", - disabled: false, - group: "worksheet", - enhanced_payroll: true, - }, - worksheet_sorted_by_operation_part_type: { - title: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_part_type" - ), - description: "", - subject: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_part_type" - ), - key: "worksheet_sorted_by_operation_part_type", - disabled: false, - group: "worksheet", - enhanced_payroll: false, - }, - worksheet_sorted_by_operation_part_type_enhanced: { - title: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_part_type" - ), - description: "", - subject: i18n.t( - "printcenter.jobs.worksheet_sorted_by_operation_part_type" - ), - key: "worksheet_sorted_by_operation_part_type_enhanced", - disabled: false, - group: "worksheet", - enhanced_payroll: true, - }, - payments_by_job: { - title: i18n.t("printcenter.jobs.payments_by_job"), - description: "", - subject: i18n.t("printcenter.jobs.payments_by_job"), - key: "payments_by_job", - disabled: false, - group: "financial", - }, - final_invoice: { - title: i18n.t("printcenter.jobs.final_invoice"), - description: "", - subject: i18n.t("printcenter.jobs.final_invoice"), - key: "final_invoice", - disabled: false, - group: "financial", - }, - payment_request: { - title: i18n.t("printcenter.jobs.payment_request"), - description: "", - subject: i18n.t("printcenter.jobs.payment_request"), - key: "payment_request", - disabled: false, - group: "financial", - }, - invoice_total_payable: { - title: i18n.t("printcenter.jobs.invoice_total_payable"), - description: "", - subject: i18n.t("printcenter.jobs.invoice_total_payable"), - key: "invoice_total_payable", - disabled: false, - group: "financial", - }, - invoice_customer_payable: { - title: i18n.t("printcenter.jobs.invoice_customer_payable"), - description: "", - subject: i18n.t("printcenter.jobs.invoice_customer_payable"), - key: "invoice_customer_payable", - disabled: false, - group: "financial", - }, - ro_totals: { - title: i18n.t("printcenter.jobs.ro_totals"), - description: "", - subject: i18n.t("printcenter.jobs.ro_totals"), - key: "ro_totals", - disabled: false, - group: "financial", - }, - job_costing_ro: { - title: i18n.t("printcenter.jobs.job_costing_ro"), - description: "", - subject: i18n.t("printcenter.jobs.job_costing_ro"), - key: "job_costing_ro", - disabled: false, - group: "financial", - }, - purchases_by_ro_detail: { - title: i18n.t("printcenter.jobs.purchases_by_ro_detail"), - description: "", - subject: i18n.t("printcenter.jobs.purchases_by_ro_detail"), - key: "purchases_by_ro_detail", - disabled: false, - group: "financial", - }, - purchases_by_ro_summary: { - title: i18n.t("printcenter.jobs.purchases_by_ro_summary"), - description: "", - subject: i18n.t("printcenter.jobs.purchases_by_ro_summary"), - key: "purchases_by_ro_summary", - disabled: false, - group: "financial", - }, - filing_coversheet_portrait: { - title: i18n.t("printcenter.jobs.filing_coversheet_portrait"), - description: "", - subject: i18n.t("printcenter.jobs.filing_coversheet_portrait"), - key: "filing_coversheet_portrait", - disabled: false, - group: "post", - }, - filing_coversheet_landscape: { - title: i18n.t("printcenter.jobs.filing_coversheet_landscape"), - description: "", - subject: i18n.t("printcenter.jobs.filing_coversheet_landscape"), - key: "filing_coversheet_landscape", - disabled: false, - group: "post", - }, - qc_sheet: { - title: i18n.t("printcenter.jobs.qc_sheet"), - description: "", - subject: i18n.t("printcenter.jobs.qc_sheet"), - key: "qc_sheet", - disabled: false, - group: "post", - }, - vehicle_delivery_check: { - title: i18n.t("printcenter.jobs.vehicle_delivery_check"), - description: "", - subject: i18n.t("printcenter.jobs.vehicle_delivery_check"), - key: "vehicle_delivery_check", - disabled: false, - group: "post", - }, - guarantee: { - title: i18n.t("printcenter.jobs.guarantee"), - description: "", - subject: i18n.t("printcenter.jobs.guarantee"), - key: "guarantee", - disabled: false, - group: "post", - }, - csi_invitation: { - title: i18n.t("printcenter.jobs.csi_invitation"), - description: "", - key: "csi_invitation", - subject: i18n.t("printcenter.jobs.csi_invitation"), - disabled: false, - group: "post", - }, - window_tag_sublet: { - title: i18n.t("printcenter.jobs.window_tag_sublet"), - description: "", - key: "window_tag_sublet", - subject: i18n.t("printcenter.jobs.window_tag_sublet"), - disabled: false, - group: "ro", - }, - thank_you_ro: { - title: i18n.t("printcenter.jobs.thank_you_ro"), - description: "", - key: "thank_you_ro", - subject: i18n.t("printcenter.jobs.thank_you_ro"), - disabled: false, - group: "post", - }, - parts_label_single: { - title: i18n.t("printcenter.jobs.parts_label_single"), - description: "", - key: "parts_label_single", - subject: i18n.t("printcenter.jobs.parts_label_single"), - disabled: false, - group: "ro", - ignoreCustomMargins: true, - }, - envelope_return_address: { - title: i18n.t("printcenter.jobs.envelope_return_address"), - description: "", - subject: i18n.t("printcenter.jobs.envelope_return_address"), - key: "envelope_return_address", - disabled: false, - group: "ro", - ignoreCustomMargins: true, - }, - sgi_certificate_of_repairs: { - title: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"), - description: "", - key: "sgi_certificate_of_repairs", - subject: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"), - disabled: false, - group: "ro", - regions: { - CA_SK: true, - }, - }, - sgi_windshield_auth: { - title: i18n.t("printcenter.jobs.sgi_windshield_auth"), - description: "", - key: "sgi_windshield_auth", - subject: i18n.t("printcenter.jobs.sgi_windshield_auth"), - disabled: false, - group: "pre", - regions: { - CA_SK: true, - }, - }, - mpi_final_acct_sheet: { - title: i18n.t("printcenter.jobs.mpi_final_acct_sheet"), - description: "", - key: "mpi_final_acct_sheet", - subject: i18n.t("printcenter.jobs.mpi_final_acct_sheet"), - disabled: false, - group: "post", - regions: { - CA_MB: true, - }, - }, - mpi_final_repair_acct_sheet: { - title: i18n.t("printcenter.jobs.mpi_final_repair_acct_sheet"), - description: "", - key: "mpi_final_repair_acct_sheet", - subject: i18n.t("printcenter.jobs.mpi_final_repair_acct_sheet"), - disabled: false, - group: "post", - regions: { - CA_MB: true, - }, - }, - mpi_eglass_auth: { - title: i18n.t("printcenter.jobs.mpi_eglass_auth"), - description: "", - key: "mpi_eglass_auth", - subject: i18n.t("printcenter.jobs.mpi_eglass_auth"), - disabled: false, - group: "pre", - regions: { - CA_MB: true, - }, - }, - mpi_animal_checklist: { - title: i18n.t("printcenter.jobs.mpi_animal_checklist"), - description: "", - key: "mpi_animal_checklist", - subject: i18n.t("printcenter.jobs.mpi_animal_checklist"), - disabled: false, - group: "pre", - regions: { - CA_MB: true, - }, - }, - ab_proof_of_loss: { - title: i18n.t("printcenter.jobs.ab_proof_of_loss"), - description: "", - key: "ab_proof_of_loss", - subject: i18n.t("printcenter.jobs.ab_proof_of_loss"), - disabled: false, - group: "pre", - regions: { - CA_AB: true, - }, - }, - // parts_label_multi: { - // title: i18n.t("printcenter.jobs.parts_label_multi"), - // description: "", - // key: "parts_label_multi", - // subject: i18n.t("printcenter.jobs.parts_label_multi"), - // disabled: false, - // group: "ro", - // }, - iou_form: { - title: i18n.t("printcenter.jobs.iou_form"), - description: "", - subject: i18n.t("printcenter.jobs.iou_form"), - key: "iou_form", - disabled: false, - group: "post", - }, - lag_time_ro: { - title: i18n.t("printcenter.jobs.lag_time_ro"), - description: "", - subject: i18n.t("printcenter.jobs.lag_time_ro"), - key: "lag_time_ro", - disabled: false, - group: "ro", - }, - rental_reservation: { - title: i18n.t("printcenter.jobs.rental_reservation"), - description: "", - subject: i18n.t("printcenter.jobs.rental_reservation"), - key: "rental_reservation", - disabled: false, - group: "pre", - }, - timetickets_ro: { - title: i18n.t("printcenter.jobs.timetickets_ro"), - description: "", - subject: i18n.t("printcenter.jobs.timetickets_ro"), - key: "timetickets_ro", - disabled: false, - group: "financial", - }, - dms_posting_sheet: { - title: i18n.t("printcenter.jobs.dms_posting_sheet"), - description: "", - subject: i18n.t("printcenter.jobs.dms_posting_sheet"), - key: "dms_posting_sheet", - disabled: false, - group: "financial", - dms: true, - }, - worksheet_sorted_by_team: { - title: i18n.t("printcenter.jobs.worksheet_sorted_by_team"), - description: "", - subject: i18n.t("printcenter.jobs.worksheet_sorted_by_team"), - key: "worksheet_sorted_by_team", - disabled: false, - group: "worksheet", - enhanced_payroll: true, - }, - committed_timetickets_ro: { - title: i18n.t("printcenter.jobs.committed_timetickets_ro"), - description: "", - subject: i18n.t("printcenter.jobs.committed_timetickets_ro"), - key: "committed_timetickets_ro", - disabled: false, - group: "financial", - enhanced_payroll: true, - }, - } - : {}), - ...(!type || type === "job_special" - ? { - special_thirdpartypayer: { - title: i18n.t("printcenter.jobs.thirdpartypayer"), - description: "", - key: "special_thirdpartypayer", - disabled: false, - }, - folder_label_multiple: { - title: i18n.t("printcenter.jobs.folder_label_multiple"), - description: "", - key: "folder_label_multiple", - disabled: false, - }, - parts_label_multiple: { - title: i18n.t("printcenter.jobs.parts_label_multiple"), - description: "", - key: "parts_label_multiple", - disabled: false, - }, - parts_invoice_label_single: { - title: i18n.t("printcenter.jobs.parts_invoice_label_single"), - description: "", - key: "parts_invoice_label_single", - disabled: false, - ignoreCustomMargins: true, - }, - csi_invitation_action: { - title: i18n.t("printcenter.jobs.csi_invitation_action"), - description: "", - key: "csi_invitation_action", - subject: i18n.t("printcenter.jobs.csi_invitation_action"), - disabled: false, - }, - individual_job_note: { - title: i18n.t("printcenter.jobs.individual_job_note"), - description: "", - key: "individual_job_note", - subject: i18n.t("printcenter.subjects.jobs.individual_job_note", { - ro_number: (context && context.ro_number) || "", - }), - disabled: false, - }, - parts_dispatch: { - title: i18n.t("printcenter.jobs.parts_dispatch"), - description: "", - key: "parts_dispatch", - subject: i18n.t("printcenter.subjects.jobs.parts_dispatch", { - ro_number: (context && context.ro_number) || "", - }), - disabled: false, - }, - } - : {}), - ...(!type || type === "appointment" - ? { - appointment_confirmation: { - title: i18n.t("printcenter.appointments.appointment_confirmation"), - description: "", - subject: i18n.t( - "printcenter.appointments.appointment_confirmation" - ), - key: "appointment_confirmation", - disabled: false, - }, - } - : {}), - ...(!type || type === "partsorder" - ? { - parts_order: { - title: i18n.t("printcenter.jobs.parts_order"), - description: "", - key: "parts_order", - subject: i18n.t("printcenter.subjects.jobs.parts_order", { - ro_number: context && context.job && context.job.ro_number, - name: ( - (context && context.job && context.job.ownr_ln) || - (context && context.job && context.job.ownr_co_nm) || - "" - ).trim(), - }), - disabled: false, - }, - sublet_order: { - title: i18n.t("printcenter.jobs.sublet_order"), - description: "", - key: "sublet_order", - subject: i18n.t("printcenter.subjects.jobs.sublet_order", { - ro_number: context && context.job && context.job.ro_number, - name: ( - (context && context.job && context.job.ownr_ln) || - (context && context.job && context.job.ownr_co_nm) || - "" - ).trim(), - }), - disabled: false, - }, - parts_return_slip: { - title: i18n.t("printcenter.jobs.parts_return_slip"), - subject: i18n.t("printcenter.subjects.jobs.parts_return_slip", { - ro_number: context && context.job && context.job.ro_number, - name: ( - (context && context.job && context.job.ownr_ln) || - (context && context.job && context.job.ownr_co_nm) || - "" - ).trim(), - }), - description: "", - key: "parts_return_slip", - disabled: false, - }, - } - : {}), - ...(!type || type === "payment" - ? { - payment_receipt: { - title: i18n.t("printcenter.jobs.payment_receipt"), - description: "", - subject: i18n.t("printcenter.jobs.payment_receipt"), - key: "payment_receipt", - disabled: false, - }, - } - : {}), - ...(!type || type === "csi" ? {} : {}), - ...(!type || type === "report_center" - ? { - hours_sold_detail_closed: { - title: i18n.t("reportcenter.templates.hours_sold_detail_closed"), - description: "", - subject: i18n.t("reportcenter.templates.hours_sold_detail_closed"), - key: "hours_sold_detail_closed", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_closed_ins_co: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_ins_co" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_ins_co" - ), - key: "hours_sold_detail_closed_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_summary_closed: { - title: i18n.t("reportcenter.templates.hours_sold_summary_closed"), - description: "", - subject: i18n.t("reportcenter.templates.hours_sold_summary_closed"), - key: "hours_sold_summary_closed", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_summary_closed_ins_co: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_ins_co" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_ins_co" - ), - key: "hours_sold_summary_closed_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_open: { - title: i18n.t("reportcenter.templates.hours_sold_detail_open"), - description: "", - subject: i18n.t("reportcenter.templates.hours_sold_detail_open"), - key: "hours_sold_detail_open", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "sales", - }, - hours_sold_detail_open_ins_co: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_open_ins_co" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_open_ins_co" - ), - key: "hours_sold_detail_open_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "sales", - }, - hours_sold_summary_open: { - title: i18n.t("reportcenter.templates.hours_sold_summary_open"), - description: "", - subject: i18n.t("reportcenter.templates.hours_sold_summary_open"), - key: "hours_sold_summary_open", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "sales", - }, - hours_sold_summary_open_ins_co: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_open_ins_co" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_open_ins_co" - ), - key: "hours_sold_summary_open_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "sales", - }, - hours_sold_detail_closed_csr: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_csr" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_csr" - ), - key: "hours_sold_detail_closed_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_open_csr: { - title: i18n.t("reportcenter.templates.hours_sold_detail_open_csr"), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_open_csr" - ), - key: "hours_sold_detail_open_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "sales", - }, - hours_sold_summary_closed_csr: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_csr" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_csr" - ), - key: "hours_sold_summary_closed_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_summary_open_csr: { - title: i18n.t("reportcenter.templates.hours_sold_summary_open_csr"), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_open_csr" - ), - key: "hours_sold_summary_open_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_closed_estimator: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_estimator" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_estimator" - ), - key: "hours_sold_detail_closed_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_open_estimator: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_open_estimator" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_open_estimator" - ), - key: "hours_sold_detail_open_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "sales", - }, - hours_sold_summary_closed_estimator: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_estimator" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_estimator" - ), - key: "hours_sold_summary_closed_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_summary_open_estimator: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_open_estimator" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_open_estimator" - ), - key: "hours_sold_summary_open_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_summary_open_status: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_open_status" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_open_status" - ), - key: "hours_sold_summary_open_status", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_summary_closed_status: { - title: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_status" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_summary_closed_status" - ), - key: "hours_sold_summary_closed_status", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_open_status: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_open_status" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_open_status" - ), - key: "hours_sold_detail_open_status", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - hours_sold_detail_closed_status: { - title: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_status" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.hours_sold_detail_closed_status" - ), - key: "hours_sold_detail_closed_status", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - purchases_by_date_range_detail: { - title: i18n.t( - "reportcenter.templates.purchases_by_date_range_detail" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_date_range_detail" - ), - key: "purchases_by_date_range_detail", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_by_date_range_summary: { - title: i18n.t( - "reportcenter.templates.purchases_by_date_range_summary" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_date_range_summary" - ), - key: "purchases_by_date_range_summary", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_by_vendor_detailed_date_range: { - title: i18n.t( - "reportcenter.templates.purchases_by_vendor_detailed_date_range" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_vendor_detailed_date_range" - ), - key: "purchases_by_vendor_detailed_date_range", - idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_by_vendor_summary_date_range: { - title: i18n.t( - "reportcenter.templates.purchases_by_vendor_summary_date_range" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_vendor_summary_date_range" - ), - key: "purchases_by_vendor_summary_date_range", - idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_by_cost_center_detail: { - title: i18n.t( - "reportcenter.templates.purchases_by_cost_center_detail" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_by_cost_center_detail" - ), - key: "purchases_by_cost_center_detail", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_by_cost_center_summary: { - title: i18n.t( - "reportcenter.templates.purchases_by_cost_center_summary" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_by_cost_center_summary" - ), - key: "purchases_by_cost_center_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_grouped_by_vendor_detailed: { - title: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_detailed" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_detailed" - ), - key: "purchases_grouped_by_vendor_detailed", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchases_grouped_by_vendor_summary: { - title: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_summary" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_summary" - ), - key: "purchases_grouped_by_vendor_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - job_costing_ro_date_summary: { - title: i18n.t("reportcenter.templates.job_costing_ro_date_summary"), - description: "", - subject: i18n.t( - "reportcenter.templates.job_costing_ro_date_summary" - ), - key: "job_costing_ro_date_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - job_costing_ro_csr: { - title: i18n.t("reportcenter.templates.job_costing_ro_csr"), - description: "", - subject: i18n.t("reportcenter.templates.job_costing_ro_csr"), - key: "job_costing_ro_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - job_costing_ro_ins_co: { - title: i18n.t("reportcenter.templates.job_costing_ro_ins_co"), - description: "", - subject: i18n.t("reportcenter.templates.job_costing_ro_ins_co"), - key: "job_costing_ro_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - job_costing_ro_date_detail: { - title: i18n.t("reportcenter.templates.job_costing_ro_date_detail"), - description: "", - subject: i18n.t( - "reportcenter.templates.job_costing_ro_date_detail" - ), - key: "job_costing_ro_date_detail", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - job_costing_ro_estimator: { - title: i18n.t("reportcenter.templates.job_costing_ro_estimator"), - description: "", - subject: i18n.t("reportcenter.templates.job_costing_ro_estimator"), - key: "job_costing_ro_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - payments_by_date: { - title: i18n.t("reportcenter.templates.payments_by_date"), - subject: i18n.t("reportcenter.templates.payments_by_date"), - key: "payments_by_date", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.payments"), - field: i18n.t("payments.fields.date"), - }, - group: "customers", - }, - payments_by_date_type: { - title: i18n.t("reportcenter.templates.payments_by_date_type"), - subject: i18n.t("reportcenter.templates.payments_by_date_type"), - key: "payments_by_date_type", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.payments"), - field: i18n.t("payments.fields.date"), - }, - group: "customers", - }, - schedule: { - title: i18n.t("reportcenter.templates.schedule"), - subject: i18n.t("reportcenter.templates.schedule"), - key: "schedule", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.appointments"), - field: i18n.t("appointments.fields.time"), - }, - group: "customers", - }, - timetickets: { - title: i18n.t("reportcenter.templates.timetickets"), - subject: i18n.t("reportcenter.templates.timetickets"), - key: "timetickets", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - group: "payroll", - }, - timetickets_employee: { - title: i18n.t("reportcenter.templates.timetickets_employee"), - subject: i18n.t("reportcenter.templates.timetickets_employee"), - key: "timetickets_employee", - idtype: "employee", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - group: "payroll", - }, - attendance_detail: { - title: i18n.t("reportcenter.templates.attendance_detail"), - subject: i18n.t("reportcenter.templates.attendance_detail"), - key: "attendance_detail", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - group: "payroll", - }, - attendance_summary: { - title: i18n.t("reportcenter.templates.attendance_summary"), - subject: i18n.t("reportcenter.templates.attendance_summary"), - key: "attendance_summary", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - group: "payroll", - }, - attendance_employee: { - title: i18n.t("reportcenter.templates.attendance_employee"), - subject: i18n.t("reportcenter.templates.attendance_employee"), - key: "attendance_employee", - idtype: "employee", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - group: "payroll", - }, - timetickets_summary: { - title: i18n.t("reportcenter.templates.timetickets_summary"), - subject: i18n.t("reportcenter.templates.timetickets_summary"), - key: "timetickets_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - group: "payroll", - }, - estimator_detail: { - title: i18n.t("reportcenter.templates.estimator_detail"), - description: "", - subject: i18n.t("reportcenter.templates.estimator_detail"), - key: "estimator_detail", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - estimator_summary: { - title: i18n.t("reportcenter.templates.estimator_summary"), - description: "", - subject: i18n.t("reportcenter.templates.estimator_summary"), - key: "estimator_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - supplement_ratio_ins_co: { - title: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), - description: "", - subject: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), - key: "supplement_ratio_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - credits_not_received_date: { - title: i18n.t("reportcenter.templates.credits_not_received_date"), - description: "", - subject: i18n.t("reportcenter.templates.credits_not_received_date"), - key: "credits_not_received_date", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "purchases", - }, - void_ros: { - title: i18n.t("reportcenter.templates.void_ros"), - description: "", - subject: i18n.t("reportcenter.templates.void_ros"), - key: "void_ros", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_void"), - }, - group: "sales", - }, - gsr_by_csr: { - title: i18n.t("reportcenter.templates.gsr_by_csr"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_csr"), - key: "gsr_by_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_make: { - title: i18n.t("reportcenter.templates.gsr_by_make"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_make"), - key: "gsr_by_make", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_delivery_date: { - title: i18n.t("reportcenter.templates.gsr_by_delivery_date"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_delivery_date"), - key: "gsr_by_delivery_date", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.actual_delivery"), - }, - group: "sales", - }, - gsr_by_referral: { - title: i18n.t("reportcenter.templates.gsr_by_referral"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_referral"), - key: "gsr_by_referral", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_ro: { - title: i18n.t("reportcenter.templates.gsr_by_ro"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_ro"), - key: "gsr_by_ro", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_ins_co: { - title: i18n.t("reportcenter.templates.gsr_by_ins_co"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_ins_co"), - key: "gsr_by_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_exported_date: { - title: i18n.t("reportcenter.templates.gsr_by_exported_date"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_exported_date"), - key: "gsr_by_exported_date", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_exported"), - }, - group: "sales", - }, - gsr_by_estimator: { - title: i18n.t("reportcenter.templates.gsr_by_estimator"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_estimator"), - key: "gsr_by_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_category: { - title: i18n.t("reportcenter.templates.gsr_by_category"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_category"), - key: "gsr_by_category", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_by_ats: { - title: i18n.t("reportcenter.templates.gsr_by_ats"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_by_ats"), - key: "gsr_by_ats", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - gsr_labor_only: { - title: i18n.t("reportcenter.templates.gsr_labor_only"), - description: "", - subject: i18n.t("reportcenter.templates.gsr_labor_only"), - key: "gsr_labor_only", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - open_orders: { - title: i18n.t("reportcenter.templates.open_orders"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders"), - key: "open_orders", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - open_orders_status: { - title: i18n.t("reportcenter.templates.open_orders_status"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders_status"), - key: "open_orders_status", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - open_orders_csr: { - title: i18n.t("reportcenter.templates.open_orders_csr"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders_csr"), - key: "open_orders_csr", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - open_orders_specific_csr: { - title: i18n.t("reportcenter.templates.open_orders_specific_csr"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders_specific_csr"), - key: "open_orders_specific_csr", - idtype: "employee", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - open_orders_estimator: { - title: i18n.t("reportcenter.templates.open_orders_estimator"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders_estimator"), - key: "open_orders_estimator", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - open_orders_ins_co: { - title: i18n.t("reportcenter.templates.open_orders_ins_co"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders_ins_co"), - key: "open_orders_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - open_orders_referral: { - title: i18n.t("reportcenter.templates.open_orders_referral"), - description: "", - subject: i18n.t("reportcenter.templates.open_orders_referral"), - key: "open_orders_referral", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - export_payables: { - title: i18n.t("reportcenter.templates.export_payables"), - description: "", - subject: i18n.t("reportcenter.templates.export_payables"), - key: "export_payables", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.exportlogs"), - field: i18n.t("exportlogs.fields.createdat"), - }, - group: "purchases", - }, - export_payments: { - title: i18n.t("reportcenter.templates.export_payments"), - description: "", - subject: i18n.t("reportcenter.templates.export_payments"), - key: "export_payments", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.exportlogs"), - field: i18n.t("exportlogs.fields.createdat"), - }, - group: "customers", - }, - export_receivables: { - title: i18n.t("reportcenter.templates.export_receivables"), - description: "", - subject: i18n.t("reportcenter.templates.export_receivables"), - key: "export_receivables", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.exportlogs"), - field: i18n.t("exportlogs.fields.createdat"), - }, - group: "sales", - }, - parts_backorder: { - title: i18n.t("reportcenter.templates.parts_backorder"), - description: "", - subject: i18n.t("reportcenter.templates.parts_backorder"), - key: "parts_backorder", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.actual_in"), - }, - group: "purchases", - }, - thank_you_date: { - title: i18n.t("reportcenter.templates.thank_you_date"), - description: "", - subject: i18n.t("reportcenter.templates.thank_you_date"), - key: "thank_you_date", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "customers", - }, - unclaimed_hrs: { - title: i18n.t("reportcenter.templates.unclaimed_hrs"), - description: "", - subject: i18n.t("reportcenter.templates.unclaimed_hrs"), - key: "unclaimed_hrs", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "payroll", - }, - work_in_progress_jobs_excel: { - title: i18n.t("reportcenter.templates.work_in_progress_jobs"), - subject: i18n.t("reportcenter.templates.work_in_progress_jobs"), - key: "work_in_progress_jobs_excel", - //idtype: "vendor", - reporttype: "excel", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - work_in_progress_labour: { - title: i18n.t("reportcenter.templates.work_in_progress_labour"), - description: "", - subject: i18n.t("reportcenter.templates.work_in_progress_labour"), - key: "work_in_progress_labour", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - work_in_progress_committed_labour: { - title: i18n.t( - "reportcenter.templates.work_in_progress_committed_labour" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.work_in_progress_committed_labour" - ), - key: "work_in_progress_committed_labour", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - enhanced_payroll: true, - }, - work_in_progress_payables: { - title: i18n.t("reportcenter.templates.work_in_progress_payables"), - description: "", - subject: i18n.t("reportcenter.templates.work_in_progress_payables"), - key: "work_in_progress_payables", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - lag_time: { - title: i18n.t("reportcenter.templates.lag_time"), - description: "", - subject: i18n.t("reportcenter.templates.lag_time"), - key: "lag_time", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - parts_not_recieved: { - title: i18n.t("reportcenter.templates.parts_not_recieved"), - description: "", - subject: i18n.t("reportcenter.templates.parts_not_recieved"), - key: "parts_not_recieved", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.parts_orders"), - field: i18n.t("parts_orders.fields.order_date"), - }, - group: "purchases", - }, - parts_not_recieved_vendor: { - title: i18n.t("reportcenter.templates.parts_not_recieved_vendor"), - description: "", - subject: i18n.t("reportcenter.templates.parts_not_recieved_vendor"), - key: "parts_not_recieved_vendor", - idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.parts_orders"), - field: i18n.t("parts_orders.fields.order_date"), - }, - group: "purchases", - }, - scoreboard_detail: { - title: i18n.t("reportcenter.templates.scoreboard_detail"), - description: "", - subject: i18n.t("reportcenter.templates.scoreboard_detail"), - key: "scoreboard_detail", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.scoreboard"), - field: i18n.t("scoreboard.fields.date"), - }, - group: "payroll", - }, - scoreboard_summary: { - title: i18n.t("reportcenter.templates.scoreboard_summary"), - description: "", - subject: i18n.t("reportcenter.templates.scoreboard_summary"), - key: "scoreboard_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.scoreboard"), - field: i18n.t("scoreboard.fields.date"), - }, - group: "payroll", - }, - anticipated_revenue: { - title: i18n.t("reportcenter.templates.anticipated_revenue"), - description: "", - subject: i18n.t("reportcenter.templates.anticipated_revenue"), - key: "anticipated_revenue", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.scheduled_completion"), // Also date invoice. - }, - group: "sales", - }, - csi: { - title: i18n.t("reportcenter.templates.csi"), - description: "", - subject: i18n.t("reportcenter.templates.csi"), - key: "csi", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.csi"), - field: i18n.t("csi.fields.created_at"), // Also date invoice. - }, - group: "customers", - }, - estimates_written_converted: { - title: i18n.t("reportcenter.templates.estimates_written_converted"), - description: "", - subject: i18n.t( - "reportcenter.templates.estimates_written_converted" - ), - key: "estimates_written_converted", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: - i18n.t("jobs.fields.date_open") + - "/" + - i18n.t("jobs.fields.date_invoiced"), // Also date invoice. - }, - group: "sales", - }, - credits_not_received_date_vendorid: { - title: i18n.t( - "reportcenter.templates.credits_not_received_date_vendorid" - ), - subject: i18n.t( - "reportcenter.templates.credits_not_received_date_vendorid" - ), - key: "credits_not_received_date_vendorid", - idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "purchases", - }, - jobs_reconcile: { - title: i18n.t("reportcenter.templates.jobs_reconcile"), - subject: i18n.t("reportcenter.templates.jobs_reconcile"), - key: "jobs_reconcile", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - parts_received_not_scheduled: { - title: i18n.t( - "reportcenter.templates.parts_received_not_scheduled" - ), - subject: i18n.t( - "reportcenter.templates.parts_received_not_scheduled" - ), - key: "parts_received_not_scheduled", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - }, - psr_by_make: { - title: i18n.t("reportcenter.templates.psr_by_make"), - subject: i18n.t("reportcenter.templates.psr_by_make"), - key: "psr_by_make", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "sales", - }, - cycle_time_analysis: { - title: i18n.t("reportcenter.templates.cycle_time_analysis"), - subject: i18n.t("reportcenter.templates.cycle_time_analysis"), - key: "cycle_time_analysis", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.actual_completion"), - }, - group: "jobs", - }, - returns_grouped_by_vendor_summary: { - title: i18n.t( - "reportcenter.templates.returns_grouped_by_vendor_summary" - ), - subject: i18n.t( - "reportcenter.templates.returns_grouped_by_vendor_summary" - ), - key: "returns_grouped_by_vendor_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.parts_orders"), - field: i18n.t("parts_orders.fields.order_date"), - }, - group: "jobs", - }, - returns_grouped_by_vendor_detailed: { - title: i18n.t( - "reportcenter.templates.returns_grouped_by_vendor_detailed" - ), - subject: i18n.t( - "reportcenter.templates.returns_grouped_by_vendor_detailed" - ), - key: "returns_grouped_by_vendor_detailed", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.parts_orders"), - field: i18n.t("parts_orders.fields.order_date"), - }, - group: "jobs", - }, - scheduled_parts_list: { - title: i18n.t("reportcenter.templates.scheduled_parts_list"), - subject: i18n.t("reportcenter.templates.scheduled_parts_list"), - key: "scheduled_parts_list", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.scheduled_in"), - }, - group: "jobs", - }, - jobs_completed_not_invoiced: { - title: i18n.t("reportcenter.templates.jobs_completed_not_invoiced"), - subject: i18n.t( - "reportcenter.templates.jobs_completed_not_invoiced" - ), - key: "jobs_completed_not_invoiced", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - jobs_invoiced_not_exported: { - title: i18n.t("reportcenter.templates.jobs_invoiced_not_exported"), - subject: i18n.t( - "reportcenter.templates.jobs_invoiced_not_exported" - ), - key: "jobs_invoiced_not_exported", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "jobs", - }, - purchase_return_ratio_grouped_by_vendor_detail: { - title: i18n.t( - "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" - ), - subject: i18n.t( - "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" - ), - key: "purchase_return_ratio_grouped_by_vendor_detail", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - purchase_return_ratio_grouped_by_vendor_summary: { - title: i18n.t( - "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" - ), - subject: i18n.t( - "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" - ), - key: "purchase_return_ratio_grouped_by_vendor_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - group: "purchases", - }, - production_over_time: { - title: i18n.t("reportcenter.templates.production_over_time"), - subject: i18n.t("reportcenter.templates.production_over_time"), - key: "production_over_time", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.actual_in"), - }, - group: "jobs", - }, - customer_list: { - title: i18n.t("reportcenter.templates.customer_list"), - subject: i18n.t("reportcenter.templates.customer_list"), - key: "customer_list", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - group: "customers", - }, - exported_gsr_by_ro: { - title: i18n.t("reportcenter.templates.exported_gsr_by_ro"), - subject: i18n.t("reportcenter.templates.exported_gsr_by_ro"), - key: "exported_gsr_by_ro", - //idtype: "vendor", - reporttype: "excel", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_exported"), - }, - group: "sales", - }, - exported_gsr_by_ro_labor: { - title: i18n.t("reportcenter.templates.exported_gsr_by_ro_labor"), - subject: i18n.t("reportcenter.templates.exported_gsr_by_ro_labor"), - key: "exported_gsr_by_ro_labor", - //idtype: "vendor", - reporttype: "excel", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_exported"), - }, - group: "sales", - }, - jobs_scheduled_completion: { - title: i18n.t("reportcenter.templates.jobs_scheduled_completion"), - subject: i18n.t("reportcenter.templates.jobs_scheduled_completion"), - key: "jobs_scheduled_completion", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.scheduled_completion"), - }, - group: "jobs", - }, - committed_timetickets: { - title: i18n.t("reportcenter.templates.committed_timetickets"), - subject: i18n.t("reportcenter.templates.committed_timetickets"), - key: "committed_timetickets", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.committed_at"), - }, - group: "payroll", - enhanced_payroll: true, - }, - committed_timetickets_employee: { - title: i18n.t( - "reportcenter.templates.committed_timetickets_employee" - ), - subject: i18n.t( - "reportcenter.templates.committed_timetickets_employee" - ), - key: "committed_timetickets_employee", - idtype: "employee", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.committed_at"), - }, - group: "payroll", - enhanced_payroll: true, - }, - committed_timetickets_summary: { - title: i18n.t( - "reportcenter.templates.committed_timetickets_summary" - ), - subject: i18n.t( - "reportcenter.templates.committed_timetickets_summary" - ), - key: "committed_timetickets_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.committed_at"), - }, - group: "payroll", - enhanced_payroll: true, - }, - lost_sales: { - title: i18n.t("reportcenter.templates.lost_sales"), - subject: i18n.t("reportcenter.templates.lost_sales"), - key: "lost_sales", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_lost_sale"), - }, - group: "customers", - }, - load_level: { - title: i18n.t("reportcenter.templates.load_level"), - subject: i18n.t("reportcenter.templates.load_level"), - key: "load_level", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), - }, - group: "jobs", - enhanced_payroll: true, - }, - } - : {}), - ...(!type || type === "courtesycarcontract" - ? { - courtesy_car_contract: { - title: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_contract" - ), - description: "", - subject: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_contract" - ), - key: "courtesy_car_contract", - disabled: false, - }, - courtesy_car_terms: { - title: i18n.t("printcenter.courtesycarcontract.courtesy_car_terms"), - description: "", - subject: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_terms" - ), - key: "courtesy_car_terms", - disabled: false, - }, - courtesy_car_impound: { - title: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_impound" - ), - description: "", - subject: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_impound" - ), - key: "courtesy_car_impound", - disabled: false, - }, - } - : {}), - ...(!type || type === "courtesycar" - ? { - courtesy_car_inventory: { - title: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_inventory" - ), - description: "", - subject: i18n.t( - "printcenter.courtesycarcontract.courtesy_car_inventory" - ), - key: "courtesy_car_inventory", - disabled: false, - }, - } - : {}), - ...(!type || type === "bill" - ? { - inhouse_invoice: { - title: i18n.t("printcenter.bills.inhouse_invoice"), - description: "", - subject: i18n.t("printcenter.bills.inhouse_invoice"), - key: "inhouse_invoice", - disabled: false, - }, - } - : {}), - ...(!type || type === "timeticket" - ? { - // timetickets: { - // title: i18n.t("printcenter.timetickets.timetickets"), - // description: "", - // subject: `${i18n.t("printcenter.timetickets.timetickets")} - ${ - // context && context.job && context.job.ro_number - // }`, - // key: "timetickets", - // disabled: false, - // }, - } - : {}), - ...(!type || type === "messaging" - ? { - conversation_list: { - title: i18n.t("messaging.render.conversation_list"), - description: "", - subject: i18n.t("messaging.render.conversation_list"), - key: "conversation_list", - disabled: false, - }, - } - : {}), - ...(!type || type === "vendor" - ? { - purchases_by_vendor_detailed: { - title: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"), - description: "", - subject: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"), - key: "purchases_by_vendor_detailed", - disabled: false, - }, - purchases_by_vendor_summary: { - title: i18n.t("printcenter.vendors.purchases_by_vendor_summary"), - description: "", - subject: i18n.t("printcenter.vendors.purchases_by_vendor_summary"), - key: "purchases_by_vendor_summary", - disabled: false, - }, - } - : {}), - ...(!type || type === "production" - ? { - production_by_last_name: { - title: i18n.t("reportcenter.templates.production_by_last_name"), - description: "", - subject: i18n.t("reportcenter.templates.production_by_last_name"), - key: "production_by_last_name", - //idtype: "vendor", - disabled: false, - }, - production_by_repair_status: { - title: i18n.t("reportcenter.templates.production_by_repair_status"), - description: "", - subject: i18n.t( - "reportcenter.templates.production_by_repair_status" - ), - key: "production_by_repair_status", - //idtype: "vendor", - disabled: false, - }, - production_by_target_date: { - title: i18n.t("reportcenter.templates.production_by_target_date"), - description: "", - subject: i18n.t("reportcenter.templates.production_by_target_date"), - key: "production_by_target_date", - //idtype: "vendor", - disabled: false, - }, - production_by_ro: { - title: i18n.t("reportcenter.templates.production_by_ro"), - description: "", - subject: i18n.t("reportcenter.templates.production_by_ro"), - key: "production_by_ro", - //idtype: "vendor", - disabled: false, - }, - production_by_csr: { - title: i18n.t("reportcenter.templates.production_by_csr"), - description: "", - subject: i18n.t("reportcenter.templates.production_by_csr"), - key: "production_by_csr", - //idtype: "vendor", - disabled: false, - }, - production_by_category: { - title: i18n.t("reportcenter.templates.production_by_category"), - description: "", - subject: i18n.t("reportcenter.templates.production_by_category"), - key: "production_by_category", - //idtype: "vendor", - disabled: false, - }, - production_by_technician: { - title: i18n.t("reportcenter.templates.production_by_technician"), - description: "", - subject: i18n.t("reportcenter.templates.production_by_technician"), - key: "production_by_technician", - //idtype: "vendor", - disabled: false, - }, - } - : {}), - ...(!type || type === "special" - ? { - ca_bc_etf_table: { - title: i18n.t("printcenter.payments.ca_bc_etf_table"), - description: "", - subject: i18n.t("printcenter.payments.ca_bc_etf_table"), - key: "ca_bc_etf_table", - disabled: false, - }, - exported_payroll: { - title: i18n.t("printcenter.payments.exported_payroll"), - description: "", - subject: i18n.t("printcenter.payments.exported_payroll"), - key: "exported_payroll", - disabled: false, - }, - attendance_detail_csv: { - title: i18n.t("printcenter.special.attendance_detail_csv"), - description: "", - subject: i18n.t("printcenter.special.attendance_detail_csv"), - key: "attendance_detail_csv", - disabled: false, - }, - production_by_technician_one: { - title: i18n.t( - "reportcenter.templates.production_by_technician_one" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.production_by_technician_one" - ), - key: "production_by_technician_one", - //idtype: "vendor", - disabled: false, - }, - production_by_category_one: { - title: i18n.t("reportcenter.templates.production_by_category_one"), - description: "", - subject: i18n.t( - "reportcenter.templates.production_by_category_one" - ), - key: "production_by_category_one", - //idtype: "vendor", - disabled: false, - }, - production_by_repair_status_one: { - title: i18n.t( - "reportcenter.templates.production_by_repair_status_one" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.production_by_repair_status_one" - ), - key: "production_by_repair_status_one", - //idtype: "vendor", - disabled: false, - }, - } - : {}), - }; + //const { bodyshop } = store.getState().user; + return { + //If there's no type or the type is job, send it back. + ...(!type || type === "job" + ? { + casl_authorization: { + title: i18n.t("printcenter.jobs.casl_authorization"), + description: "", + subject: i18n.t("printcenter.jobs.casl_authorization"), + key: "casl_authorization", + disabled: false, + group: "authorization", + regions: { + CA: true, + }, + }, + fippa_authorization: { + title: i18n.t("printcenter.jobs.fippa_authorization"), + description: "", + subject: i18n.t("printcenter.jobs.fippa_authorization"), + key: "fippa_authorization", + disabled: false, + group: "authorization", + }, + diagnostic_authorization: { + title: i18n.t("printcenter.jobs.diagnostic_authorization"), + description: "", + subject: i18n.t("printcenter.jobs.diagnostic_authorization"), + key: "diagnostic_authorization", + disabled: false, + group: "authorization", + }, + mechanical_authorization: { + title: i18n.t("printcenter.jobs.mechanical_authorization"), + description: "", + subject: i18n.t("printcenter.jobs.mechanical_authorization"), + key: "mechanical_authorization", + disabled: false, + group: "authorization", + }, + appointment_reminder: { + title: i18n.t("printcenter.jobs.appointment_reminder"), + description: "", + subject: i18n.t("printcenter.jobs.appointment_reminder"), + key: "appointment_reminder", + disabled: false, + group: "pre", + }, + estimate_followup: { + title: i18n.t("printcenter.jobs.estimate_followup"), + description: "", + subject: i18n.t("printcenter.jobs.estimate_followup"), + key: "estimate_followup", + disabled: false, + group: "pre", + }, + express_repair_checklist: { + title: i18n.t("printcenter.jobs.express_repair_checklist"), + description: "", + subject: i18n.t("printcenter.jobs.express_repair_checklist"), + key: "express_repair_checklist", + disabled: false, + group: "pre", + }, + glass_express_checklist: { + title: i18n.t("printcenter.jobs.glass_express_checklist"), + description: "", + subject: i18n.t("printcenter.jobs.glass_express_checklist"), + key: "glass_express_checklist", + disabled: false, + group: "pre", + }, + stolen_recovery_checklist: { + title: i18n.t("printcenter.jobs.stolen_recovery_checklist"), + description: "", + subject: i18n.t("printcenter.jobs.stolen_recovery_checklist"), + key: "stolen_recovery_checklist", + disabled: false, + group: "pre", + }, + vehicle_check_in: { + title: i18n.t("printcenter.jobs.vehicle_check_in"), + description: "", + subject: i18n.t("printcenter.jobs.vehicle_check_in"), + key: "vehicle_check_in", + disabled: false, + group: "pre", + }, + parts_order_history: { + title: i18n.t("printcenter.jobs.parts_order_history"), + description: "", + subject: i18n.t("printcenter.jobs.parts_order_history"), + key: "parts_order_history", + disabled: false, + group: "ro", + }, + job_notes: { + title: i18n.t("printcenter.jobs.job_notes"), + description: "", + subject: i18n.t("printcenter.jobs.job_notes"), + key: "job_notes", + disabled: false, + group: "ro", + }, + ro_with_description: { + title: i18n.t("printcenter.jobs.ro_with_description"), + description: "", + subject: i18n.t("printcenter.jobs.ro_with_description"), + key: "ro_with_description", + disabled: false, + group: "ro", + }, + window_tag: { + title: i18n.t("printcenter.jobs.window_tag"), + description: "", + subject: i18n.t("printcenter.jobs.window_tag"), + key: "window_tag", + disabled: false, + group: "ro", + }, + supplement_request: { + title: i18n.t("printcenter.jobs.supplement_request"), + description: "", + subject: i18n.t("printcenter.jobs.supplement_request"), + key: "supplement_request", + disabled: false, + group: "ro", + }, + estimate: { + title: i18n.t("printcenter.jobs.estimate"), + description: "", + subject: i18n.t("printcenter.jobs.estimate"), + key: "estimate", + disabled: false, + group: "ro", + }, + parts_list: { + title: i18n.t("printcenter.jobs.parts_list"), + description: "", + subject: i18n.t("printcenter.jobs.parts_list"), + key: "parts_list", + disabled: false, + group: "ro", + }, + coversheet_portrait: { + title: i18n.t("printcenter.jobs.coversheet_portrait"), + description: "", + subject: i18n.t("printcenter.jobs.coversheet_portrait"), + key: "coversheet_portrait", + disabled: false, + group: "ro", + }, + coversheet_landscape: { + title: i18n.t("printcenter.jobs.coversheet_landscape"), + description: "", + subject: i18n.t("printcenter.jobs.coversheet_landscape"), + key: "coversheet_landscape", + disabled: false, + group: "ro", + }, + key_tag: { + title: i18n.t("printcenter.jobs.key_tag"), + description: "", + subject: i18n.t("printcenter.jobs.key_tag"), + key: "key_tag", + disabled: false, + group: "ro", + }, + paint_grid: { + title: i18n.t("printcenter.jobs.paint_grid"), + description: "", + subject: i18n.t("printcenter.jobs.paint_grid"), + key: "paint_grid", + disabled: false, + group: "ro", + }, + worksheet_by_line_number: { + title: i18n.t("printcenter.jobs.worksheet_by_line_number"), + description: "", + subject: i18n.t("printcenter.jobs.worksheet_by_line_number"), + key: "worksheet_by_line_number", + disabled: false, + group: "worksheet", + enhanced_payroll: false, + }, + worksheet_by_line_number_enhanced: { + title: i18n.t("printcenter.jobs.worksheet_by_line_number"), + description: "", + subject: i18n.t("printcenter.jobs.worksheet_by_line_number"), + key: "worksheet_by_line_number_enhanced", + disabled: false, + group: "worksheet", + enhanced_payroll: true, + }, + worksheet_sorted_by_operation_type: { + title: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_type" + ), + description: "", + subject: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_type" + ), + key: "worksheet_sorted_by_operation_type", + disabled: false, + group: "worksheet", + enhanced_payroll: false, + }, + worksheet_sorted_by_operation_type_enhanced: { + title: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_type" + ), + description: "", + subject: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_type" + ), + key: "worksheet_sorted_by_operation_type_enhanced", + disabled: false, + group: "worksheet", + enhanced_payroll: true, + }, + worksheet_sorted_by_operation: { + title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), + description: "", + subject: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), + key: "worksheet_sorted_by_operation", + disabled: false, + group: "worksheet", + enhanced_payroll: false, + }, + worksheet_sorted_by_operation_enhanced: { + title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), + description: "", + subject: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), + key: "worksheet_sorted_by_operation_enhanced", + disabled: false, + group: "worksheet", + enhanced_payroll: true, + }, + worksheet_sorted_by_operation_no_hours: { + title: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_no_hours" + ), + description: "", + subject: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_no_hours" + ), + key: "worksheet_sorted_by_operation_no_hours", + disabled: false, + group: "worksheet", + enhanced_payroll: false, + }, + worksheet_sorted_by_operation_no_hours_enhanced: { + title: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_no_hours" + ), + description: "", + subject: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_no_hours" + ), + key: "worksheet_sorted_by_operation_no_hours_enhanced", + disabled: false, + group: "worksheet", + enhanced_payroll: true, + }, + worksheet_sorted_by_operation_part_type: { + title: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_part_type" + ), + description: "", + subject: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_part_type" + ), + key: "worksheet_sorted_by_operation_part_type", + disabled: false, + group: "worksheet", + enhanced_payroll: false, + }, + worksheet_sorted_by_operation_part_type_enhanced: { + title: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_part_type" + ), + description: "", + subject: i18n.t( + "printcenter.jobs.worksheet_sorted_by_operation_part_type" + ), + key: "worksheet_sorted_by_operation_part_type_enhanced", + disabled: false, + group: "worksheet", + enhanced_payroll: true, + }, + payments_by_job: { + title: i18n.t("printcenter.jobs.payments_by_job"), + description: "", + subject: i18n.t("printcenter.jobs.payments_by_job"), + key: "payments_by_job", + disabled: false, + group: "financial", + }, + final_invoice: { + title: i18n.t("printcenter.jobs.final_invoice"), + description: "", + subject: i18n.t("printcenter.jobs.final_invoice"), + key: "final_invoice", + disabled: false, + group: "financial", + }, + payment_request: { + title: i18n.t("printcenter.jobs.payment_request"), + description: "", + subject: i18n.t("printcenter.jobs.payment_request"), + key: "payment_request", + disabled: false, + group: "financial", + }, + invoice_total_payable: { + title: i18n.t("printcenter.jobs.invoice_total_payable"), + description: "", + subject: i18n.t("printcenter.jobs.invoice_total_payable"), + key: "invoice_total_payable", + disabled: false, + group: "financial", + }, + invoice_customer_payable: { + title: i18n.t("printcenter.jobs.invoice_customer_payable"), + description: "", + subject: i18n.t("printcenter.jobs.invoice_customer_payable"), + key: "invoice_customer_payable", + disabled: false, + group: "financial", + }, + ro_totals: { + title: i18n.t("printcenter.jobs.ro_totals"), + description: "", + subject: i18n.t("printcenter.jobs.ro_totals"), + key: "ro_totals", + disabled: false, + group: "financial", + }, + job_costing_ro: { + title: i18n.t("printcenter.jobs.job_costing_ro"), + description: "", + subject: i18n.t("printcenter.jobs.job_costing_ro"), + key: "job_costing_ro", + disabled: false, + group: "financial", + }, + purchases_by_ro_detail: { + title: i18n.t("printcenter.jobs.purchases_by_ro_detail"), + description: "", + subject: i18n.t("printcenter.jobs.purchases_by_ro_detail"), + key: "purchases_by_ro_detail", + disabled: false, + group: "financial", + }, + purchases_by_ro_summary: { + title: i18n.t("printcenter.jobs.purchases_by_ro_summary"), + description: "", + subject: i18n.t("printcenter.jobs.purchases_by_ro_summary"), + key: "purchases_by_ro_summary", + disabled: false, + group: "financial", + }, + filing_coversheet_portrait: { + title: i18n.t("printcenter.jobs.filing_coversheet_portrait"), + description: "", + subject: i18n.t("printcenter.jobs.filing_coversheet_portrait"), + key: "filing_coversheet_portrait", + disabled: false, + group: "post", + }, + filing_coversheet_landscape: { + title: i18n.t("printcenter.jobs.filing_coversheet_landscape"), + description: "", + subject: i18n.t("printcenter.jobs.filing_coversheet_landscape"), + key: "filing_coversheet_landscape", + disabled: false, + group: "post", + }, + qc_sheet: { + title: i18n.t("printcenter.jobs.qc_sheet"), + description: "", + subject: i18n.t("printcenter.jobs.qc_sheet"), + key: "qc_sheet", + disabled: false, + group: "post", + }, + vehicle_delivery_check: { + title: i18n.t("printcenter.jobs.vehicle_delivery_check"), + description: "", + subject: i18n.t("printcenter.jobs.vehicle_delivery_check"), + key: "vehicle_delivery_check", + disabled: false, + group: "post", + }, + guarantee: { + title: i18n.t("printcenter.jobs.guarantee"), + description: "", + subject: i18n.t("printcenter.jobs.guarantee"), + key: "guarantee", + disabled: false, + group: "post", + }, + csi_invitation: { + title: i18n.t("printcenter.jobs.csi_invitation"), + description: "", + key: "csi_invitation", + subject: i18n.t("printcenter.jobs.csi_invitation"), + disabled: false, + group: "post", + }, + window_tag_sublet: { + title: i18n.t("printcenter.jobs.window_tag_sublet"), + description: "", + key: "window_tag_sublet", + subject: i18n.t("printcenter.jobs.window_tag_sublet"), + disabled: false, + group: "ro", + }, + thank_you_ro: { + title: i18n.t("printcenter.jobs.thank_you_ro"), + description: "", + key: "thank_you_ro", + subject: i18n.t("printcenter.jobs.thank_you_ro"), + disabled: false, + group: "post", + }, + parts_label_single: { + title: i18n.t("printcenter.jobs.parts_label_single"), + description: "", + key: "parts_label_single", + subject: i18n.t("printcenter.jobs.parts_label_single"), + disabled: false, + group: "ro", + ignoreCustomMargins: true, + }, + envelope_return_address: { + title: i18n.t("printcenter.jobs.envelope_return_address"), + description: "", + subject: i18n.t("printcenter.jobs.envelope_return_address"), + key: "envelope_return_address", + disabled: false, + group: "ro", + ignoreCustomMargins: true, + }, + sgi_certificate_of_repairs: { + title: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"), + description: "", + key: "sgi_certificate_of_repairs", + subject: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"), + disabled: false, + group: "ro", + regions: { + CA_SK: true, + }, + }, + sgi_windshield_auth: { + title: i18n.t("printcenter.jobs.sgi_windshield_auth"), + description: "", + key: "sgi_windshield_auth", + subject: i18n.t("printcenter.jobs.sgi_windshield_auth"), + disabled: false, + group: "pre", + regions: { + CA_SK: true, + }, + }, + mpi_final_acct_sheet: { + title: i18n.t("printcenter.jobs.mpi_final_acct_sheet"), + description: "", + key: "mpi_final_acct_sheet", + subject: i18n.t("printcenter.jobs.mpi_final_acct_sheet"), + disabled: false, + group: "post", + regions: { + CA_MB: true, + }, + }, + mpi_final_repair_acct_sheet: { + title: i18n.t("printcenter.jobs.mpi_final_repair_acct_sheet"), + description: "", + key: "mpi_final_repair_acct_sheet", + subject: i18n.t("printcenter.jobs.mpi_final_repair_acct_sheet"), + disabled: false, + group: "post", + regions: { + CA_MB: true, + }, + }, + mpi_eglass_auth: { + title: i18n.t("printcenter.jobs.mpi_eglass_auth"), + description: "", + key: "mpi_eglass_auth", + subject: i18n.t("printcenter.jobs.mpi_eglass_auth"), + disabled: false, + group: "pre", + regions: { + CA_MB: true, + }, + }, + mpi_animal_checklist: { + title: i18n.t("printcenter.jobs.mpi_animal_checklist"), + description: "", + key: "mpi_animal_checklist", + subject: i18n.t("printcenter.jobs.mpi_animal_checklist"), + disabled: false, + group: "pre", + regions: { + CA_MB: true, + }, + }, + ab_proof_of_loss: { + title: i18n.t("printcenter.jobs.ab_proof_of_loss"), + description: "", + key: "ab_proof_of_loss", + subject: i18n.t("printcenter.jobs.ab_proof_of_loss"), + disabled: false, + group: "pre", + regions: { + CA_AB: true, + }, + }, + // parts_label_multi: { + // title: i18n.t("printcenter.jobs.parts_label_multi"), + // description: "", + // key: "parts_label_multi", + // subject: i18n.t("printcenter.jobs.parts_label_multi"), + // disabled: false, + // group: "ro", + // }, + iou_form: { + title: i18n.t("printcenter.jobs.iou_form"), + description: "", + subject: i18n.t("printcenter.jobs.iou_form"), + key: "iou_form", + disabled: false, + group: "post", + }, + lag_time_ro: { + title: i18n.t("printcenter.jobs.lag_time_ro"), + description: "", + subject: i18n.t("printcenter.jobs.lag_time_ro"), + key: "lag_time_ro", + disabled: false, + group: "ro", + }, + rental_reservation: { + title: i18n.t("printcenter.jobs.rental_reservation"), + description: "", + subject: i18n.t("printcenter.jobs.rental_reservation"), + key: "rental_reservation", + disabled: false, + group: "pre", + }, + timetickets_ro: { + title: i18n.t("printcenter.jobs.timetickets_ro"), + description: "", + subject: i18n.t("printcenter.jobs.timetickets_ro"), + key: "timetickets_ro", + disabled: false, + group: "financial", + }, + dms_posting_sheet: { + title: i18n.t("printcenter.jobs.dms_posting_sheet"), + description: "", + subject: i18n.t("printcenter.jobs.dms_posting_sheet"), + key: "dms_posting_sheet", + disabled: false, + group: "financial", + dms: true, + }, + worksheet_sorted_by_team: { + title: i18n.t("printcenter.jobs.worksheet_sorted_by_team"), + description: "", + subject: i18n.t("printcenter.jobs.worksheet_sorted_by_team"), + key: "worksheet_sorted_by_team", + disabled: false, + group: "worksheet", + enhanced_payroll: true, + }, + committed_timetickets_ro: { + title: i18n.t("printcenter.jobs.committed_timetickets_ro"), + description: "", + subject: i18n.t("printcenter.jobs.committed_timetickets_ro"), + key: "committed_timetickets_ro", + disabled: false, + group: "financial", + enhanced_payroll: true, + }, + } + : {}), + ...(!type || type === "job_special" + ? { + special_thirdpartypayer: { + title: i18n.t("printcenter.jobs.thirdpartypayer"), + description: "", + key: "special_thirdpartypayer", + disabled: false, + }, + folder_label_multiple: { + title: i18n.t("printcenter.jobs.folder_label_multiple"), + description: "", + key: "folder_label_multiple", + disabled: false, + }, + parts_label_multiple: { + title: i18n.t("printcenter.jobs.parts_label_multiple"), + description: "", + key: "parts_label_multiple", + disabled: false, + }, + parts_invoice_label_single: { + title: i18n.t("printcenter.jobs.parts_invoice_label_single"), + description: "", + key: "parts_invoice_label_single", + disabled: false, + ignoreCustomMargins: true, + }, + csi_invitation_action: { + title: i18n.t("printcenter.jobs.csi_invitation_action"), + description: "", + key: "csi_invitation_action", + subject: i18n.t("printcenter.jobs.csi_invitation_action"), + disabled: false, + }, + individual_job_note: { + title: i18n.t("printcenter.jobs.individual_job_note"), + description: "", + key: "individual_job_note", + subject: i18n.t("printcenter.subjects.jobs.individual_job_note", { + ro_number: (context && context.ro_number) || "", + }), + disabled: false, + }, + parts_dispatch: { + title: i18n.t("printcenter.jobs.parts_dispatch"), + description: "", + key: "parts_dispatch", + subject: i18n.t("printcenter.subjects.jobs.parts_dispatch", { + ro_number: (context && context.ro_number) || "", + }), + disabled: false, + }, + } + : {}), + ...(!type || type === "appointment" + ? { + appointment_confirmation: { + title: i18n.t("printcenter.appointments.appointment_confirmation"), + description: "", + subject: i18n.t( + "printcenter.appointments.appointment_confirmation" + ), + key: "appointment_confirmation", + disabled: false, + }, + } + : {}), + ...(!type || type === "partsorder" + ? { + parts_order: { + title: i18n.t("printcenter.jobs.parts_order"), + description: "", + key: "parts_order", + subject: i18n.t("printcenter.subjects.jobs.parts_order", { + ro_number: context && context.job && context.job.ro_number, + name: ( + (context && context.job && context.job.ownr_ln) || + (context && context.job && context.job.ownr_co_nm) || + "" + ).trim(), + }), + disabled: false, + }, + sublet_order: { + title: i18n.t("printcenter.jobs.sublet_order"), + description: "", + key: "sublet_order", + subject: i18n.t("printcenter.subjects.jobs.sublet_order", { + ro_number: context && context.job && context.job.ro_number, + name: ( + (context && context.job && context.job.ownr_ln) || + (context && context.job && context.job.ownr_co_nm) || + "" + ).trim(), + }), + disabled: false, + }, + parts_return_slip: { + title: i18n.t("printcenter.jobs.parts_return_slip"), + subject: i18n.t("printcenter.subjects.jobs.parts_return_slip", { + ro_number: context && context.job && context.job.ro_number, + name: ( + (context && context.job && context.job.ownr_ln) || + (context && context.job && context.job.ownr_co_nm) || + "" + ).trim(), + }), + description: "", + key: "parts_return_slip", + disabled: false, + }, + } + : {}), + ...(!type || type === "payment" + ? { + payment_receipt: { + title: i18n.t("printcenter.jobs.payment_receipt"), + description: "", + subject: i18n.t("printcenter.jobs.payment_receipt"), + key: "payment_receipt", + disabled: false, + }, + } + : {}), + ...(!type || type === "csi" ? {} : {}), + ...(!type || type === "report_center" + ? { + hours_sold_detail_closed: { + title: i18n.t("reportcenter.templates.hours_sold_detail_closed"), + description: "", + subject: i18n.t("reportcenter.templates.hours_sold_detail_closed"), + key: "hours_sold_detail_closed", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_closed_ins_co: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_ins_co" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_ins_co" + ), + key: "hours_sold_detail_closed_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_summary_closed: { + title: i18n.t("reportcenter.templates.hours_sold_summary_closed"), + description: "", + subject: i18n.t("reportcenter.templates.hours_sold_summary_closed"), + key: "hours_sold_summary_closed", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_summary_closed_ins_co: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_ins_co" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_ins_co" + ), + key: "hours_sold_summary_closed_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_open: { + title: i18n.t("reportcenter.templates.hours_sold_detail_open"), + description: "", + subject: i18n.t("reportcenter.templates.hours_sold_detail_open"), + key: "hours_sold_detail_open", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "sales", + }, + hours_sold_detail_open_ins_co: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_open_ins_co" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_open_ins_co" + ), + key: "hours_sold_detail_open_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "sales", + }, + hours_sold_summary_open: { + title: i18n.t("reportcenter.templates.hours_sold_summary_open"), + description: "", + subject: i18n.t("reportcenter.templates.hours_sold_summary_open"), + key: "hours_sold_summary_open", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "sales", + }, + hours_sold_summary_open_ins_co: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_open_ins_co" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_open_ins_co" + ), + key: "hours_sold_summary_open_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "sales", + }, + hours_sold_detail_closed_csr: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_csr" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_csr" + ), + key: "hours_sold_detail_closed_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_open_csr: { + title: i18n.t("reportcenter.templates.hours_sold_detail_open_csr"), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_open_csr" + ), + key: "hours_sold_detail_open_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "sales", + }, + hours_sold_summary_closed_csr: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_csr" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_csr" + ), + key: "hours_sold_summary_closed_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_summary_open_csr: { + title: i18n.t("reportcenter.templates.hours_sold_summary_open_csr"), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_open_csr" + ), + key: "hours_sold_summary_open_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_closed_estimator: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_estimator" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_estimator" + ), + key: "hours_sold_detail_closed_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_open_estimator: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_open_estimator" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_open_estimator" + ), + key: "hours_sold_detail_open_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "sales", + }, + hours_sold_summary_closed_estimator: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_estimator" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_estimator" + ), + key: "hours_sold_summary_closed_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_summary_open_estimator: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_open_estimator" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_open_estimator" + ), + key: "hours_sold_summary_open_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_summary_open_status: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_open_status" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_open_status" + ), + key: "hours_sold_summary_open_status", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_summary_closed_status: { + title: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_status" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_summary_closed_status" + ), + key: "hours_sold_summary_closed_status", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_open_status: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_open_status" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_open_status" + ), + key: "hours_sold_detail_open_status", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + hours_sold_detail_closed_status: { + title: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_status" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.hours_sold_detail_closed_status" + ), + key: "hours_sold_detail_closed_status", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + purchases_by_date_range_detail: { + title: i18n.t( + "reportcenter.templates.purchases_by_date_range_detail" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_date_range_detail" + ), + key: "purchases_by_date_range_detail", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_date_range_summary: { + title: i18n.t( + "reportcenter.templates.purchases_by_date_range_summary" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_date_range_summary" + ), + key: "purchases_by_date_range_summary", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_vendor_detailed_date_range: { + title: i18n.t( + "reportcenter.templates.purchases_by_vendor_detailed_date_range" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_vendor_detailed_date_range" + ), + key: "purchases_by_vendor_detailed_date_range", + idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_vendor_summary_date_range: { + title: i18n.t( + "reportcenter.templates.purchases_by_vendor_summary_date_range" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_vendor_summary_date_range" + ), + key: "purchases_by_vendor_summary_date_range", + idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_cost_center_detail: { + title: i18n.t( + "reportcenter.templates.purchases_by_cost_center_detail" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.purchases_by_cost_center_detail" + ), + key: "purchases_by_cost_center_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_cost_center_summary: { + title: i18n.t( + "reportcenter.templates.purchases_by_cost_center_summary" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.purchases_by_cost_center_summary" + ), + key: "purchases_by_cost_center_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_grouped_by_vendor_detailed: { + title: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_detailed" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_detailed" + ), + key: "purchases_grouped_by_vendor_detailed", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_grouped_by_vendor_summary: { + title: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_summary" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_summary" + ), + key: "purchases_grouped_by_vendor_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + job_costing_ro_date_summary: { + title: i18n.t("reportcenter.templates.job_costing_ro_date_summary"), + description: "", + subject: i18n.t( + "reportcenter.templates.job_costing_ro_date_summary" + ), + key: "job_costing_ro_date_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + job_costing_ro_csr: { + title: i18n.t("reportcenter.templates.job_costing_ro_csr"), + description: "", + subject: i18n.t("reportcenter.templates.job_costing_ro_csr"), + key: "job_costing_ro_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + job_costing_ro_ins_co: { + title: i18n.t("reportcenter.templates.job_costing_ro_ins_co"), + description: "", + subject: i18n.t("reportcenter.templates.job_costing_ro_ins_co"), + key: "job_costing_ro_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + job_costing_ro_date_detail: { + title: i18n.t("reportcenter.templates.job_costing_ro_date_detail"), + description: "", + subject: i18n.t( + "reportcenter.templates.job_costing_ro_date_detail" + ), + key: "job_costing_ro_date_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + job_costing_ro_estimator: { + title: i18n.t("reportcenter.templates.job_costing_ro_estimator"), + description: "", + subject: i18n.t("reportcenter.templates.job_costing_ro_estimator"), + key: "job_costing_ro_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + payments_by_date: { + title: i18n.t("reportcenter.templates.payments_by_date"), + subject: i18n.t("reportcenter.templates.payments_by_date"), + key: "payments_by_date", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.payments"), + field: i18n.t("payments.fields.date"), + }, + group: "customers", + }, + payments_by_date_type: { + title: i18n.t("reportcenter.templates.payments_by_date_type"), + subject: i18n.t("reportcenter.templates.payments_by_date_type"), + key: "payments_by_date_type", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.payments"), + field: i18n.t("payments.fields.date"), + }, + group: "customers", + }, + schedule: { + title: i18n.t("reportcenter.templates.schedule"), + subject: i18n.t("reportcenter.templates.schedule"), + key: "schedule", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.appointments"), + field: i18n.t("appointments.fields.time"), + }, + group: "customers", + }, + timetickets: { + title: i18n.t("reportcenter.templates.timetickets"), + subject: i18n.t("reportcenter.templates.timetickets"), + key: "timetickets", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + timetickets_employee: { + title: i18n.t("reportcenter.templates.timetickets_employee"), + subject: i18n.t("reportcenter.templates.timetickets_employee"), + key: "timetickets_employee", + idtype: "employee", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + attendance_detail: { + title: i18n.t("reportcenter.templates.attendance_detail"), + subject: i18n.t("reportcenter.templates.attendance_detail"), + key: "attendance_detail", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + attendance_summary: { + title: i18n.t("reportcenter.templates.attendance_summary"), + subject: i18n.t("reportcenter.templates.attendance_summary"), + key: "attendance_summary", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + attendance_employee: { + title: i18n.t("reportcenter.templates.attendance_employee"), + subject: i18n.t("reportcenter.templates.attendance_employee"), + key: "attendance_employee", + idtype: "employee", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + timetickets_summary: { + title: i18n.t("reportcenter.templates.timetickets_summary"), + subject: i18n.t("reportcenter.templates.timetickets_summary"), + key: "timetickets_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + estimator_detail: { + title: i18n.t("reportcenter.templates.estimator_detail"), + description: "", + subject: i18n.t("reportcenter.templates.estimator_detail"), + key: "estimator_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + estimator_summary: { + title: i18n.t("reportcenter.templates.estimator_summary"), + description: "", + subject: i18n.t("reportcenter.templates.estimator_summary"), + key: "estimator_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + supplement_ratio_ins_co: { + title: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), + description: "", + subject: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), + key: "supplement_ratio_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + credits_not_received_date: { + title: i18n.t("reportcenter.templates.credits_not_received_date"), + description: "", + subject: i18n.t("reportcenter.templates.credits_not_received_date"), + key: "credits_not_received_date", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "purchases", + }, + void_ros: { + title: i18n.t("reportcenter.templates.void_ros"), + description: "", + subject: i18n.t("reportcenter.templates.void_ros"), + key: "void_ros", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_void"), + }, + group: "sales", + }, + gsr_by_csr: { + title: i18n.t("reportcenter.templates.gsr_by_csr"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_csr"), + key: "gsr_by_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_make: { + title: i18n.t("reportcenter.templates.gsr_by_make"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_make"), + key: "gsr_by_make", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_delivery_date: { + title: i18n.t("reportcenter.templates.gsr_by_delivery_date"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_delivery_date"), + key: "gsr_by_delivery_date", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.actual_delivery"), + }, + group: "sales", + }, + gsr_by_referral: { + title: i18n.t("reportcenter.templates.gsr_by_referral"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_referral"), + key: "gsr_by_referral", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_ro: { + title: i18n.t("reportcenter.templates.gsr_by_ro"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_ro"), + key: "gsr_by_ro", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_ins_co: { + title: i18n.t("reportcenter.templates.gsr_by_ins_co"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_ins_co"), + key: "gsr_by_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_exported_date: { + title: i18n.t("reportcenter.templates.gsr_by_exported_date"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_exported_date"), + key: "gsr_by_exported_date", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_exported"), + }, + group: "sales", + }, + gsr_by_estimator: { + title: i18n.t("reportcenter.templates.gsr_by_estimator"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_estimator"), + key: "gsr_by_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_category: { + title: i18n.t("reportcenter.templates.gsr_by_category"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_category"), + key: "gsr_by_category", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_ats: { + title: i18n.t("reportcenter.templates.gsr_by_ats"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_ats"), + key: "gsr_by_ats", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_labor_only: { + title: i18n.t("reportcenter.templates.gsr_labor_only"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_labor_only"), + key: "gsr_labor_only", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + open_orders: { + title: i18n.t("reportcenter.templates.open_orders"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders"), + key: "open_orders", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + open_orders_status: { + title: i18n.t("reportcenter.templates.open_orders_status"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders_status"), + key: "open_orders_status", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + open_orders_csr: { + title: i18n.t("reportcenter.templates.open_orders_csr"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders_csr"), + key: "open_orders_csr", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + open_orders_specific_csr: { + title: i18n.t("reportcenter.templates.open_orders_specific_csr"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders_specific_csr"), + key: "open_orders_specific_csr", + idtype: "employee", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + open_orders_estimator: { + title: i18n.t("reportcenter.templates.open_orders_estimator"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders_estimator"), + key: "open_orders_estimator", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + open_orders_ins_co: { + title: i18n.t("reportcenter.templates.open_orders_ins_co"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders_ins_co"), + key: "open_orders_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + open_orders_referral: { + title: i18n.t("reportcenter.templates.open_orders_referral"), + description: "", + subject: i18n.t("reportcenter.templates.open_orders_referral"), + key: "open_orders_referral", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + export_payables: { + title: i18n.t("reportcenter.templates.export_payables"), + description: "", + subject: i18n.t("reportcenter.templates.export_payables"), + key: "export_payables", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.exportlogs"), + field: i18n.t("exportlogs.fields.createdat"), + }, + group: "purchases", + }, + export_payments: { + title: i18n.t("reportcenter.templates.export_payments"), + description: "", + subject: i18n.t("reportcenter.templates.export_payments"), + key: "export_payments", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.exportlogs"), + field: i18n.t("exportlogs.fields.createdat"), + }, + group: "customers", + }, + export_receivables: { + title: i18n.t("reportcenter.templates.export_receivables"), + description: "", + subject: i18n.t("reportcenter.templates.export_receivables"), + key: "export_receivables", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.exportlogs"), + field: i18n.t("exportlogs.fields.createdat"), + }, + group: "sales", + }, + parts_backorder: { + title: i18n.t("reportcenter.templates.parts_backorder"), + description: "", + subject: i18n.t("reportcenter.templates.parts_backorder"), + key: "parts_backorder", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.actual_in"), + }, + group: "purchases", + }, + thank_you_date: { + title: i18n.t("reportcenter.templates.thank_you_date"), + description: "", + subject: i18n.t("reportcenter.templates.thank_you_date"), + key: "thank_you_date", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "customers", + }, + unclaimed_hrs: { + title: i18n.t("reportcenter.templates.unclaimed_hrs"), + description: "", + subject: i18n.t("reportcenter.templates.unclaimed_hrs"), + key: "unclaimed_hrs", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "payroll", + }, + work_in_progress_jobs_excel: { + title: i18n.t("reportcenter.templates.work_in_progress_jobs"), + subject: i18n.t("reportcenter.templates.work_in_progress_jobs"), + key: "work_in_progress_jobs_excel", + //idtype: "vendor", + reporttype: "excel", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + work_in_progress_labour: { + title: i18n.t("reportcenter.templates.work_in_progress_labour"), + description: "", + subject: i18n.t("reportcenter.templates.work_in_progress_labour"), + key: "work_in_progress_labour", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + work_in_progress_committed_labour: { + title: i18n.t( + "reportcenter.templates.work_in_progress_committed_labour" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.work_in_progress_committed_labour" + ), + key: "work_in_progress_committed_labour", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + enhanced_payroll: true, + }, + work_in_progress_payables: { + title: i18n.t("reportcenter.templates.work_in_progress_payables"), + description: "", + subject: i18n.t("reportcenter.templates.work_in_progress_payables"), + key: "work_in_progress_payables", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + lag_time: { + title: i18n.t("reportcenter.templates.lag_time"), + description: "", + subject: i18n.t("reportcenter.templates.lag_time"), + key: "lag_time", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + parts_not_recieved: { + title: i18n.t("reportcenter.templates.parts_not_recieved"), + description: "", + subject: i18n.t("reportcenter.templates.parts_not_recieved"), + key: "parts_not_recieved", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.parts_orders"), + field: i18n.t("parts_orders.fields.order_date"), + }, + group: "purchases", + }, + parts_not_recieved_vendor: { + title: i18n.t("reportcenter.templates.parts_not_recieved_vendor"), + description: "", + subject: i18n.t("reportcenter.templates.parts_not_recieved_vendor"), + key: "parts_not_recieved_vendor", + idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.parts_orders"), + field: i18n.t("parts_orders.fields.order_date"), + }, + group: "purchases", + }, + scoreboard_detail: { + title: i18n.t("reportcenter.templates.scoreboard_detail"), + description: "", + subject: i18n.t("reportcenter.templates.scoreboard_detail"), + key: "scoreboard_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.scoreboard"), + field: i18n.t("scoreboard.fields.date"), + }, + group: "payroll", + }, + scoreboard_summary: { + title: i18n.t("reportcenter.templates.scoreboard_summary"), + description: "", + subject: i18n.t("reportcenter.templates.scoreboard_summary"), + key: "scoreboard_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.scoreboard"), + field: i18n.t("scoreboard.fields.date"), + }, + group: "payroll", + }, + anticipated_revenue: { + title: i18n.t("reportcenter.templates.anticipated_revenue"), + description: "", + subject: i18n.t("reportcenter.templates.anticipated_revenue"), + key: "anticipated_revenue", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.scheduled_completion"), // Also date invoice. + }, + group: "sales", + }, + csi: { + title: i18n.t("reportcenter.templates.csi"), + description: "", + subject: i18n.t("reportcenter.templates.csi"), + key: "csi", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.csi"), + field: i18n.t("csi.fields.created_at"), // Also date invoice. + }, + group: "customers", + }, + estimates_written_converted: { + title: i18n.t("reportcenter.templates.estimates_written_converted"), + description: "", + subject: i18n.t( + "reportcenter.templates.estimates_written_converted" + ), + key: "estimates_written_converted", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: + i18n.t("jobs.fields.date_open") + + "/" + + i18n.t("jobs.fields.date_invoiced"), // Also date invoice. + }, + group: "sales", + }, + credits_not_received_date_vendorid: { + title: i18n.t( + "reportcenter.templates.credits_not_received_date_vendorid" + ), + subject: i18n.t( + "reportcenter.templates.credits_not_received_date_vendorid" + ), + key: "credits_not_received_date_vendorid", + idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "purchases", + }, + jobs_reconcile: { + title: i18n.t("reportcenter.templates.jobs_reconcile"), + subject: i18n.t("reportcenter.templates.jobs_reconcile"), + key: "jobs_reconcile", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + parts_received_not_scheduled: { + title: i18n.t( + "reportcenter.templates.parts_received_not_scheduled" + ), + subject: i18n.t( + "reportcenter.templates.parts_received_not_scheduled" + ), + key: "parts_received_not_scheduled", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + psr_by_make: { + title: i18n.t("reportcenter.templates.psr_by_make"), + subject: i18n.t("reportcenter.templates.psr_by_make"), + key: "psr_by_make", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + cycle_time_analysis: { + title: i18n.t("reportcenter.templates.cycle_time_analysis"), + subject: i18n.t("reportcenter.templates.cycle_time_analysis"), + key: "cycle_time_analysis", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.actual_completion"), + }, + group: "jobs", + }, + returns_grouped_by_vendor_summary: { + title: i18n.t( + "reportcenter.templates.returns_grouped_by_vendor_summary" + ), + subject: i18n.t( + "reportcenter.templates.returns_grouped_by_vendor_summary" + ), + key: "returns_grouped_by_vendor_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.parts_orders"), + field: i18n.t("parts_orders.fields.order_date"), + }, + group: "jobs", + }, + returns_grouped_by_vendor_detailed: { + title: i18n.t( + "reportcenter.templates.returns_grouped_by_vendor_detailed" + ), + subject: i18n.t( + "reportcenter.templates.returns_grouped_by_vendor_detailed" + ), + key: "returns_grouped_by_vendor_detailed", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.parts_orders"), + field: i18n.t("parts_orders.fields.order_date"), + }, + group: "jobs", + }, + scheduled_parts_list: { + title: i18n.t("reportcenter.templates.scheduled_parts_list"), + subject: i18n.t("reportcenter.templates.scheduled_parts_list"), + key: "scheduled_parts_list", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.scheduled_in"), + }, + group: "jobs", + }, + jobs_completed_not_invoiced: { + title: i18n.t("reportcenter.templates.jobs_completed_not_invoiced"), + subject: i18n.t( + "reportcenter.templates.jobs_completed_not_invoiced" + ), + key: "jobs_completed_not_invoiced", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + jobs_invoiced_not_exported: { + title: i18n.t("reportcenter.templates.jobs_invoiced_not_exported"), + subject: i18n.t( + "reportcenter.templates.jobs_invoiced_not_exported" + ), + key: "jobs_invoiced_not_exported", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "jobs", + }, + purchase_return_ratio_grouped_by_vendor_detail: { + title: i18n.t( + "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" + ), + subject: i18n.t( + "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" + ), + key: "purchase_return_ratio_grouped_by_vendor_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchase_return_ratio_grouped_by_vendor_summary: { + title: i18n.t( + "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" + ), + subject: i18n.t( + "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" + ), + key: "purchase_return_ratio_grouped_by_vendor_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + production_over_time: { + title: i18n.t("reportcenter.templates.production_over_time"), + subject: i18n.t("reportcenter.templates.production_over_time"), + key: "production_over_time", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.actual_in"), + }, + group: "jobs", + }, + customer_list: { + title: i18n.t("reportcenter.templates.customer_list"), + subject: i18n.t("reportcenter.templates.customer_list"), + key: "customer_list", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "customers", + }, + exported_gsr_by_ro: { + title: i18n.t("reportcenter.templates.exported_gsr_by_ro"), + subject: i18n.t("reportcenter.templates.exported_gsr_by_ro"), + key: "exported_gsr_by_ro", + //idtype: "vendor", + reporttype: "excel", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_exported"), + }, + group: "sales", + }, + exported_gsr_by_ro_labor: { + title: i18n.t("reportcenter.templates.exported_gsr_by_ro_labor"), + subject: i18n.t("reportcenter.templates.exported_gsr_by_ro_labor"), + key: "exported_gsr_by_ro_labor", + //idtype: "vendor", + reporttype: "excel", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_exported"), + }, + group: "sales", + }, + jobs_scheduled_completion: { + title: i18n.t("reportcenter.templates.jobs_scheduled_completion"), + subject: i18n.t("reportcenter.templates.jobs_scheduled_completion"), + key: "jobs_scheduled_completion", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.scheduled_completion"), + }, + group: "jobs", + }, + committed_timetickets: { + title: i18n.t("reportcenter.templates.committed_timetickets"), + subject: i18n.t("reportcenter.templates.committed_timetickets"), + key: "committed_timetickets", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.committed_at"), + }, + group: "payroll", + enhanced_payroll: true, + }, + committed_timetickets_employee: { + title: i18n.t( + "reportcenter.templates.committed_timetickets_employee" + ), + subject: i18n.t( + "reportcenter.templates.committed_timetickets_employee" + ), + key: "committed_timetickets_employee", + idtype: "employee", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.committed_at"), + }, + group: "payroll", + enhanced_payroll: true, + }, + committed_timetickets_summary: { + title: i18n.t( + "reportcenter.templates.committed_timetickets_summary" + ), + subject: i18n.t( + "reportcenter.templates.committed_timetickets_summary" + ), + key: "committed_timetickets_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.committed_at"), + }, + group: "payroll", + enhanced_payroll: true, + }, + lost_sales: { + title: i18n.t("reportcenter.templates.lost_sales"), + subject: i18n.t("reportcenter.templates.lost_sales"), + key: "lost_sales", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_lost_sale"), + }, + group: "customers", + }, + open_orders_excel: { + title: i18n.t("reportcenter.templates.open_orders_excel"), + subject: i18n.t("reportcenter.templates.open_orders_excel"), + key: "open_orders_excel", + //idtype: "vendor", + reporttype: "excel", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + }, + load_level: { + title: i18n.t("reportcenter.templates.load_level"), + subject: i18n.t("reportcenter.templates.load_level"), + key: "load_level", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "jobs", + enhanced_payroll: true, + }, + } + : {}), + ...(!type || type === "courtesycarcontract" + ? { + courtesy_car_contract: { + title: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_contract" + ), + description: "", + subject: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_contract" + ), + key: "courtesy_car_contract", + disabled: false, + }, + courtesy_car_terms: { + title: i18n.t("printcenter.courtesycarcontract.courtesy_car_terms"), + description: "", + subject: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_terms" + ), + key: "courtesy_car_terms", + disabled: false, + }, + courtesy_car_impound: { + title: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_impound" + ), + description: "", + subject: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_impound" + ), + key: "courtesy_car_impound", + disabled: false, + }, + } + : {}), + ...(!type || type === "courtesycar" + ? { + courtesy_car_inventory: { + title: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_inventory" + ), + description: "", + subject: i18n.t( + "printcenter.courtesycarcontract.courtesy_car_inventory" + ), + key: "courtesy_car_inventory", + disabled: false, + }, + } + : {}), + ...(!type || type === "bill" + ? { + inhouse_invoice: { + title: i18n.t("printcenter.bills.inhouse_invoice"), + description: "", + subject: i18n.t("printcenter.bills.inhouse_invoice"), + key: "inhouse_invoice", + disabled: false, + }, + } + : {}), + ...(!type || type === "timeticket" + ? { + // timetickets: { + // title: i18n.t("printcenter.timetickets.timetickets"), + // description: "", + // subject: `${i18n.t("printcenter.timetickets.timetickets")} - ${ + // context && context.job && context.job.ro_number + // }`, + // key: "timetickets", + // disabled: false, + // }, + } + : {}), + ...(!type || type === "messaging" + ? { + conversation_list: { + title: i18n.t("messaging.render.conversation_list"), + description: "", + subject: i18n.t("messaging.render.conversation_list"), + key: "conversation_list", + disabled: false, + }, + } + : {}), + ...(!type || type === "vendor" + ? { + purchases_by_vendor_detailed: { + title: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"), + description: "", + subject: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"), + key: "purchases_by_vendor_detailed", + disabled: false, + }, + purchases_by_vendor_summary: { + title: i18n.t("printcenter.vendors.purchases_by_vendor_summary"), + description: "", + subject: i18n.t("printcenter.vendors.purchases_by_vendor_summary"), + key: "purchases_by_vendor_summary", + disabled: false, + }, + } + : {}), + ...(!type || type === "production" + ? { + production_by_last_name: { + title: i18n.t("reportcenter.templates.production_by_last_name"), + description: "", + subject: i18n.t("reportcenter.templates.production_by_last_name"), + key: "production_by_last_name", + //idtype: "vendor", + disabled: false, + }, + production_by_repair_status: { + title: i18n.t("reportcenter.templates.production_by_repair_status"), + description: "", + subject: i18n.t( + "reportcenter.templates.production_by_repair_status" + ), + key: "production_by_repair_status", + //idtype: "vendor", + disabled: false, + }, + production_by_target_date: { + title: i18n.t("reportcenter.templates.production_by_target_date"), + description: "", + subject: i18n.t("reportcenter.templates.production_by_target_date"), + key: "production_by_target_date", + //idtype: "vendor", + disabled: false, + }, + production_by_ro: { + title: i18n.t("reportcenter.templates.production_by_ro"), + description: "", + subject: i18n.t("reportcenter.templates.production_by_ro"), + key: "production_by_ro", + //idtype: "vendor", + disabled: false, + }, + production_by_csr: { + title: i18n.t("reportcenter.templates.production_by_csr"), + description: "", + subject: i18n.t("reportcenter.templates.production_by_csr"), + key: "production_by_csr", + //idtype: "vendor", + disabled: false, + }, + production_by_category: { + title: i18n.t("reportcenter.templates.production_by_category"), + description: "", + subject: i18n.t("reportcenter.templates.production_by_category"), + key: "production_by_category", + //idtype: "vendor", + disabled: false, + }, + production_by_technician: { + title: i18n.t("reportcenter.templates.production_by_technician"), + description: "", + subject: i18n.t("reportcenter.templates.production_by_technician"), + key: "production_by_technician", + //idtype: "vendor", + disabled: false, + }, + } + : {}), + ...(!type || type === "special" + ? { + ca_bc_etf_table: { + title: i18n.t("printcenter.payments.ca_bc_etf_table"), + description: "", + subject: i18n.t("printcenter.payments.ca_bc_etf_table"), + key: "ca_bc_etf_table", + disabled: false, + }, + exported_payroll: { + title: i18n.t("printcenter.payments.exported_payroll"), + description: "", + subject: i18n.t("printcenter.payments.exported_payroll"), + key: "exported_payroll", + disabled: false, + }, + attendance_detail_csv: { + title: i18n.t("printcenter.special.attendance_detail_csv"), + description: "", + subject: i18n.t("printcenter.special.attendance_detail_csv"), + key: "attendance_detail_csv", + disabled: false, + }, + production_by_technician_one: { + title: i18n.t( + "reportcenter.templates.production_by_technician_one" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.production_by_technician_one" + ), + key: "production_by_technician_one", + //idtype: "vendor", + disabled: false, + }, + production_by_category_one: { + title: i18n.t("reportcenter.templates.production_by_category_one"), + description: "", + subject: i18n.t( + "reportcenter.templates.production_by_category_one" + ), + key: "production_by_category_one", + //idtype: "vendor", + disabled: false, + }, + production_by_repair_status_one: { + title: i18n.t( + "reportcenter.templates.production_by_repair_status_one" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.production_by_repair_status_one" + ), + key: "production_by_repair_status_one", + //idtype: "vendor", + disabled: false, + }, + } + : {}), + }; }; diff --git a/client/src/utils/betaHandler.js b/client/src/utils/betaHandler.js new file mode 100644 index 000000000..19ec72ab2 --- /dev/null +++ b/client/src/utils/betaHandler.js @@ -0,0 +1,37 @@ +export const BETA_KEY = 'betaSwitchImex'; + +export const checkBeta = () => { + const cookie = document.cookie.split('; ').find(row => row.startsWith(BETA_KEY)); + return cookie ? cookie.split('=')[1] === 'true' : false; +} + + +export const setBeta = (value) => { + const domain = window.location.hostname.split('.').slice(-2).join('.'); + document.cookie = `${BETA_KEY}=${value}; path=/; domain=.${domain}`; +} + +export const handleBeta = () => { + // If the current host name does not start with beta or test, then we don't need to do anything. + if (window.location.hostname.startsWith('localhost')) { + console.log('Not on beta or test, so no need to handle beta.'); + return; + } + + const isBeta = checkBeta(); + + const currentHostName = window.location.hostname; + + // Beta is enabled, but the current host name does start with beta. + if (isBeta && !currentHostName.startsWith('beta')) { + const href = `${window.location.protocol}//beta.${currentHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(href); + } + + // Beta is not enabled, but the current host name does start with beta. + else if (!isBeta && currentHostName.startsWith('beta')) { + const href = `${window.location.protocol}//${currentHostName.replace('beta.', '')}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(href); + } +} +export default handleBeta; \ No newline at end of file diff --git a/client/src/utils/day.js b/client/src/utils/day.js new file mode 100644 index 000000000..b16e16262 --- /dev/null +++ b/client/src/utils/day.js @@ -0,0 +1,73 @@ +import dayjs from 'dayjs'; + +import dayjsBusinessDays from "dayjs-business-days2"; +import isSameOrAfter from "dayjs/plugin/isSameOrAfter"; +import updateLocale from 'dayjs/plugin/updateLocale'; +import isSameOrBefore from "dayjs/plugin/isSameOrBefore"; +import timezone from 'dayjs/plugin/timezone'; +import utc from 'dayjs/plugin/utc'; +import minMax from 'dayjs/plugin/minMax'; +import isBetween from 'dayjs/plugin/isBetween'; +import customParseFormat from 'dayjs/plugin/customParseFormat'; +import pluralGetSet from 'dayjs/plugin/pluralGetSet'; +import duration from 'dayjs/plugin/duration'; +import advancedFormat from 'dayjs/plugin/advancedFormat'; +import arraySupport from 'dayjs/plugin/arraySupport'; +import calendar from 'dayjs/plugin/calendar'; +import dayOfYear from 'dayjs/plugin/dayOfYear'; +import weekday from 'dayjs/plugin/weekday'; +import weekOfYear from 'dayjs/plugin/weekOfYear'; +import weekYear from 'dayjs/plugin/weekYear'; +import isoWeek from 'dayjs/plugin/isoWeek'; +import isoWeeksInYear from 'dayjs/plugin/isoWeeksInYear'; +import isLeapYear from 'dayjs/plugin/isLeapYear'; +import localeData from 'dayjs/plugin/localeData'; +import localizedFormat from 'dayjs/plugin/localizedFormat'; +import quarterOfYear from 'dayjs/plugin/quarterOfYear'; +import relativeTime from 'dayjs/plugin/relativeTime'; +import isToday from 'dayjs/plugin/isToday'; +import isTomorrow from 'dayjs/plugin/isTomorrow'; +import isYesterday from 'dayjs/plugin/isYesterday'; +import objectSupport from 'dayjs/plugin/objectSupport'; +import toArray from 'dayjs/plugin/toArray'; +import toObject from 'dayjs/plugin/toObject'; + +// import badMutable from 'dayjs/plugin/badMutable'; +// import preParsePostFormat from 'dayjs/plugin/preParsePostFormat'; + + +// dayjs.extend(badMutable); // TODO: Client Update - This is not advised, scoreboard page +dayjs.extend(toObject); +dayjs.extend(toArray); +dayjs.extend(objectSupport); +dayjs.extend(isYesterday); +dayjs.extend(isTomorrow); +dayjs.extend(isToday); +dayjs.extend(localeData); +dayjs.extend(quarterOfYear); +dayjs.extend(localizedFormat); +// dayjs.extend(preParsePostFormat); // TODO: This should not be needed +dayjs.extend(isLeapYear); +dayjs.extend(isoWeeksInYear); +dayjs.extend(isoWeek); +dayjs.extend(weekYear); +dayjs.extend(weekOfYear); +dayjs.extend(weekday); +dayjs.extend(dayOfYear); +dayjs.extend(calendar); +dayjs.extend(arraySupport); +dayjs.extend(advancedFormat); +dayjs.extend(duration); +dayjs.extend(relativeTime); +dayjs.extend(pluralGetSet); +dayjs.extend(customParseFormat); +dayjs.extend(utc); +dayjs.extend(timezone); +dayjs.extend(updateLocale); +dayjs.extend(isSameOrAfter); +dayjs.extend(isSameOrBefore); +dayjs.extend(minMax); +dayjs.extend(isBetween); +dayjs.extend(dayjsBusinessDays); + +export default dayjs; \ No newline at end of file diff --git a/client/src/utils/handleBeta.js b/client/src/utils/handleBeta.js new file mode 100644 index 000000000..8a1fba468 --- /dev/null +++ b/client/src/utils/handleBeta.js @@ -0,0 +1,37 @@ +export const BETA_KEY = 'betaSwitchImex'; + +export const checkBeta = () => { + const cookie = document.cookie.split('; ').find(row => row.startsWith(BETA_KEY)); + return cookie ? cookie.split('=')[1] === 'true' : false; +} + + +export const setBeta = (value) => { + const domain = window.location.hostname.split('.').slice(-2).join('.'); + document.cookie = `${BETA_KEY}=${value}; path=/; domain=.${domain}`; +} + +export const handleBeta = () => { + // If the current host name does not start with beta or test, then we don't need to do anything. + if (window.location.hostname.startsWith('localhost')) { + console.log('Not on beta or test, so no need to handle beta.'); + return; + } + + const isBeta = checkBeta(); + + const currentHostName = window.location.hostname; + + // Beta is enabled, but the current host name does start with beta. + if (isBeta && !currentHostName.startsWith('beta')) { + const href= `${window.location.protocol}//beta.${currentHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(href); + } + + // Beta is not enabled, but the current host name does start with beta. + else if (!isBeta && currentHostName.startsWith('beta')) { + const href = `${window.location.protocol}//${currentHostName.replace('beta.', '')}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(href); + } +} +export default handleBeta; diff --git a/client/src/utils/private-route.js b/client/src/utils/private-route.js deleted file mode 100644 index 372dba49b..000000000 --- a/client/src/utils/private-route.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from "react"; -import { Redirect, Route, useLocation } from "react-router-dom"; - -function PrivateRoute({ component: Component, isAuthorized, ...rest }) { - const location = useLocation(); - - return ( - - isAuthorized === true ? ( - - ) : ( - - ) - } - /> - ); -} - -export default PrivateRoute; diff --git a/client/src/utils/prompt.js b/client/src/utils/prompt.js new file mode 100644 index 000000000..08ef5cf05 --- /dev/null +++ b/client/src/utils/prompt.js @@ -0,0 +1,46 @@ +import {useBeforeUnload, useBlocker} from "react-router-dom"; +import {useCallback, useEffect, useRef} from "react"; +function usePrompt(message, {beforeUnload} = {}) { + + let blocker = useBlocker( + useCallback( + (location) => { + // This has been put in, so it does not affect transitions between the same page + if (location.currentLocation.pathname === location.nextLocation.pathname) { + return false; + } + return typeof message === "string" ? !window.confirm(message) : false; + }, + [message] + ) + ); + + let prevState = useRef(blocker.state); + + useEffect(() => { + if (blocker.state === "blocked") { + blocker.reset(); + } + prevState.current = blocker.state; + }, [blocker]); + + useBeforeUnload( + useCallback( + (event) => { + if (beforeUnload && typeof message === "string") { + event.preventDefault(); + event.returnValue = message; + } + }, + [message, beforeUnload] + ), + {capture: true} + ); +} + +function Prompt({when, message, ...props}) { + usePrompt(when ? message : false, props); + return null; +} + +export default Prompt; \ No newline at end of file diff --git a/client/src/utils/useKeyboardShortcut.jsx b/client/src/utils/useKeyboardShortcut.jsx index 1f31def21..32148b9ec 100644 --- a/client/src/utils/useKeyboardShortcut.jsx +++ b/client/src/utils/useKeyboardShortcut.jsx @@ -1,129 +1,128 @@ -import { useEffect, useCallback, useReducer } from "react"; +import {useCallback, useEffect, useReducer, useState} from "react"; //Based on https://www.fullstacklabs.co/blog/keyboard-shortcuts-with-react-hooks const blacklistedTargets = []; // ["INPUT", "TEXTAREA"]; export const useKeyboardSaveShortcut = (callback) => - useKeyboardShortcut(["Control", "S"], callback, { overrideSystem: true }); + useKeyboardShortcut(["Control", "S"], callback, {overrideSystem: true}); const keysReducer = (state, action) => { - switch (action.type) { - case "set-key-down": - const keydownState = { ...state, [action.key]: true }; - return keydownState; - case "set-key-up": - const keyUpState = { ...state, [action.key]: false }; - return keyUpState; - case "reset-keys": - const resetState = { ...action.data }; - return resetState; - default: - return state; - } + switch (action.type) { + case "set-key-down": + const keydownState = {...state, [action.key]: true}; + return keydownState; + case "set-key-up": + const keyUpState = {...state, [action.key]: false}; + return keyUpState; + case "reset-keys": + const resetState = {...action.data}; + return resetState; + default: + return state; + } }; const useKeyboardShortcut = (shortcutKeys, callback, options) => { - if (!Array.isArray(shortcutKeys)) - throw new Error( - "The first parameter to `useKeyboardShortcut` must be an ordered array of `KeyboardEvent.key` strings." + if (!Array.isArray(shortcutKeys)) + throw new Error( + "The first parameter to `useKeyboardShortcut` must be an ordered array of `KeyboardEvent.key` strings." + ); + + if (!shortcutKeys.length) + throw new Error( + "The first parameter to `useKeyboardShortcut` must contain atleast one `KeyboardEvent.key` string." + ); + + if (!callback || typeof callback !== "function") + throw new Error( + "The second parameter to `useKeyboardShortcut` must be a function that will be envoked when the keys are pressed." + ); + + const {overrideSystem} = options || {}; + const initalKeyMapping = shortcutKeys.reduce((currentKeys, key) => { + currentKeys[key.toLowerCase()] = false; + return currentKeys; + }, {}); + + const [keys, setKeys] = useReducer(keysReducer, initalKeyMapping); + const [listenersAdded, setListenersAdded] = useState(false); + + const keydownListener = useCallback( + (assignedKey) => (keydownEvent) => { + const loweredKey = assignedKey.toLowerCase(); + + if (keydownEvent.repeat) return; + if (blacklistedTargets.includes(keydownEvent.target.tagName)) return; + if (loweredKey !== keydownEvent.key.toLowerCase()) return; + if (keys[loweredKey] === undefined) return; + + if (overrideSystem) { + keydownEvent.preventDefault(); + disabledEventPropagation(keydownEvent); + } + + setKeys({type: "set-key-down", key: loweredKey}); + return false; + }, + [keys, overrideSystem] ); - if (!shortcutKeys.length) - throw new Error( - "The first parameter to `useKeyboardShortcut` must contain atleast one `KeyboardEvent.key` string." + const keyupListener = useCallback( + (assignedKey) => (keyupEvent) => { + const raisedKey = assignedKey.toLowerCase(); + + if (blacklistedTargets.includes(keyupEvent.target.tagName)) return; + if (keyupEvent.key.toLowerCase() !== raisedKey) return; + if (keys[raisedKey] === undefined) return; + + if (overrideSystem) { + keyupEvent.preventDefault(); + disabledEventPropagation(keyupEvent); + } + + setKeys({type: "set-key-up", key: raisedKey}); + return false; + }, + [keys, overrideSystem] ); - if (!callback || typeof callback !== "function") - throw new Error( - "The second parameter to `useKeyboardShortcut` must be a function that will be envoked when the keys are pressed." - ); + useEffect(() => { + if (!Object.values(keys).filter((value) => !value).length) { + callback(keys); + setKeys({type: "reset-keys", data: initalKeyMapping}); + } else { + setKeys({type: null}); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [callback, keys]); - const { overrideSystem } = options || {}; - const initalKeyMapping = shortcutKeys.reduce((currentKeys, key) => { - currentKeys[key.toLowerCase()] = false; - return currentKeys; - }, {}); + useEffect(() => { + if (!listenersAdded) { + console.log('Added events for keyup and keydown'); + shortcutKeys.forEach((k) => { + window.addEventListener("keydown", keydownListener(k)); + window.addEventListener("keyup", keyupListener(k)) + }); + } - const [keys, setKeys] = useReducer(keysReducer, initalKeyMapping); + setListenersAdded(true); - const keydownListener = useCallback( - (assignedKey) => (keydownEvent) => { - const loweredKey = assignedKey.toLowerCase(); + return () => { + shortcutKeys.forEach((k) => { + window.removeEventListener("keydown", keydownListener(k)); + window.removeEventListener("keyup", keyupListener(k)); + }); + } + }, [listenersAdded]); - if (keydownEvent.repeat) return; - if (blacklistedTargets.includes(keydownEvent.target.tagName)) return; - if (loweredKey !== keydownEvent.key.toLowerCase()) return; - if (keys[loweredKey] === undefined) return; - - if (overrideSystem) { - keydownEvent.preventDefault(); - disabledEventPropagation(keydownEvent); - } - - setKeys({ type: "set-key-down", key: loweredKey }); - return false; - }, - [keys, overrideSystem] - ); - - const keyupListener = useCallback( - (assignedKey) => (keyupEvent) => { - const raisedKey = assignedKey.toLowerCase(); - - if (blacklistedTargets.includes(keyupEvent.target.tagName)) return; - if (keyupEvent.key.toLowerCase() !== raisedKey) return; - if (keys[raisedKey] === undefined) return; - - if (overrideSystem) { - keyupEvent.preventDefault(); - disabledEventPropagation(keyupEvent); - } - - setKeys({ type: "set-key-up", key: raisedKey }); - return false; - }, - [keys, overrideSystem] - ); - - useEffect(() => { - if (!Object.values(keys).filter((value) => !value).length) { - callback(keys); - setKeys({ type: "reset-keys", data: initalKeyMapping }); - } else { - setKeys({ type: null }); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [callback, keys]); - - useEffect(() => { - shortcutKeys.forEach((k) => - window.addEventListener("keydown", keydownListener(k)) - ); - return () => - shortcutKeys.forEach((k) => - window.removeEventListener("keydown", keydownListener(k)) - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - shortcutKeys.forEach((k) => - window.addEventListener("keyup", keyupListener(k)) - ); - return () => - shortcutKeys.forEach((k) => - window.removeEventListener("keyup", keyupListener(k)) - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); }; export default useKeyboardShortcut; function disabledEventPropagation(e) { - if (e) { - if (e.stopPropagation) { - e.stopPropagation(); - } else if (window.event) { - window.event.cancelBubble = true; + if (e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else if (window.event) { + window.event.cancelBubble = true; + } } - } } diff --git a/client/yarn.lock b/client/yarn.lock index 89bdd16a8..e69de29bb 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1,13790 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@ant-design/colors@^6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz" - integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== - dependencies: - "@ctrl/tinycolor" "^3.4.0" - -"@ant-design/icons-svg@^4.2.1": - version "4.2.1" - resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz" - integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== - -"@ant-design/icons@^4.7.0": - version "4.7.0" - resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-4.7.0.tgz" - integrity sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g== - dependencies: - "@ant-design/colors" "^6.0.0" - "@ant-design/icons-svg" "^4.2.1" - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-util "^5.9.4" - -"@ant-design/react-slick@~0.29.1": - version "0.29.2" - resolved "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz" - integrity sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA== - dependencies: - "@babel/runtime" "^7.10.4" - classnames "^2.2.5" - json2mq "^0.2.0" - lodash "^4.17.21" - resize-observer-polyfill "^1.5.1" - -"@apideck/better-ajv-errors@^0.3.1": - version "0.3.6" - resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz" - integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== - dependencies: - json-schema "^0.4.0" - jsonpointer "^5.0.0" - leven "^3.1.0" - -"@apollo/client@^3.7.9": - version "3.7.9" - resolved "https://registry.npmjs.org/@apollo/client/-/client-3.7.9.tgz" - integrity sha512-YnJvrJOVWrp4y/zdNvUaM8q4GuSHCEIecsRDTJhK/veT33P/B7lfqGJ24NeLdKMj8tDEuXYF7V0t+th4+rgC+Q== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.7.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" - prop-types "^15.7.2" - response-iterator "^0.2.6" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - -"@asseinfo/react-kanban@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@asseinfo/react-kanban/-/react-kanban-2.2.0.tgz" - integrity sha512-/gCigrNXRHeP9VCo8RipTOrA0vAPRIOThJhR4ibVxe6BLkaWFUEuJ1RMT4fODpRRsE3XsdrfVGKkfpRBKgvxXg== - dependencies: - react-beautiful-dnd "^13.0.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.8.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.11.1", "@babel/core@^7.7.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/eslint-parser@^7.16.3": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz" - integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.0" - -"@babel/generator@^7.18.9", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.7.2": - version "7.21.1" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz" - integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz" - integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - -"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz" - integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.6", "@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz" - integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz" - integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ== - dependencies: - "@babel/helper-function-name" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== - -"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - -"@babel/plugin-proposal-async-generator-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz" - integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== - dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@^7.16.4": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.9.tgz" - integrity sha512-KD7zDNaD14CRpjQjVbV4EnH9lsKYlcpUrhZH37ei2IY+AlXrfAPy5pTmRUE4X6X1k8EsKXPraykxeaogqQvSGA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.18.6" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz" - integrity sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz" - integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.20.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-destructuring@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz" - integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz" - integrity sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-flow" "^7.18.6" - -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz" - integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== - dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" - -"@babel/plugin-transform-modules-systemjs@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz" - integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-validator-identifier" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz" - integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz" - integrity sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz" - integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-runtime@^7.16.4": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz" - integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz" - integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.18.6": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz" - integrity sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-typescript" "^7.18.6" - -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-unicode-escapes@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz" - integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/preset-env@^7.11.0": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz" - integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.18.6" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.18.9" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.9" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.18.9" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.18.9" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.6" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" - core-js-compat "^3.22.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.16.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.16.7", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.6", "@babel/template@^7.3.3": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.18.9", "@babel/traverse@^7.4.5": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@craco/craco@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@craco/craco/-/craco-7.0.0.tgz" - integrity sha512-OyjL9zpURB6Ha1HO62Hlt27Xd7UYJ8DRiBNuE4DBB8Ue0iQ9q/xsv3ze7ROm6gCZqV6I2Gxjnq0EHCCye+4xDQ== - dependencies: - autoprefixer "^10.4.12" - cosmiconfig "^7.0.1" - cosmiconfig-typescript-loader "^1.0.0" - cross-spawn "^7.0.3" - lodash "^4.17.21" - semver "^7.3.7" - webpack-merge "^5.8.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@csstools/normalize.css@*": - version "12.0.0" - resolved "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz" - integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== - -"@csstools/postcss-cascade-layers@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" - integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== - dependencies: - "@csstools/selector-specificity" "^2.0.2" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-color-function@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz" - integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-font-format-keywords@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz" - integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-hwb-function@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz" - integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-ic-unit@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz" - integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-is-pseudo-class@^2.0.7": - version "2.0.7" - resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz" - integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-nested-calc@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz" - integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-normalize-display-values@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz" - integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-oklab-function@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz" - integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz" - integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-stepped-value-functions@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz" - integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-text-decoration-shorthand@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz" - integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-trigonometric-functions@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz" - integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-unset-value@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz" - integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== - -"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": - version "2.1.1" - resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz" - integrity sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw== - -"@ctrl/tinycolor@^3.4.0": - version "3.4.1" - resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz" - integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== - -"@cypress/request@^2.88.10": - version "2.88.10" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^8.3.2" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - -"@emotion/is-prop-valid@^1.1.0": - version "1.1.3" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.3.tgz" - integrity sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA== - dependencies: - "@emotion/memoize" "^0.7.4" - -"@emotion/memoize@^0.7.4": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@eslint/eslintrc@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz" - integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz" - integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== - -"@fingerprintjs/fingerprintjs@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-3.4.2.tgz" - integrity sha512-3Ncze6JsJpB7BpYhqIgvBpfvEX1jsEKrad5hQBpyRQxtoAp6hx3+R46zqfsuQG4D9egQZ+xftQ0u4LPFMB7Wmg== - dependencies: - tslib "^2.4.1" - -"@firebase/analytics-compat@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.3.tgz" - integrity sha512-HmvbB4GMgh8AUlIDIo/OuFENLCGRXxMvtOueK+m8+DcfqBvG+mkii0Mi9ovo0TnMM62cy3oBYG7PHdjIQNLSLA== - dependencies: - "@firebase/analytics" "0.9.3" - "@firebase/analytics-types" "0.8.0" - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/analytics-types@0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz" - integrity sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw== - -"@firebase/analytics@0.9.3": - version "0.9.3" - resolved "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.9.3.tgz" - integrity sha512-XdYHBi6RvHYVAHGyLxXX0uRPwZmGeqw1JuWS1rMEeRF/jvbxnrL81kcFAHZVRkEvG9bXAJgL2fX9wmDo3e622w== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/app-check-compat@0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.3.tgz" - integrity sha512-25AQ4W7WUL8OWas40GsABuNU622Dm1ojbfeZ03uKtLj5Af7FerJ25u7zkgm+11pc6rpr5v8E5oxEG9vmNRndEA== - dependencies: - "@firebase/app-check" "0.6.3" - "@firebase/app-check-types" "0.5.0" - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/app-check-interop-types@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.2.0.tgz" - integrity sha512-+3PQIeX6/eiVK+x/yg8r6xTNR97fN7MahFDm+jiQmDjcyvSefoGuTTNQuuMScGyx3vYUBeZn+Cp9kC0yY/9uxQ== - -"@firebase/app-check-types@0.5.0": - version "0.5.0" - resolved "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz" - integrity sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ== - -"@firebase/app-check@0.6.3": - version "0.6.3" - resolved "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.6.3.tgz" - integrity sha512-T9f9ceFLs7x4D2T6whu5a6j7B3qPuYHiZHZxW6DkMh/FoMmRA4/q/HVyu01i9+LyJJx2Xdo6eCcj6ofs9YZjqA== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/app-compat@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.3.tgz" - integrity sha512-sX6rD1KFX6K2CuCnQvc9jZLOgAFZ+sv2jKKahIl4SbTM561D682B8n4Jtx/SgDrvcTVTdb05g4NhZOws9hxYxA== - dependencies: - "@firebase/app" "0.9.3" - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/app-types@0.9.0": - version "0.9.0" - resolved "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz" - integrity sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q== - -"@firebase/app@0.9.3": - version "0.9.3" - resolved "https://registry.npmjs.org/@firebase/app/-/app-0.9.3.tgz" - integrity sha512-G79JUceVDaHRZ4WkA11GyVldVXhdyRJRwWVQFFvAAVfQJLvy2TA6lQjeUn28F6FmeUWxDGwPC30bxCRWq7Op8Q== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - idb "7.0.1" - tslib "^2.1.0" - -"@firebase/auth-compat@0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.3.3.tgz" - integrity sha512-9asUuGtkzUVELH3LYXdiom1nVVV9bqEPqzHohanoofHL/oVTNcHZ4AQ5CXjNATfb6c1WH32U+nEuPiYg26UUIw== - dependencies: - "@firebase/auth" "0.21.3" - "@firebase/auth-types" "0.12.0" - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/auth-interop-types@0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz" - integrity sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg== - -"@firebase/auth-types@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz" - integrity sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA== - -"@firebase/auth@0.21.3": - version "0.21.3" - resolved "https://registry.npmjs.org/@firebase/auth/-/auth-0.21.3.tgz" - integrity sha512-HPbcwgArLBVTowFcn4qaQr6LCx7BidI9yrQ5MRbQNv4PsgK/3UGpzCYaNPPbvgr9fe+0jNdJO+uC0+dk4xIzCQ== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/component@0.6.3": - version "0.6.3" - resolved "https://registry.npmjs.org/@firebase/component/-/component-0.6.3.tgz" - integrity sha512-rnhq5SOsB5nuJphZF50iwqnBiuuyg9kdnlUn1rBrKfu7/cUVJZF5IG1cWrL0rXXyiZW1WBI/J2pmTvVO8dStGQ== - dependencies: - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/database-compat@0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.3.tgz" - integrity sha512-r+L9jTbvsnb7sD+xz6UKU39DgBWqB2pyjzPNdBeriGC9Ssa2MAZe0bIqjCQg51RRXYc/aa/zK1Q2/4uesZeVgQ== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/database" "0.14.3" - "@firebase/database-types" "0.10.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/database-types@0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.3.tgz" - integrity sha512-Hu34CDhHYZsd2eielr0jeaWrTJk8Hz0nd7WsnYDnXtQX4i49ppgPesUzPdXVBdIBLJmT0ZZRvT7qWHknkOT+zg== - dependencies: - "@firebase/app-types" "0.9.0" - "@firebase/util" "1.9.2" - -"@firebase/database@0.14.3": - version "0.14.3" - resolved "https://registry.npmjs.org/@firebase/database/-/database-0.14.3.tgz" - integrity sha512-J76W6N7JiVkLaAtPyjaGRkrsIu9pi6iZikuGGtGjqvV19vkn7oiL4Hbo5uTYCMd4waTUWoL9iI08eX184W+5GQ== - dependencies: - "@firebase/auth-interop-types" "0.2.1" - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - faye-websocket "0.11.4" - tslib "^2.1.0" - -"@firebase/firestore-compat@0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.3.tgz" - integrity sha512-fMTsSC0s2cF5w2+JoB0dWD/o4kXtLrUCPGnZPuz4S0bqTN2t0vHr3gdAsQLtnadgwB78ACtinYmf4Udwx7TzDg== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/firestore" "3.8.3" - "@firebase/firestore-types" "2.5.1" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/firestore-types@2.5.1": - version "2.5.1" - resolved "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz" - integrity sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw== - -"@firebase/firestore@3.8.3": - version "3.8.3" - resolved "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.8.3.tgz" - integrity sha512-4xR3Mqj95bxHg3hZnz0O+LQrHkjq+siT2y+B9da6u68qJ8bzzT42JaFgd1vifhbBpVbBzpFaS2RuCq2E+kGv9g== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - "@firebase/webchannel-wrapper" "0.9.0" - "@grpc/grpc-js" "~1.7.0" - "@grpc/proto-loader" "^0.6.13" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/functions-compat@0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.3.tgz" - integrity sha512-UIAJ2gzNq0p/61cXqkpi9DnlQt0hdlGqgmL5an7KuJth2Iv5uGpKg/+OapAZxPuiUNZgTEyZDB7kNBHvnxWq5w== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/functions" "0.9.3" - "@firebase/functions-types" "0.6.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/functions-types@0.6.0": - version "0.6.0" - resolved "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz" - integrity sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw== - -"@firebase/functions@0.9.3": - version "0.9.3" - resolved "https://registry.npmjs.org/@firebase/functions/-/functions-0.9.3.tgz" - integrity sha512-tPJgYY2ROQSYuzvgxZRoHeDj+Ic07/bWHwaftgTriawtupmFOkt5iikuhJSJUhaOpFh9TB335OvCXJw1N+BIlQ== - dependencies: - "@firebase/app-check-interop-types" "0.2.0" - "@firebase/auth-interop-types" "0.2.1" - "@firebase/component" "0.6.3" - "@firebase/messaging-interop-types" "0.2.0" - "@firebase/util" "1.9.2" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/installations-compat@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.3.tgz" - integrity sha512-K9rKM/ym06lkpaKz7bMLxzHK/HEk65XfLJBV+dJkIuWeO0EqqC9VFGrpWAo0QmgC4BqbU58T6VBbzoJjb0gaFw== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" - "@firebase/installations-types" "0.5.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/installations-types@0.5.0": - version "0.5.0" - resolved "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz" - integrity sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg== - -"@firebase/installations@0.6.3": - version "0.6.3" - resolved "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.3.tgz" - integrity sha512-20JFWm+tweNoRjRbz8/Y4I7O5pUJGZsFKCkLl1qNxfNYECSfrZUuozIDJDZC/MeVn5+kB9CwjThDlgQEPrfLdg== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" - idb "7.0.1" - tslib "^2.1.0" - -"@firebase/logger@0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz" - integrity sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA== - dependencies: - tslib "^2.1.0" - -"@firebase/messaging-compat@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.3.tgz" - integrity sha512-MmuuohXV2YRzIoJmDngI5qqO/cF2q7SdAaw7k4r61W3ReJy7x4/rtqrIvwNVhM6X/X8NFGBbsYKsCfRHWjFdkg== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/messaging" "0.12.3" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/messaging-interop-types@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz" - integrity sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ== - -"@firebase/messaging@0.12.3": - version "0.12.3" - resolved "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.3.tgz" - integrity sha512-a3ZKcGDiV2sKmQDB56PpgL1yjFxXCtff2+v1grnAZZ4GnfNQ74t2EHCbmgY7xRX7ThzMqug54oxhuk4ur0MIoA== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" - "@firebase/messaging-interop-types" "0.2.0" - "@firebase/util" "1.9.2" - idb "7.0.1" - tslib "^2.1.0" - -"@firebase/performance-compat@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.3.tgz" - integrity sha512-I3rqZsIhauXn4iApfj1ttKQdlti/r8OZBG4YK10vxKSdhAzTIDWDKEsdoCXvvKLwplcMv36sM3WPAPGQLqY5MQ== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/performance" "0.6.3" - "@firebase/performance-types" "0.2.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/performance-types@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz" - integrity sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA== - -"@firebase/performance@0.6.3": - version "0.6.3" - resolved "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.3.tgz" - integrity sha512-NQmQN6Ete7i9jz1mzULJZEGvsOmwwdUy6vpqnhUxSFMYPnlBKjX+yypCUUJDDN5zff5+kfwSD1qCyUAaS0xWUA== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/remote-config-compat@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.3.tgz" - integrity sha512-w/ZL03YgYaXq03xIRyJ5oPhXZi6iDsY/v0J9Y7I7SqxCYytEnHVrL9nvBqd9R94y5LRAVNPCLokJeeizaUz4VQ== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/remote-config" "0.4.3" - "@firebase/remote-config-types" "0.3.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/remote-config-types@0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz" - integrity sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA== - -"@firebase/remote-config@0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.3.tgz" - integrity sha512-Q6d4jBWZoNt6SYq87bjtDGUHFkKwAmGnNjWyRjl14AZqE1ilgd9NZHmutharlYJ3LvxMsid80HdK5SgGEpIPfg== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/storage-compat@0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.1.tgz" - integrity sha512-6HaTvWsT5Yy3j4UpCZpMcFUYEkJ2XYWukdyTl02u6VjSBRLvkhOXPzEfMvgVWqhnF/rYVfPdjrZ904wk5OxtmQ== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/storage" "0.11.1" - "@firebase/storage-types" "0.8.0" - "@firebase/util" "1.9.2" - tslib "^2.1.0" - -"@firebase/storage-types@0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz" - integrity sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg== - -"@firebase/storage@0.11.1": - version "0.11.1" - resolved "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.1.tgz" - integrity sha512-Xv8EG2j52ugF2xayBz26U9J0VBXHXPMVxSN+ph3R3BSoHxvMLaPu+qUYKHavSt+zbcgPH2GyBhrCdJK6SaDFPA== - dependencies: - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/util@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@firebase/util/-/util-1.9.2.tgz" - integrity sha512-9l0uMGPGw3GsoD5khjMmYCCcMq/OR/OOSViiWMN+s2Q0pxM+fYzrii1H+r8qC/uoMjSVXomjLZt0vZIyryCqtQ== - dependencies: - tslib "^2.1.0" - -"@firebase/webchannel-wrapper@0.9.0": - version "0.9.0" - resolved "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.9.0.tgz" - integrity sha512-BpiZLBWdLFw+qFel9p3Zs1jD6QmH7Ii4aTDu6+vx8ShdidChZUXqDhYJly4ZjSgQh54miXbBgBrk0S+jTIh/Qg== - -"@graphql-typed-document-node/core@^3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" - integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== - -"@grpc/grpc-js@~1.7.0": - version "1.7.3" - resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz" - integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== - dependencies: - "@grpc/proto-loader" "^0.7.0" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.6.13": - version "0.6.13" - resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz" - integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.11.3" - yargs "^16.2.0" - -"@grpc/proto-loader@^0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz" - integrity sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^7.0.0" - yargs "^16.2.0" - -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@icons/material@^0.2.4": - version "0.2.4" - resolved "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz" - integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== - dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - dependencies: - "@jest/schemas" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.17": - version "0.3.17" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jsreport/browser-client@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jsreport/browser-client/-/browser-client-3.1.0.tgz" - integrity sha512-ZElwn2KRIzkUzAyD5UKGxULZUhokWuPOlMzrmiur4WirqH3yoiHlOJEdnRGkjjE/fhZzCR8gBFZ/TuOW/fsOIw== - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.10" - resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz" - integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== - dependencies: - ansi-html-community "^0.0.8" - common-path-prefix "^3.0.0" - core-js-pure "^3.23.3" - error-stack-parser "^2.0.6" - find-up "^5.0.0" - html-entities "^2.1.0" - loader-utils "^2.0.4" - schema-utils "^3.0.0" - source-map "^0.7.3" - -"@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@rc-component/portal@^1.0.0-6", "@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.2": - version "1.1.0" - resolved "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz" - integrity sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w== - dependencies: - "@babel/runtime" "^7.18.0" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@redux-saga/core@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.2.tgz" - integrity sha512-0qr5oleOAmI5WoZLRA6FEa30M4qKZcvx+ZQOQw+RqFeH8t20bvhE329XSPsNfTVP8C6qyDsXOSjuoV+g3+8zkg== - dependencies: - "@babel/runtime" "^7.6.3" - "@redux-saga/deferred" "^1.2.1" - "@redux-saga/delay-p" "^1.2.1" - "@redux-saga/is" "^1.1.3" - "@redux-saga/symbols" "^1.1.3" - "@redux-saga/types" "^1.2.1" - redux "^4.0.4" - typescript-tuple "^2.2.1" - -"@redux-saga/deferred@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz" - integrity sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g== - -"@redux-saga/delay-p@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz" - integrity sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w== - dependencies: - "@redux-saga/symbols" "^1.1.3" - -"@redux-saga/is@^1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz" - integrity sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q== - dependencies: - "@redux-saga/symbols" "^1.1.3" - "@redux-saga/types" "^1.2.1" - -"@redux-saga/symbols@^1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz" - integrity sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg== - -"@redux-saga/types@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz" - integrity sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA== - -"@restart/hooks@^0.4.7": - version "0.4.7" - resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz" - integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== - dependencies: - dequal "^2.0.2" - -"@rollup/plugin-babel@^5.2.0": - version "5.3.1" - resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" - integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@rollup/pluginutils" "^3.1.0" - -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/plugin-replace@^2.4.1": - version "2.4.2" - resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@rushstack/eslint-patch@^1.1.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== - -"@sentry/browser@7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/browser/-/browser-7.40.0.tgz" - integrity sha512-07rZ+cTcpmYB1r84/oZtmSPJJvLCxW8yIh/5s4MdKRyZpqIDKhOz6cCS/4j+l1V+MeLcNLZBjFtNdKA2eocTpg== - dependencies: - "@sentry/core" "7.40.0" - "@sentry/replay" "7.40.0" - "@sentry/types" "7.40.0" - "@sentry/utils" "7.40.0" - tslib "^1.9.3" - -"@sentry/cli@^1.74.6": - version "1.74.6" - resolved "https://registry.npmjs.org/@sentry/cli/-/cli-1.74.6.tgz" - integrity sha512-pJ7JJgozyjKZSTjOGi86chIngZMLUlYt2HOog+OJn+WGvqEkVymu8m462j1DiXAnex9NspB4zLLNuZ/R6rTQHg== - dependencies: - https-proxy-agent "^5.0.0" - mkdirp "^0.5.5" - node-fetch "^2.6.7" - npmlog "^4.1.2" - progress "^2.0.3" - proxy-from-env "^1.1.0" - which "^2.0.2" - -"@sentry/core@7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/core/-/core-7.40.0.tgz" - integrity sha512-OPAobQG0GTY++r5LWUcOA1lS+2TY2Lmw/i5s4kL9WbY+f08dbLNEGNBObY7/V98OL4f7OG+nWaPFybgM7kqUTQ== - dependencies: - "@sentry/types" "7.40.0" - "@sentry/utils" "7.40.0" - tslib "^1.9.3" - -"@sentry/react@^7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/react/-/react-7.40.0.tgz" - integrity sha512-7yYagpOCdsXnVTtLL8Y7wAf2xXgsk2ncuju3O/G4kEckkLewZWmQeoknOSGFlAgVdGNhTaXc2WGzgOiBMOkhug== - dependencies: - "@sentry/browser" "7.40.0" - "@sentry/types" "7.40.0" - "@sentry/utils" "7.40.0" - hoist-non-react-statics "^3.3.2" - tslib "^1.9.3" - -"@sentry/replay@7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/replay/-/replay-7.40.0.tgz" - integrity sha512-Y9Kvo9jKouUdrHQhHVv5SmWZClF5o7BFI6oVpLlv4zXORPQlyoZONM/9sxiMvvH73alDSpxzCoxyhlypAOH4ww== - dependencies: - "@sentry/core" "7.40.0" - "@sentry/types" "7.40.0" - "@sentry/utils" "7.40.0" - -"@sentry/tracing@^7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.40.0.tgz" - integrity sha512-y1SNwlFEC7a2ThtWbT/KbnAVecAWyIeKiO/IRgyZSdcj1z4CliADKNQmkUhnDlLy8jV1ARGuZ1DvsuPNlWyDfw== - dependencies: - "@sentry/core" "7.40.0" - "@sentry/types" "7.40.0" - "@sentry/utils" "7.40.0" - tslib "^1.9.3" - -"@sentry/types@7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/types/-/types-7.40.0.tgz" - integrity sha512-dIbqBenbmDx1F8pvfC11C88J83ecwumUhV+YOIxcmVd1fmlPF2hXWZ01+NTkTDkCu341sJx4wPQogByFy8FwGA== - -"@sentry/utils@7.40.0": - version "7.40.0" - resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.40.0.tgz" - integrity sha512-ZdCbTpAXPiVVfvNJVftnDhsctOui71MDUhVIdLkgg4Cuic+WHGPRmmZ+H6uZdp7vRaeB+Uvnn5+t2iSAVo/mAA== - dependencies: - "@sentry/types" "7.40.0" - tslib "^1.9.3" - -"@sentry/webpack-plugin@^1.20.0": - version "1.20.0" - resolved "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz" - integrity sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw== - dependencies: - "@sentry/cli" "^1.74.6" - webpack-sources "^2.0.0 || ^3.0.0" - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@sphinxxxx/color-conversion@^2.2.2": - version "2.2.2" - resolved "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz" - integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== - -"@splitsoftware/splitio-commons@1.7.3": - version "1.7.3" - resolved "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.7.3.tgz" - integrity sha512-rWZ05g6eY0YlaDuNDWc3e/cPudbVRX7y8Lp0eKXE1wIFMf9P5pAdQWvb2KiXXsvGepM0FwA9U6epxEqatBIpiA== - dependencies: - tslib "^2.3.1" - -"@splitsoftware/splitio-react@^1.8.1": - version "1.8.1" - resolved "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-1.8.1.tgz" - integrity sha512-IRJ+9kjWJlTtBCANhaRlXgx781ZxDNB4mb5x7Ian1VETdz+gh+KrZjnFXuT6ndHCjhLHrGEgsItL8ibKGUa8Fg== - dependencies: - "@splitsoftware/splitio" "10.22.3" - memoize-one "^5.1.1" - shallowequal "^1.1.0" - -"@splitsoftware/splitio@10.22.3": - version "10.22.3" - resolved "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.22.3.tgz" - integrity sha512-1MYjuLsTM6N3UEEF+G9Pi8GUw+lEFME8iwbbqaoQxJtHXK6TcQ0i+Kg/yrPXoAuE6RDG17zeltRBfdbZlHrjog== - dependencies: - "@splitsoftware/splitio-commons" "1.7.3" - "@types/google.analytics" "0.0.40" - "@types/ioredis" "^4.28.0" - bloom-filters "^3.0.0" - ioredis "^4.28.0" - js-yaml "^3.13.1" - node-fetch "^2.6.7" - unfetch "^4.2.0" - optionalDependencies: - eventsource "^1.1.2" - -"@surma/rollup-plugin-off-main-thread@^2.2.3": - version "2.2.3" - resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" - integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== - dependencies: - ejs "^3.1.6" - json5 "^2.2.0" - magic-string "^0.25.0" - string.prototype.matchall "^4.0.6" - -"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz" - integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== - -"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz" - integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== - -"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz" - integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz" - integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== - -"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": - version "5.4.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz" - integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== - -"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": - version "5.4.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz" - integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== - -"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": - version "5.4.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz" - integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== - -"@svgr/babel-plugin-transform-svg-component@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz" - integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== - -"@svgr/babel-preset@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz" - integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" - "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" - "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" - "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" - "@svgr/babel-plugin-transform-svg-component" "^5.5.0" - -"@svgr/core@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz" - integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== - dependencies: - "@svgr/plugin-jsx" "^5.5.0" - camelcase "^6.2.0" - cosmiconfig "^7.0.0" - -"@svgr/hast-util-to-babel-ast@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz" - integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== - dependencies: - "@babel/types" "^7.12.6" - -"@svgr/plugin-jsx@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz" - integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== - dependencies: - "@babel/core" "^7.12.3" - "@svgr/babel-preset" "^5.5.0" - "@svgr/hast-util-to-babel-ast" "^5.5.0" - svg-parser "^2.0.2" - -"@svgr/plugin-svgo@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz" - integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== - dependencies: - cosmiconfig "^7.0.0" - deepmerge "^4.2.2" - svgo "^1.2.2" - -"@svgr/webpack@^5.5.0": - version "5.5.0" - resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz" - integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== - dependencies: - "@babel/core" "^7.12.3" - "@babel/plugin-transform-react-constant-elements" "^7.12.1" - "@babel/preset-env" "^7.12.1" - "@babel/preset-react" "^7.12.5" - "@svgr/core" "^5.5.0" - "@svgr/plugin-jsx" "^5.5.0" - "@svgr/plugin-svgo" "^5.5.0" - loader-utils "^2.0.0" - -"@tanem/react-nprogress@^5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@tanem/react-nprogress/-/react-nprogress-5.0.8.tgz" - integrity sha512-40fHVu6qq4Z+AheTxckcd5trx066FvilViQDcOd/v0FW7ap/bJslcMP7tr1rI5By16oddmfgZzLZEmU32ST1Bg== - dependencies: - "@babel/runtime" "^7.18.6" - hoist-non-react-statics "^3.3.2" - -"@testing-library/cypress@^8.0.3": - version "8.0.3" - resolved "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.3.tgz" - integrity sha512-nY2YaSbmuPo5k6kL0iLj/pGPPfka3iwb3kpTx8QN/vOCns92Saz9wfACqB8FJzcR7+lfA4d5HUOWqmTddBzczg== - dependencies: - "@babel/runtime" "^7.14.6" - "@testing-library/dom" "^8.1.0" - -"@testing-library/dom@^8.1.0": - version "8.16.0" - resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz" - integrity sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - aria-query "^5.0.0" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.4.4" - pretty-format "^27.0.2" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.12": - version "7.1.19" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/cookie@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz" - integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== - -"@types/d3-array@^3.0.3": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz" - integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== - -"@types/d3-color@*": - version "3.1.0" - resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz" - integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== - -"@types/d3-ease@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz" - integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== - -"@types/d3-interpolate@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz" - integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== - dependencies: - "@types/d3-color" "*" - -"@types/d3-path@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz" - integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== - -"@types/d3-scale@^4.0.2": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz" - integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== - dependencies: - "@types/d3-time" "*" - -"@types/d3-shape@^3.1.0": - version "3.1.1" - resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz" - integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== - dependencies: - "@types/d3-path" "*" - -"@types/d3-time@*", "@types/d3-time@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz" - integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== - -"@types/d3-timer@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz" - integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.21.1" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz" - integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/google.analytics@0.0.40": - version "0.0.40" - resolved "https://registry.npmjs.org/@types/google.analytics/-/google.analytics-0.0.40.tgz" - integrity sha512-R3HpnLkqmKxhUAf8kIVvDVGJqPtaaZlW4yowNwjOZUTmYUQEgHh8Nh5wkSXKMroNAuQM8gbXJHmNbbgA8tdb7Q== - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/hoist-non-react-statics@^3.0.1", "@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-proxy@^1.17.8": - version "1.17.10" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz" - integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== - dependencies: - "@types/node" "*" - -"@types/ioredis@^4.28.0": - version "4.28.10" - resolved "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz" - integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.6.1" - resolved "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz" - integrity sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg== - -"@types/node@^14.14.31": - version "14.18.22" - resolved "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz" - integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-redux@^7.1.20": - version "7.1.24" - resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz" - integrity sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react@*", "@types/react@>=16.9.11": - version "18.0.15" - resolved "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz" - integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/sinonjs__fake-timers@8.1.1": - version "8.1.1" - resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz" - integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== - -"@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/trusted-types@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== - -"@types/use-sync-external-store@^0.0.3": - version "0.0.3" - resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" - integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== - -"@types/warning@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" - integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== - -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.22" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz" - integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== - dependencies: - "@types/yargs-parser" "*" - -"@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@^5.5.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz" - integrity sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw== - dependencies: - "@typescript-eslint/scope-manager" "5.54.0" - "@typescript-eslint/type-utils" "5.54.0" - "@typescript-eslint/utils" "5.54.0" - debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@^5.0.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.54.0.tgz" - integrity sha512-rRYECOTh5V3iWsrOzXi7h1jp3Bi9OkJHrb3wECi3DVqMGTilo9wAYmCbT+6cGdrzUY3MWcAa2mESM6FMik6tVw== - dependencies: - "@typescript-eslint/utils" "5.54.0" - -"@typescript-eslint/parser@^5.5.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz" - integrity sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ== - dependencies: - "@typescript-eslint/scope-manager" "5.54.0" - "@typescript-eslint/types" "5.54.0" - "@typescript-eslint/typescript-estree" "5.54.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.54.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz" - integrity sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg== - dependencies: - "@typescript-eslint/types" "5.54.0" - "@typescript-eslint/visitor-keys" "5.54.0" - -"@typescript-eslint/type-utils@5.54.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz" - integrity sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ== - dependencies: - "@typescript-eslint/typescript-estree" "5.54.0" - "@typescript-eslint/utils" "5.54.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.54.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz" - integrity sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ== - -"@typescript-eslint/typescript-estree@5.54.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz" - integrity sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ== - dependencies: - "@typescript-eslint/types" "5.54.0" - "@typescript-eslint/visitor-keys" "5.54.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.54.0", "@typescript-eslint/utils@^5.43.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz" - integrity sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.54.0" - "@typescript-eslint/types" "5.54.0" - "@typescript-eslint/typescript-estree" "5.54.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.54.0": - version "5.54.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz" - integrity sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA== - dependencies: - "@typescript-eslint/types" "5.54.0" - eslint-visitor-keys "^3.3.0" - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@wry/context@^0.6.0": - version "0.6.1" - resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz" - integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== - dependencies: - tslib "^2.3.0" - -"@wry/context@^0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@wry/context/-/context-0.7.0.tgz" - integrity sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.0": - version "0.5.2" - resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.2.tgz" - integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.3.0": - version "0.3.1" - resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.1.tgz" - integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== - dependencies: - tslib "^2.3.0" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -ace-builds@^1.6.0: - version "1.8.1" - resolved "https://registry.npmjs.org/ace-builds/-/ace-builds-1.8.1.tgz" - integrity sha512-wjEQ4khMQYg9FfdEDoOtqdoHwcwFL48H0VB3te5b5A3eqHwxsTw8IX6+xzfisgborIb8dYU+1y9tcmtGFrCPIg== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-node@^1.8.2: - version "1.8.2" - resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0, acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.0.0, acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -adjust-sourcemap-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" - integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -antd@^4.24.8: - version "4.24.8" - resolved "https://registry.npmjs.org/antd/-/antd-4.24.8.tgz" - integrity sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA== - dependencies: - "@ant-design/colors" "^6.0.0" - "@ant-design/icons" "^4.7.0" - "@ant-design/react-slick" "~0.29.1" - "@babel/runtime" "^7.18.3" - "@ctrl/tinycolor" "^3.4.0" - classnames "^2.2.6" - copy-to-clipboard "^3.2.0" - lodash "^4.17.21" - moment "^2.29.2" - rc-cascader "~3.7.0" - rc-checkbox "~2.3.0" - rc-collapse "~3.4.2" - rc-dialog "~9.0.2" - rc-drawer "~6.1.0" - rc-dropdown "~4.0.0" - rc-field-form "~1.27.0" - rc-image "~5.13.0" - rc-input "~0.1.4" - rc-input-number "~7.3.9" - rc-mentions "~1.13.1" - rc-menu "~9.8.0" - rc-motion "^2.6.1" - rc-notification "~4.6.0" - rc-pagination "~3.2.0" - rc-picker "~2.7.0" - rc-progress "~3.4.1" - rc-rate "~2.9.0" - rc-resize-observer "^1.2.0" - rc-segmented "~2.1.0" - rc-select "~14.1.13" - rc-slider "~10.0.0" - rc-steps "~5.0.0-alpha.2" - rc-switch "~3.2.0" - rc-table "~7.26.0" - rc-tabs "~12.5.6" - rc-textarea "~0.4.5" - rc-tooltip "~5.2.0" - rc-tree "~5.7.0" - rc-tree-select "~5.5.0" - rc-trigger "^5.2.10" - rc-upload "~4.3.0" - rc-util "^5.22.5" - scroll-into-view-if-needed "^2.2.25" - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -apollo-link-logger@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/apollo-link-logger/-/apollo-link-logger-2.0.1.tgz" - integrity sha512-4KkdwCqWtlOc0vx0W/5o+UfotyZtcJZicraKNyo2KTaCmAGSJ8vDnNRyDlv6o5XtSgdv4NA36cSe6dt49OkGWA== - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz" - integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== - -aria-query@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-validator@^4.1.0: - version "4.2.5" - resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" - integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== - -async@^3.2.0, async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.13: - version "10.4.13" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== - dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axe-core@^4.6.2: - version "4.6.3" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" - integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== - -axios@^1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" - integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" - -babel-jest@^27.4.2, babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-loader@^8.2.3: - version "8.3.0" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-plugin-named-asset-import@^0.3.8: - version "0.3.8" - resolved "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz" - integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== - -babel-plugin-polyfill-corejs2@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz" - integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.2" - semver "^6.1.1" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.5.2: - version "0.5.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz" - integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.2" - core-js-compat "^3.21.0" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -babel-plugin-preval@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-5.1.0.tgz" - integrity sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg== - dependencies: - "@babel/runtime" "^7.12.5" - "@types/babel__core" "^7.1.12" - babel-plugin-macros "^3.0.1" - require-from-string "^2.0.2" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== - -babel-plugin-transform-react-remove-prop-types@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" - integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-react-app@^10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" - integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== - dependencies: - "@babel/core" "^7.16.0" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-decorators" "^7.16.4" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-transform-flow-strip-types" "^7.16.0" - "@babel/plugin-transform-react-display-name" "^7.16.0" - "@babel/plugin-transform-runtime" "^7.16.4" - "@babel/preset-env" "^7.16.4" - "@babel/preset-react" "^7.16.0" - "@babel/preset-typescript" "^7.16.0" - "@babel/runtime" "^7.16.3" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-react-remove-prop-types "^0.4.24" - -babel-runtime@6.x, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -backo2@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz" - integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-arraybuffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz" - integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bfj@^7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz" - integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== - dependencies: - bluebird "^3.5.5" - check-types "^11.1.1" - hoopy "^0.1.4" - tryer "^1.0.1" - -big-integer@^1.6.16: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -bloom-filters@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bloom-filters/-/bloom-filters-3.0.0.tgz" - integrity sha512-DBDgLkYokKS5NA5y8P9fuTavKQCkleAP39yqpW/5Nab/vwzHv+wOPRM/yDAStghARDleyRI4orW91uuxj48LKQ== - dependencies: - base64-arraybuffer "^1.0.2" - is-buffer "^2.0.5" - lodash "^4.17.15" - lodash.eq "^4.0.0" - lodash.indexof "^4.0.5" - long "^5.2.0" - reflect-metadata "^0.1.13" - seedrandom "^3.0.5" - xxhashjs "^0.2.2" - -bluebird@^3.5.5, bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.0" - resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz" - integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -broadcast-channel@^3.1.0: - version "3.7.0" - resolved "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.21.2, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-modules@^3.1.0: - version "3.3.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0, camelcase@^6.2.1: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" - integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0: - version "1.0.30001370" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz" - integrity sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g== - -caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: - version "1.0.30001458" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz" - integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== - -case-sensitive-paths-webpack-plugin@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -chalk@^2.0.0, chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -char-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz" - integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== - -check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" - integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== - -check-types@^11.1.1: - version "11.1.2" - resolved "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz" - integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== - -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -classnames@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-table3@~0.6.1: - version "0.6.2" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" - integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clsx@^1.0.4, clsx@^1.1.1, clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -cluster-key-slot@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz" - integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10, colorette@^2.0.16: - version "2.0.19" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@2, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-scroll-into-view@^1.0.17: - version "1.0.17" - resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz" - integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -confusing-browser-globals@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@^0.4.0: - version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - -copy-to-clipboard@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== - dependencies: - toggle-selection "^1.0.6" - -core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.24.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.0.tgz" - integrity sha512-F+2E63X3ff/nj8uIrf8Rf24UDGIz7p838+xjEp+Bx3y8OWXj+VTPPZNCtdqovPaS9o7Tka5mCH01Zn5vOd6UQg== - dependencies: - browserslist "^4.21.2" - semver "7.0.0" - -core-js-compat@^3.25.1: - version "3.29.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.0.tgz" - integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== - dependencies: - browserslist "^4.21.5" - -core-js-pure@^3.23.3: - version "3.29.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.0.tgz" - integrity sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ== - -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.19.2: - version "3.29.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz" - integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig-typescript-loader@^1.0.0: - version "1.0.9" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz" - integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== - dependencies: - cosmiconfig "^7" - ts-node "^10.7.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -craco-less@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/craco-less/-/craco-less-2.0.0.tgz" - integrity sha512-980mQaZVrC4ZsvOwvud6/AgvW7fLY3mW5m5+gR4sw4krxszgHb+qoRyOjqsYPD0F4oUmQoSiZSrlYY/bFGD9kQ== - dependencies: - less "^4.1.1" - less-loader "^7.3.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-blank-pseudo@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" - integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== - dependencies: - postcss-selector-parser "^6.0.9" - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-declaration-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz" - integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== - -css-has-pseudo@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" - integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== - dependencies: - postcss-selector-parser "^6.0.9" - -css-loader@^6.5.1: - version "6.7.3" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.19" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^3.2.0: - version "3.4.1" - resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== - dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-prefers-color-scheme@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" - integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-to-react-native@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz" - integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-unit-converter@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz" - integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssdb@^7.1.0: - version "7.4.1" - resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.4.1.tgz" - integrity sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.6: - version "5.1.15" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.0.2, csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== - -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz" - integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== - -cypress@^10.3.1: - version "10.11.0" - resolved "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz" - integrity sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA== - dependencies: - "@cypress/request" "^2.88.10" - "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" - "@types/sinonjs__fake-timers" "8.1.1" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - buffer "^5.6.0" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" - commander "^5.1.0" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.2" - enquirer "^2.3.6" - eventemitter2 "6.4.7" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.0" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.6" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - proxy-from-env "1.0.0" - request-progress "^3.0.0" - semver "^7.3.2" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - yauzl "^2.10.0" - -"d3-array@2 - 3", "d3-array@2.10.0 - 3": - version "3.2.0" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz" - integrity sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g== - dependencies: - internmap "1 - 2" - -d3-array@^1.2.0: - version "1.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -d3-array@^3.1.6: - version "3.2.2" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz" - integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ== - dependencies: - internmap "1 - 2" - -"d3-color@1 - 3": - version "3.1.0" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-ease@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" - integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== - -"d3-format@1 - 3": - version "3.1.0" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -"d3-path@1 - 3": - version "3.0.1" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz" - integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== - -d3-polygon@^1.0.3: - version "1.0.6" - resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz" - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== - -d3-scale@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -d3-shape@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz" - integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== - dependencies: - d3-path "1 - 3" - -"d3-time-format@2 - 4": - version "4.1.0" - resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3": - version "3.0.0" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz" - integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== - dependencies: - d3-array "2 - 3" - -d3-time@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" - integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== - dependencies: - d3-array "2 - 3" - -d3-timer@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -date-arithmetic@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz" - integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== - -date-fns@2.x: - version "2.29.1" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.1.tgz" - integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw== - -dayjs@1.x, dayjs@^1.10.4: - version "1.11.4" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz" - integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g== - -dayjs@^1.11.7: - version "1.11.7" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== - -debug@2.6.9, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decimal.js-light@^2.4.1: - version "2.5.1" - resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -decode-uri-component@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-diff@^0.3.5: - version "0.3.8" - resolved "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz" - integrity sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug== - -deep-eql@~3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-equal@^2.0.5: - version "2.2.0" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" - integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== - dependencies: - call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" - is-arguments "^1.1.1" - is-array-buffer "^3.0.1" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -defined@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -denque@^1.1.0: - version "1.5.1" - resolved "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz" - integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detective@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" - integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== - dependencies: - acorn-node "^1.8.2" - defined "^1.0.0" - minimist "^1.2.6" - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dinero.js@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/dinero.js/-/dinero.js-1.9.1.tgz" - integrity sha512-1HXiF2vv3ZeRQ23yr+9lFxj/PbZqutuYWJnE0qfCB9xYBPnuaJ8lXtli1cJM0TvUXW1JTOaePldmqN5JVNxKSA== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-accessibility-api@^0.5.9: - version "0.5.14" - resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz" - integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== - -dom-align@^1.7.0: - version "1.12.3" - resolved "https://registry.npmjs.org/dom-align/-/dom-align-1.12.3.tgz" - integrity sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA== - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-helpers@^3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - -dom-helpers@^5.1.3, dom-helpers@^5.2.0, dom-helpers@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -dotenv@^16.0.1: - version "16.0.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz" - integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -earcut@^2.1.1: - version "2.2.4" - resolved "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz" - integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ejs@^3.1.5, ejs@^3.1.6: - version "3.1.8" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.4.284: - version "1.4.315" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz" - integrity sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg== - -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-client@~6.4.0: - version "6.4.0" - resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz" - integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.0.3: - version "5.0.4" - resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz" - integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== - -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enquire-js@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/enquire-js/-/enquire-js-0.2.1.tgz" - integrity sha512-4vbcWD0ncK6VQ5M5giOImQb2hFPrKDZH5U+uRX9S6e9vfC6Q5PX6A38PVS6RMnCdr/luDTtJjjLuJinH/+a+Lw== - dependencies: - enquire.js "^2.1.6" - -enquire.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz" - integrity sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw== - -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -env-cmd@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz" - integrity sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA== - dependencies: - commander "^4.0.0" - cross-spawn "^7.0.0" - -errno@^0.1.1: - version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.20.1, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-get-iterator@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-react-app@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz" - integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== - dependencies: - "@babel/core" "^7.16.0" - "@babel/eslint-parser" "^7.16.3" - "@rushstack/eslint-patch" "^1.1.0" - "@typescript-eslint/eslint-plugin" "^5.5.0" - "@typescript-eslint/parser" "^5.5.0" - babel-preset-react-app "^10.0.1" - confusing-browser-globals "^1.0.11" - eslint-plugin-flowtype "^8.0.3" - eslint-plugin-import "^2.25.3" - eslint-plugin-jest "^25.3.0" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-react "^7.27.1" - eslint-plugin-react-hooks "^4.3.0" - eslint-plugin-testing-library "^5.0.1" - -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== - dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" - -eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-cypress@^2.12.1: - version "2.12.1" - resolved "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz" - integrity sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA== - dependencies: - globals "^11.12.0" - -eslint-plugin-flowtype@^8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz" - integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== - dependencies: - lodash "^4.17.21" - string-natural-compare "^3.0.1" - -eslint-plugin-import@^2.25.3: - version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jest@^25.3.0: - version "25.7.0" - resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" - integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== - dependencies: - "@typescript-eslint/experimental-utils" "^5.0.0" - -eslint-plugin-jsx-a11y@^6.5.1: - version "6.7.1" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-react-hooks@^4.3.0: - version "4.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.27.1: - version "7.32.2" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" - prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" - -eslint-plugin-testing-library@^5.0.1: - version "5.10.2" - resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.2.tgz" - integrity sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw== - dependencies: - "@typescript-eslint/utils" "^5.43.0" - -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint-webpack-plugin@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== - dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - -eslint@^8.3.0: - version "8.35.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz" - integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== - dependencies: - "@eslint/eslintrc" "^2.0.0" - "@eslint/js" "8.35.0" - "@humanwhocodes/config-array" "^0.11.8" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz" - integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter2@6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - -eventemitter3@^4.0.0, eventemitter3@^4.0.1: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -eventsource@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz" - integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== - -execa@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -exenv@^1.2.0: - version "1.2.2" - resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz" - integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== - -exifr@^7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz" - integrity sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw== - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-equals@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz" - integrity sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w== - -fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@0.11.4, faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filelist@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -firebase@^9.17.1: - version "9.17.1" - resolved "https://registry.npmjs.org/firebase/-/firebase-9.17.1.tgz" - integrity sha512-MSZaTRaaRLgDFLqoEnoPYK8zkLwQNvYeLZ3YSKdcQxG8hDifNO22ywS1cSA1ZCGHlQeOsDtfDwBejKcANf/RQw== - dependencies: - "@firebase/analytics" "0.9.3" - "@firebase/analytics-compat" "0.2.3" - "@firebase/app" "0.9.3" - "@firebase/app-check" "0.6.3" - "@firebase/app-check-compat" "0.3.3" - "@firebase/app-compat" "0.2.3" - "@firebase/app-types" "0.9.0" - "@firebase/auth" "0.21.3" - "@firebase/auth-compat" "0.3.3" - "@firebase/database" "0.14.3" - "@firebase/database-compat" "0.3.3" - "@firebase/firestore" "3.8.3" - "@firebase/firestore-compat" "0.3.3" - "@firebase/functions" "0.9.3" - "@firebase/functions-compat" "0.3.3" - "@firebase/installations" "0.6.3" - "@firebase/installations-compat" "0.2.3" - "@firebase/messaging" "0.12.3" - "@firebase/messaging-compat" "0.2.3" - "@firebase/performance" "0.6.3" - "@firebase/performance-compat" "0.2.3" - "@firebase/remote-config" "0.4.3" - "@firebase/remote-config-compat" "0.2.3" - "@firebase/storage" "0.11.1" - "@firebase/storage-compat" "0.3.1" - "@firebase/util" "1.9.2" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -flubber@^0.4.2: - version "0.4.2" - resolved "https://registry.npmjs.org/flubber/-/flubber-0.4.2.tgz" - integrity sha512-79RkJe3rA4nvRCVc2uXjj7U/BAUq84TS3KHn6c0Hr9K64vhj83ZNLUziNx4pJoBumSPhOl5VjH+Z0uhi+eE8Uw== - dependencies: - d3-array "^1.2.0" - d3-polygon "^1.0.3" - earcut "^2.1.1" - svg-path-properties "^0.2.1" - svgpath "^2.2.1" - topojson-client "^3.0.0" - -follow-redirects@^1.0.0, follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.2" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz" - integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" - integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globalize@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/globalize/-/globalize-0.1.1.tgz" - integrity sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA== - -globals@^11.1.0, globals@^11.12.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql@^16.6.0: - version "16.6.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" - integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.14.1" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -i18next-browser-languagedetector@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz" - integrity sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g== - dependencies: - "@babel/runtime" "^7.19.4" - -i18next@^22.4.10: - version "22.4.10" - resolved "https://registry.npmjs.org/i18next/-/i18next-22.4.10.tgz" - integrity sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA== - dependencies: - "@babel/runtime" "^7.20.6" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -idb@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz" - integrity sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg== - -idb@^6.1.4: - version "6.1.5" - resolved "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz" - integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== - -idb@^7.0.1: - version "7.1.1" - resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" - integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== - -identity-obj-proxy@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" - integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== - dependencies: - harmony-reflect "^1.4.6" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" - integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== - -immer@^9.0.7: - version "9.0.19" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz" - integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== - -immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -internal-slot@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ioredis@^4.28.0: - version "4.28.5" - resolved "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz" - integrity sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A== - dependencies: - cluster-key-slot "^1.1.0" - debug "^4.3.1" - denque "^1.1.0" - lodash.defaults "^4.2.0" - lodash.flatten "^4.4.0" - lodash.isarguments "^3.1.0" - p-map "^2.1.0" - redis-commands "1.7.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" - standard-as-callback "^2.1.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-callable@^1.1.4: - version "1.2.4" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-path-inside@^3.0.2, is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4: - version "5.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterall@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" - integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== - -jake@^10.8.5: - version "10.8.5" - resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" - -javascript-natural-sort@^0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-regex-util@^28.0.0: - version "28.0.2" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.4.2, jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watch-typeahead@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz" - integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== - dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" - jest-regex-util "^28.0.0" - jest-watcher "^28.0.0" - slash "^4.0.0" - string-length "^5.0.1" - strip-ansi "^7.0.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-watcher@^28.0.0: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== - dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" - -jest-worker@^26.2.1: - version "26.6.2" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.4.3: - version "27.5.1" - resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== - dependencies: - "@jest/core" "^27.5.1" - import-local "^3.0.2" - jest-cli "^27.5.1" - -jmespath@^0.16.0: - version "0.16.0" - resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz" - integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== - -js-sdsl@^4.1.4: - version "4.3.0" - resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz" - integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0, json-schema@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz" - integrity sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz" - integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== - dependencies: - string-convert "^0.2.0" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -json5@^2.2.0, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsoneditor@^9.9.0: - version "9.9.0" - resolved "https://registry.npmjs.org/jsoneditor/-/jsoneditor-9.9.0.tgz" - integrity sha512-NHJhyaqcc5U33ah6dEcd0S9b14Auocpe9nydvC9ui7Uq/vjEFnsd7ot6O9Jqwv53B7DmHFUWq5cT4qeWh4MEoA== - dependencies: - ace-builds "^1.6.0" - ajv "^6.12.6" - javascript-natural-sort "^0.7.1" - jmespath "^0.16.0" - json-source-map "^0.6.1" - jsonrepair "^2.2.1" - mobius1-selectr "^2.4.13" - picomodal "^3.0.0" - vanilla-picker "^2.12.1" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonpointer@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== - -jsonrepair@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/jsonrepair/-/jsonrepair-2.2.1.tgz" - integrity sha512-o9Je8TceILo872uQC9fIBJm957j1Io7z8Ca1iWIqY6S5S65HGE9XN7XEEw7+tUviB9Vq4sygV89MVTxl+rhZyg== - -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jsreport-browser-client-dist@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/jsreport-browser-client-dist/-/jsreport-browser-client-dist-1.3.0.tgz" - integrity sha512-E83cVmxQ5np3rxns6dhFu15m5kZ5yXJDIyfbHjLPxO0AZXVQOuMrdvYsUCj+j/ZSaiROoBCstZRO7pa4HmZNGw== - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.2" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz" - integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== - dependencies: - array-includes "^3.1.5" - object.assign "^4.1.2" - -jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== - dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.4: - version "2.0.5" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -klona@^2.0.5: - version "2.0.6" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" - integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== - -less-loader@^7.3.0: - version "7.3.0" - resolved "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz" - integrity sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -less@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" - integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^3.1.0" - source-map "~0.6.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -libphonenumber-js@^1.10.21: - version "1.10.21" - resolved "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.21.tgz" - integrity sha512-/udZhx49av2r2gZR/+xXSrwcR8smX/sDNrVpOFrvW+CA26TfYTVZfwb3MIDvmwAYMLs7pXuJjZX0VxxGpqPhsA== - -lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash-es@^4.17.15, lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" - integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== - -lodash.eq@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/lodash.eq/-/lodash.eq-4.0.0.tgz" - integrity sha512-vbrJpXL6kQNG6TkInxX12DZRfuYVllSxhwYqjYB78g2zF3UI15nFO/0AgmZnZRnaQ38sZtjCiVjGr2rnKt4v0g== - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - -lodash.indexof@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/lodash.indexof/-/lodash.indexof-4.0.5.tgz" - integrity sha512-t9wLWMQsawdVmf6/IcAgVGqAJkNzYVcn4BHYZKTPW//l7N5Oq7Bq138BaVk19agcsPZePcidSgTTw4NqS1nUAw== - -lodash.isarguments@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz" - integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -logrocket@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/logrocket/-/logrocket-3.0.1.tgz" - integrity sha512-jOWG+jEzobKVxGytzZ+4KGm2kiMQMRTHab2uDWQyVZcHfEF38BlCH1yjQVY4LCmuQUwZitP9biMzJZnyUQ0dtQ== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/long/-/long-5.2.0.tgz" - integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== - -long@^5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/long/-/long-5.2.1.tgz" - integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -luxon@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz" - integrity sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg== - -lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz" - integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== - -magic-string@^0.25.0, magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markerjs2@^2.28.1: - version "2.28.1" - resolved "https://registry.npmjs.org/markerjs2/-/markerjs2-2.28.1.tgz" - integrity sha512-Hx1JixKfkP0hCKhl1qfNuP90Z9MVjHKAjMRo2xyU3fZVQuwaHO2qx1u8NqCeRqA/QuZqBlsU+FLdNkoazgsiSQ== - -material-colors@^1.2.1: - version "1.2.6" - resolved "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz" - integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.4.13" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz" - integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== - dependencies: - fs-monkey "^1.0.3" - -memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mini-create-react-context@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz" - integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== - dependencies: - "@babel/runtime" "^7.12.1" - tiny-warning "^1.0.3" - -mini-css-extract-plugin@^2.4.5: - version "2.7.2" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz" - integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mobius1-selectr@^2.4.13: - version "2.4.13" - resolved "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz" - integrity sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw== - -moment-business-days@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/moment-business-days/-/moment-business-days-1.2.0.tgz" - integrity sha512-QJlceLfMSxy/jZSOgJYCKeKw+qGYHj8W0jMa/fYruyoJ85+bJuLRiYv5DIaflyuRipmYRfD4kDlSwVYteLN+Jw== - -moment-timezone@^0.5.40, moment-timezone@^0.5.41: - version "0.5.41" - resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.41.tgz" - integrity sha512-e0jGNZDOHfBXJGz8vR/sIMXvBIGJJcqFjmlg9lmE+5KX1U7/RZNMswfD8nKnNCnQdKTIj50IaRKwl1fvMLyyRg== - dependencies: - moment "^2.29.4" - -moment@^2.24.0, moment@^2.29.2, moment@^2.29.4: - version "2.29.4" - resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" - -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -needle@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz" - integrity sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.6.3" - sax "^1.2.4" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@2.6.7, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -normalize-url@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz" - integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== - -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.12.2: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.assign@^4.1.3, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.4" - resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== - dependencies: - array.prototype.reduce "^1.0.4" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.1" - -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== - dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.0, object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^7.3.1: - version "7.4.2" - resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== - dependencies: - "@wry/context" "^0.6.0" - "@wry/trie" "^0.3.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" - integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -phone@^3.1.35: - version "3.1.35" - resolved "https://registry.npmjs.org/phone/-/phone-3.1.35.tgz" - integrity sha512-OEF2yXxJ2kTzMECk+ymbAmbYuucBNIMeYcqsiZD5Kz2QrRAP2BOEuerqalaC/chkAHLH3MXWKRK3qu07AvlRuQ== - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomodal@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz" - integrity sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw== - -pify@^2.2.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -postcss-attribute-case-insensitive@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" - integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-browser-comments@^4: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz" - integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-clamp@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" - integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-functional-notation@^4.2.4: - version "4.2.4" - resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-hex-alpha@^8.0.4: - version "8.0.4" - resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" - integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-rebeccapurple@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" - integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-custom-media@^8.0.2: - version "8.0.2" - resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" - integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-properties@^12.1.10: - version "12.1.11" - resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" - integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-selectors@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" - integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-dir-pseudo-class@^6.0.5: - version "6.0.5" - resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" - integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-double-position-gradients@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" - integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-env-function@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" - integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-flexbugs-fixes@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz" - integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== - -postcss-focus-visible@^6.0.4: - version "6.0.4" - resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" - integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-focus-within@^5.0.4: - version "5.0.4" - resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" - integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-font-variant@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" - integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== - -postcss-gap-properties@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" - integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== - -postcss-image-set-function@^4.0.7: - version "4.0.7" - resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" - integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-initial@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" - integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== - -postcss-js@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-lab-function@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" - integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-loader@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-logical@^5.0.4: - version "5.0.4" - resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" - integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== - -postcss-media-minmax@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz" - integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-nesting@^10.2.0: - version "10.2.0" - resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" - integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize@^10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz" - integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== - dependencies: - "@csstools/normalize.css" "*" - postcss-browser-comments "^4" - sanitize.css "*" - -postcss-opacity-percentage@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" - integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-overflow-shorthand@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" - integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-page-break@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" - integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== - -postcss-place@^7.0.5: - version "7.0.5" - resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" - integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-preset-env@^7.0.1: - version "7.8.3" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" - integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== - dependencies: - "@csstools/postcss-cascade-layers" "^1.1.1" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" - autoprefixer "^10.4.13" - browserslist "^4.21.4" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.1.0" - postcss-attribute-case-insensitive "^5.0.2" - postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.10" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" - postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.2.0" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" - postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-pseudo-class-any-link@^7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" - integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-replace-overflow-wrap@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" - integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== - -postcss-selector-not@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" - integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^7.0.35: - version "7.0.39" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.0.9, postcss@^8.3.5, postcss@^8.4.19, postcss@^8.4.4: - version "8.4.21" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-format@^27.0.2, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -preval.macro@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz" - integrity sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ== - dependencies: - babel-plugin-preval "^5.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz" - integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1, prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -protobufjs@^6.11.3: - version "6.11.3" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz" - integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -protobufjs@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz" - integrity sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^5.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -psl@^1.1.28, psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz" - integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== - dependencies: - decode-uri-component "^0.2.2" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -raf@3.x, raf@^3.3.0, raf@^3.4.1, raf@~3.4.0: - version "3.4.1" - resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc-align@^4.0.0: - version "4.0.12" - resolved "https://registry.npmjs.org/rc-align/-/rc-align-4.0.12.tgz" - integrity sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - dom-align "^1.7.0" - lodash "^4.17.21" - rc-util "^5.3.0" - resize-observer-polyfill "^1.5.1" - -rc-cascader@~3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz" - integrity sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A== - dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - classnames "^2.3.1" - rc-select "~14.1.0" - rc-tree "~5.7.0" - rc-util "^5.6.1" - -rc-checkbox@~2.3.0: - version "2.3.2" - resolved "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz" - integrity sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - -rc-collapse@~3.4.2: - version "3.4.2" - resolved "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz" - integrity sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.3.4" - rc-util "^5.2.1" - shallowequal "^1.1.0" - -rc-dialog@~9.0.0, rc-dialog@~9.0.2: - version "9.0.2" - resolved "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz" - integrity sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/portal" "^1.0.0-8" - classnames "^2.2.6" - rc-motion "^2.3.0" - rc-util "^5.21.0" - -rc-drawer@~6.1.0: - version "6.1.3" - resolved "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.3.tgz" - integrity sha512-AvHisO90A+xMLMKBw2zs89HxjWxusM2BUABlgK60RhweIHF8W/wk0hSOrxBlUXoA9r1F+10na3g6GZ97y1qDZA== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/portal" "^1.0.0-6" - classnames "^2.2.6" - rc-motion "^2.6.1" - rc-util "^5.21.2" - -rc-dropdown@~4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz" - integrity sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g== - dependencies: - "@babel/runtime" "^7.18.3" - classnames "^2.2.6" - rc-trigger "^5.3.1" - rc-util "^5.17.0" - -rc-field-form@~1.27.0: - version "1.27.1" - resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.1.tgz" - integrity sha512-RShegnwFu6TH8tl2olCxn+B4Wyh5EiQH8c/7wucbkLNyue05YiH5gomUAg1vbZjp71yFKwegClctsEG5CNBWAA== - dependencies: - "@babel/runtime" "^7.18.0" - async-validator "^4.1.0" - rc-util "^5.8.0" - -rc-image@~5.13.0: - version "5.13.0" - resolved "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz" - integrity sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/portal" "^1.0.2" - classnames "^2.2.6" - rc-dialog "~9.0.0" - rc-motion "^2.6.2" - rc-util "^5.0.6" - -rc-input-number@~7.3.9: - version "7.3.11" - resolved "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz" - integrity sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.23.0" - -rc-input@~0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz" - integrity sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.18.1" - -rc-mentions@~1.13.1: - version "1.13.1" - resolved "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz" - integrity sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-menu "~9.8.0" - rc-textarea "^0.4.0" - rc-trigger "^5.0.4" - rc-util "^5.22.5" - -rc-menu@~9.8.0: - version "9.8.2" - resolved "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz" - integrity sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.4.3" - rc-overflow "^1.2.8" - rc-trigger "^5.1.2" - rc-util "^5.27.0" - -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1: - version "2.6.2" - resolved "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.2.tgz" - integrity sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.21.0" - -rc-motion@^2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz" - integrity sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.21.0" - -rc-notification@~4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.0.tgz" - integrity sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.2.0" - rc-util "^5.20.1" - -rc-overflow@^1.0.0: - version "1.2.6" - resolved "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.6.tgz" - integrity sha512-YqbocgzuQxfq2wZy72vdAgrgzzEuM/5d4gF9TBEodCpXPbUeXGrUXNm1J6G1MSkCU2N0ePIgCEu5qD/0Ldi63Q== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.19.2" - -rc-overflow@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz" - integrity sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.19.2" - -rc-pagination@~3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz" - integrity sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - -rc-picker@~2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.0.tgz" - integrity sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - date-fns "2.x" - dayjs "1.x" - moment "^2.24.0" - rc-trigger "^5.0.4" - rc-util "^5.4.0" - shallowequal "^1.1.0" - -rc-progress@~3.4.1: - version "3.4.1" - resolved "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz" - integrity sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.16.1" - -rc-queue-anim@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/rc-queue-anim/-/rc-queue-anim-2.0.0.tgz" - integrity sha512-tojpP72NbaWkwzmR/7x4gFpTBCYR/8I3Jb+KwSdOWpRIDrlmsA4ARAqSElG92GJ7CXAIjxavIGulcqJhXfzHYQ== - dependencies: - "@babel/runtime" "^7.11.1" - tween-one "^1.0.52" - -rc-rate@~2.9.0: - version "2.9.2" - resolved "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz" - integrity sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.0.1" - -rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz" - integrity sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.15.0" - resize-observer-polyfill "^1.5.1" - -rc-scroll-anim@^2.7.6: - version "2.7.6" - resolved "https://registry.npmjs.org/rc-scroll-anim/-/rc-scroll-anim-2.7.6.tgz" - integrity sha512-VwXJYXjZy9TtH1wcQIG7/yjt/Ay3VEjQl/TITaWzK9O7ujjOXRVOYY/tqKshmBMgaJ2oGeFQNmCN8zTwXguq0g== - dependencies: - babel-runtime "6.x" - prop-types "^15.6.0" - raf "3.x" - rc-tween-one "^2.4.0" - react-lifecycles-compat "^3.0.4" - tween-functions "1.x" - -rc-segmented@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.0.tgz" - integrity sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-motion "^2.4.4" - rc-util "^5.17.0" - -rc-select@~14.1.0: - version "14.1.9" - resolved "https://registry.npmjs.org/rc-select/-/rc-select-14.1.9.tgz" - integrity sha512-DK01+Q7oCWr5jVPiEp/BTQ8xCB4rI4LfXzZtSmBWJhOMuibyZD1Vlz/DlVKCUFmtBM4SzG4/SltGHoGlcbCqiw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.0.0" - rc-trigger "^5.0.4" - rc-util "^5.16.1" - rc-virtual-list "^3.2.0" - -rc-select@~14.1.13: - version "14.1.16" - resolved "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz" - integrity sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.0.0" - rc-trigger "^5.0.4" - rc-util "^5.16.1" - rc-virtual-list "^3.2.0" - -rc-slider@~10.0.0: - version "10.0.1" - resolved "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz" - integrity sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.18.1" - shallowequal "^1.1.0" - -rc-steps@~5.0.0-alpha.2: - version "5.0.0" - resolved "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz" - integrity sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw== - dependencies: - "@babel/runtime" "^7.16.7" - classnames "^2.2.3" - rc-util "^5.16.1" - -rc-switch@~3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz" - integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.0.1" - -rc-table@~7.26.0: - version "7.26.0" - resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz" - integrity sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-resize-observer "^1.1.0" - rc-util "^5.22.5" - shallowequal "^1.1.0" - -rc-tabs@~12.5.6: - version "12.5.7" - resolved "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.7.tgz" - integrity sha512-i9gY2TcwCNmBM+bXCDDTvb6mnRYIDkkNm+UGoIqrLOFnRRbAqjsSf+tgyvzhBvbK8XcSrMhzKKLaOMbGyND8YA== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "2.x" - rc-dropdown "~4.0.0" - rc-menu "~9.8.0" - rc-motion "^2.6.2" - rc-resize-observer "^1.0.0" - rc-util "^5.16.0" - -rc-textarea@^0.4.0, rc-textarea@~0.4.5: - version "0.4.7" - resolved "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz" - integrity sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.24.4" - shallowequal "^1.1.0" - -rc-tooltip@~5.2.0: - version "5.2.2" - resolved "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz" - integrity sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "^2.3.1" - rc-trigger "^5.0.0" - -rc-tree-select@~5.5.0: - version "5.5.5" - resolved "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz" - integrity sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "~14.1.0" - rc-tree "~5.7.0" - rc-util "^5.16.1" - -rc-tree@~5.7.0: - version "5.7.2" - resolved "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.2.tgz" - integrity sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-util "^5.16.1" - rc-virtual-list "^3.4.8" - -rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10, rc-trigger@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.1.tgz" - integrity sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ== - dependencies: - "@babel/runtime" "^7.18.3" - classnames "^2.2.6" - rc-align "^4.0.0" - rc-motion "^2.0.0" - rc-util "^5.19.2" - -rc-tween-one@^1.2.5: - version "1.8.1" - resolved "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-1.8.1.tgz" - integrity sha512-Avg8EXHdt6ABV9WnmTmh6zEaAzUvl4bFZKbP3y6BE8UGBGp1qUhlIgCB83gL+5eA0VECdM/b9PsEBRrcxzSpGw== - dependencies: - babel-runtime "6.x" - deep-eql "~3.0.1" - prop-types "^15.6.1" - raf "~3.4.0" - style-utils "~0.1.13" - tween-functions "~1.2.0" - -rc-tween-one@^2.4.0: - version "2.7.3" - resolved "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-2.7.3.tgz" - integrity sha512-n4OPRLO6VMZHj61unq5KKxHMMfBz52bxob94fN3U5M9GqFg3H+T3TXnpHPnAK+cq/xBGo70ik2vB4Fpjo/txcA== - dependencies: - babel-runtime "6.x" - prop-types "^15.6.1" - raf "~3.4.0" - react-lifecycles-compat "^3.0.4" - style-utils "~0.2.0" - tween-functions "~1.2.0" - -rc-upload@~4.3.0: - version "4.3.4" - resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz" - integrity sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ== - dependencies: - "@babel/runtime" "^7.18.3" - classnames "^2.2.5" - rc-util "^5.2.0" - -rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.23.0, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.6.1, rc-util@^5.8.0, rc-util@^5.9.4: - version "5.23.0" - resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.23.0.tgz" - integrity sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg== - dependencies: - "@babel/runtime" "^7.18.3" - react-is "^16.12.0" - shallowequal "^1.1.0" - -rc-util@^5.16.0, rc-util@^5.24.4, rc-util@^5.27.0: - version "5.28.0" - resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz" - integrity sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA== - dependencies: - "@babel/runtime" "^7.18.3" - react-is "^16.12.0" - -rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.8: - version "3.4.8" - resolved "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.8.tgz" - integrity sha512-qSN+Rv4i/E7RCTvTMr1uZo7f3crJJg/5DekoCagydo9zsXrxj07zsFSxqizqW+ldGA16lwa8So/bIbV9Ofjddg== - dependencies: - classnames "^2.2.6" - rc-resize-observer "^1.0.0" - rc-util "^5.15.0" - -react-app-polyfill@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz" - integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== - dependencies: - core-js "^3.19.2" - object-assign "^4.1.1" - promise "^8.1.0" - raf "^3.4.1" - regenerator-runtime "^0.13.9" - whatwg-fetch "^3.6.2" - -react-beautiful-dnd@^13.0.0: - version "13.1.0" - resolved "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz" - integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-big-calendar@^1.6.8: - version "1.6.8" - resolved "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.6.8.tgz" - integrity sha512-uDuHoqH5/Wnk3tBxXnrXQD5w9FEofd1Ch1vMpLuv2LRBqrF2u7FcIruc80urizrkxcDWrTGxa7bsr0a9bby4Mw== - dependencies: - "@babel/runtime" "^7.20.7" - clsx "^1.2.1" - date-arithmetic "^4.1.0" - dayjs "^1.11.7" - dom-helpers "^5.2.1" - globalize "^0.1.1" - invariant "^2.2.4" - lodash "^4.17.21" - lodash-es "^4.17.21" - luxon "^3.2.1" - memoize-one "^6.0.0" - moment "^2.29.4" - moment-timezone "^0.5.40" - prop-types "^15.8.1" - react-overlays "^5.2.1" - uncontrollable "^7.2.1" - -react-color@^2.19.3: - version "2.19.3" - resolved "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz" - integrity sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA== - dependencies: - "@icons/material" "^0.2.4" - lodash "^4.17.15" - lodash-es "^4.17.15" - material-colors "^1.2.1" - prop-types "^15.5.10" - reactcss "^1.2.0" - tinycolor2 "^1.4.1" - -react-cookie@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz" - integrity sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A== - dependencies: - "@types/hoist-non-react-statics" "^3.0.1" - hoist-non-react-statics "^3.0.0" - universal-cookie "^4.0.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-drag-listview@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/react-drag-listview/-/react-drag-listview-0.2.1.tgz" - integrity sha512-LFR/14CpmiieITCywfe2rxAg1szAqsynpqgquSgirT9cansDwJdpqAVEjzIRSEql/DRIYTvBYLvMI/HJcVeU4w== - dependencies: - babel-runtime "^6.26.0" - prop-types "^15.5.8" - -react-draggable@^4.0.0, react-draggable@^4.0.3: - version "4.4.5" - resolved "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz" - integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== - dependencies: - clsx "^1.1.1" - prop-types "^15.8.1" - -react-error-overlay@6.0.11: - version "6.0.11" - resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-error-overlay@6.0.9, react-error-overlay@^6.0.11: - version "6.0.9" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" - integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== - -react-grid-gallery@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/react-grid-gallery/-/react-grid-gallery-1.0.0.tgz" - integrity sha512-S1gr6WXBlPFVrE0x2BHuu7jhyaB61mabcMQyx+8KCgAyKzGza0WF67AfAnS9Q00aurFEq4IP8eqb2Bk5F4RAmQ== - -react-grid-layout@^1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.3.4.tgz" - integrity sha512-sB3rNhorW77HUdOjB4JkelZTdJGQKuXLl3gNg+BI8gJkTScspL1myfZzW/EM0dLEn+1eH+xW+wNqk0oIM9o7cw== - dependencies: - clsx "^1.1.1" - lodash.isequal "^4.0.0" - prop-types "^15.8.1" - react-draggable "^4.0.0" - react-resizable "^3.0.4" - -react-i18next@^12.2.0: - version "12.2.0" - resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-12.2.0.tgz" - integrity sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ== - dependencies: - "@babel/runtime" "^7.20.6" - html-parse-stringify "^3.0.1" - -react-icons@^4.7.1: - version "4.7.1" - resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.7.1.tgz" - integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw== - -react-image-lightbox@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/react-image-lightbox/-/react-image-lightbox-5.1.4.tgz" - integrity sha512-kTiAODz091bgT7SlWNHab0LSMZAPJtlNWDGKv7pLlLY1krmf7FuG1zxE0wyPpeA8gPdwfr3cu6sPwZRqWsc3Eg== - dependencies: - prop-types "^15.7.2" - react-modal "^3.11.1" - -react-intersection-observer@^9.4.3: - version "9.4.3" - resolved "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz" - integrity sha512-WNRqMQvKpupr6MzecAQI0Pj0+JQong307knLP4g/nBex7kYfIaZsPpXaIhKHR+oV8z+goUbH9e10j6lGRnTzlQ== - -react-is@^16.10.2, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1, react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-modal@^3.11.1: - version "3.16.1" - resolved "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz" - integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== - dependencies: - exenv "^1.2.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.0" - warning "^4.0.3" - -react-number-format@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.1.3.tgz" - integrity sha512-N4XVBXDEIu9qVZIIwKTfCwhPh1fWx/i50I6XnMLsckj7OHi7A85+AMCzUmMCpx05usVVee14Rr/P7MUY0Pp2Kg== - dependencies: - prop-types "^15.7.2" - -react-overlays@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz" - integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA== - dependencies: - "@babel/runtime" "^7.13.8" - "@popperjs/core" "^2.11.6" - "@restart/hooks" "^0.4.7" - "@types/warning" "^3.0.0" - dom-helpers "^5.2.0" - prop-types "^15.7.2" - uncontrollable "^7.2.1" - warning "^4.0.3" - -react-redux@^7.2.0: - version "7.2.8" - resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz" - integrity sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-redux@^8.0.5: - version "8.0.5" - resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz" - integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw== - dependencies: - "@babel/runtime" "^7.12.1" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/use-sync-external-store" "^0.0.3" - hoist-non-react-statics "^3.3.2" - react-is "^18.0.0" - use-sync-external-store "^1.0.0" - -react-refresh@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" - integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== - -react-resizable@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.4.tgz" - integrity sha512-StnwmiESiamNzdRHbSSvA65b0ZQJ7eVQpPusrSmcpyGKzC0gojhtO62xxH6YOBmepk9dQTBi9yxidL3W4s3EBA== - dependencies: - prop-types "15.x" - react-draggable "^4.0.3" - -react-resize-detector@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz" - integrity sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw== - dependencies: - lodash "^4.17.21" - -react-router-dom@^5.3.0: - version "5.3.3" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz" - integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.3" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.3: - version "5.3.3" - resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz" - integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - mini-create-react-context "^0.4.0" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-scripts@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz" - integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== - dependencies: - "@babel/core" "^7.16.0" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" - "@svgr/webpack" "^5.5.0" - babel-jest "^27.4.2" - babel-loader "^8.2.3" - babel-plugin-named-asset-import "^0.3.8" - babel-preset-react-app "^10.0.1" - bfj "^7.0.2" - browserslist "^4.18.1" - camelcase "^6.2.1" - case-sensitive-paths-webpack-plugin "^2.4.0" - css-loader "^6.5.1" - css-minimizer-webpack-plugin "^3.2.0" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - eslint "^8.3.0" - eslint-config-react-app "^7.0.1" - eslint-webpack-plugin "^3.1.1" - file-loader "^6.2.0" - fs-extra "^10.0.0" - html-webpack-plugin "^5.5.0" - identity-obj-proxy "^3.0.0" - jest "^27.4.3" - jest-resolve "^27.4.2" - jest-watch-typeahead "^1.0.0" - mini-css-extract-plugin "^2.4.5" - postcss "^8.4.4" - postcss-flexbugs-fixes "^5.0.2" - postcss-loader "^6.2.1" - postcss-normalize "^10.0.1" - postcss-preset-env "^7.0.1" - prompts "^2.4.2" - react-app-polyfill "^3.0.0" - react-dev-utils "^12.0.1" - react-refresh "^0.11.0" - resolve "^1.20.0" - resolve-url-loader "^4.0.0" - sass-loader "^12.3.0" - semver "^7.3.5" - source-map-loader "^3.0.0" - style-loader "^3.3.1" - tailwindcss "^3.0.2" - terser-webpack-plugin "^5.2.5" - webpack "^5.64.4" - webpack-dev-server "^4.6.0" - webpack-manifest-plugin "^4.0.2" - workbox-webpack-plugin "^6.4.1" - optionalDependencies: - fsevents "^2.3.2" - -react-smooth@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.1.tgz" - integrity sha512-Own9TA0GPPf3as4vSwFhDouVfXP15ie/wIHklhyKBH5AN6NFtdk0UpHBnonV11BtqDkAWlt40MOUc+5srmW7NA== - dependencies: - fast-equals "^2.0.0" - react-transition-group "2.9.0" - -react-sticky@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.3.tgz" - integrity sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ== - dependencies: - prop-types "^15.5.8" - raf "^3.3.0" - -react-sublime-video@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/react-sublime-video/-/react-sublime-video-0.2.5.tgz" - integrity sha512-pDVLyzq20LSc2Z4uZiCZZS4UZ56ghQZQW2d+8LzGH7+dtBRGyyXrdxJgZbA2cX4uVHcytByDs4nggWO/J7sReA== - dependencies: - prop-types "^15.5.10" - rc-tween-one "^1.2.5" - -react-transition-group@2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== - dependencies: - dom-helpers "^3.4.0" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" - -react-virtualized@^9.22.3: - version "9.22.3" - resolved "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== - dependencies: - "@babel/runtime" "^7.7.2" - clsx "^1.0.4" - dom-helpers "^5.1.3" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.4" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -reactcss@^1.2.0: - version "1.2.3" - resolved "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz" - integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A== - dependencies: - lodash "^4.0.1" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^2.0.1, readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recharts-scale@^0.4.4: - version "0.4.5" - resolved "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz" - integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== - dependencies: - decimal.js-light "^2.4.1" - -recharts@^2.4.3: - version "2.4.3" - resolved "https://registry.npmjs.org/recharts/-/recharts-2.4.3.tgz" - integrity sha512-/hkRHTQShEOKDYd2OlKLIvGA0X9v/XVO/mNeRoDHg0lgFRL2KbGzeqVnStI3mMfORUZ6Hak4JbQ+uDiin1Foqg== - dependencies: - classnames "^2.2.5" - eventemitter3 "^4.0.1" - lodash "^4.17.19" - react-is "^16.10.2" - react-resize-detector "^7.1.2" - react-smooth "^2.0.1" - recharts-scale "^0.4.4" - reduce-css-calc "^2.1.8" - victory-vendor "^36.6.8" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redis-commands@1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz" - integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== - -redis-errors@^1.0.0, redis-errors@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz" - integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== - -redis-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz" - integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== - dependencies: - redis-errors "^1.0.0" - -reduce-css-calc@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz" - integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== - dependencies: - css-unit-converter "^1.1.1" - postcss-value-parser "^3.3.0" - -redux-logger@^3.0.6: - version "3.0.6" - resolved "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz" - integrity sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg== - dependencies: - deep-diff "^0.3.5" - -redux-persist@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz" - integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ== - -redux-saga@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.2.tgz" - integrity sha512-6xAHWgOqRP75MFuLq88waKK9/+6dCdMQjii2TohDMARVHeQ6HZrZoJ9HZ3dLqMWCZ9kj4iuS6CDsujgnovn11A== - dependencies: - "@redux-saga/core" "^1.2.2" - -redux-state-sync@^3.1.4: - version "3.1.4" - resolved "https://registry.npmjs.org/redux-state-sync/-/redux-state-sync-3.1.4.tgz" - integrity sha512-nhJBzaXVXPXvUhQJ7m0LdoXBnrcw+cTYQ8bzW9DeJKdq6UNYynXwQWAlVUvsbT/hDV+vB6BC4DMLXkUVGpF2yQ== - dependencies: - broadcast-channel "^3.1.0" - -redux@^4.0.0, redux@^4.0.4, redux@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -reflect-metadata@^0.1.13: - version "0.1.13" - resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== - dependencies: - regenerate "^1.4.2" - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz" - integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regexpu-core@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz" - integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== - -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== - dependencies: - jsesc "~0.5.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -reselect@^4.1.7: - version "4.1.7" - resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" - integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve-url-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz" - integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== - dependencies: - adjust-sourcemap-loader "^4.0.0" - convert-source-map "^1.7.0" - loader-utils "^2.0.0" - postcss "^7.0.35" - source-map "0.6.1" - -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== - -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -response-iterator@^0.2.6: - version "0.2.6" - resolved "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz" - integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rollup-plugin-terser@^7.0.0: - version "7.0.2" - resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - -rollup@^2.43.1: - version "2.79.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.1: - version "7.5.6" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sanitize.css@*: - version "13.0.0" - resolved "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz" - integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== - -sass-loader@^12.3.0: - version "12.6.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - -sass@^1.58.3: - version "1.58.3" - resolved "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz" - integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -scroll-into-view-if-needed@^2.2.25: - version "2.2.29" - resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz" - integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg== - dependencies: - compute-scroll-into-view "^1.0.17" - -seedrandom@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" - integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.0" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -socket.io-client@^4.6.1: - version "4.6.1" - resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz" - integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.4.0" - socket.io-parser "~4.2.1" - -socket.io-parser@~4.2.1: - version "4.2.2" - resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz" - integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-list-map@^2.0.0, source-list-map@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-explorer@^2.5.2: - version "2.5.2" - resolved "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.2.tgz" - integrity sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg== - dependencies: - btoa "^1.2.1" - chalk "^4.1.0" - convert-source-map "^1.7.0" - ejs "^3.1.5" - escape-html "^1.0.3" - glob "^7.1.6" - gzip-size "^6.0.0" - lodash "^4.17.20" - open "^7.3.1" - source-map "^0.7.3" - temp "^0.9.4" - yargs "^16.2.0" - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-loader@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz" - integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.3" - source-map-js "^1.0.1" - -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -source-map@^0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.14.1: - version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -standard-as-callback@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz" - integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz" - integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-length@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz" - integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== - dependencies: - char-regex "^2.0.0" - strip-ansi "^7.0.1" - -string-natural-compare@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" - integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" - integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -style-utils@^0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/style-utils/-/style-utils-0.3.8.tgz" - integrity sha512-RmGftIhY4tqtD1ERwKsVEDlt/M6UyxN/rcr95UmlooWmhtL0RwVUYJkpo1kSx3ppd9/JZzbknhy742zbMAawjQ== - -style-utils@~0.1.13: - version "0.1.24" - resolved "https://registry.npmjs.org/style-utils/-/style-utils-0.1.24.tgz" - integrity sha512-MVZSKubpU/vIfpmOsi8/0ckWxb0WmGBmyNoEDGWZM9cM8n8sCL6DJftl3lEf8Uy5zKQ9+O1XdJxscWTDosCQpQ== - -style-utils@~0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/style-utils/-/style-utils-0.2.1.tgz" - integrity sha512-eKRIfWnUSdBqe2ko+qisUwBSlfWpHru89geRqzmScpDhkPW1ksmE04d//nDcXeF+TVK5cnBG90mMmHgxyxXleQ== - -styled-components@^5.3.6: - version "5.3.6" - resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz" - integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -subscriptions-transport-ws@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz" - integrity sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ== - dependencies: - backo2 "^1.0.2" - eventemitter3 "^3.1.0" - iterall "^1.2.1" - symbol-observable "^1.0.4" - ws "^5.2.0 || ^6.0.0 || ^7.0.0" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.2: - version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svg-path-properties@^0.2.1: - version "0.2.2" - resolved "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-0.2.2.tgz" - integrity sha512-GmrB+b6woz6CCdQe6w1GHs/1lt25l7SR5hmhF8jRdarpv/OgjLyuQygLu1makJapixeb1aQhP/Oa1iKi93o/aQ== - -svg-path-properties@^1.0.4: - version "1.0.11" - resolved "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-1.0.11.tgz" - integrity sha512-Wo6SjzONZPL9UAgrnwcCkDGRYP9CbHJGkNcPFIgEVRjiOiJxSd/AtwnGk/4N4iOLGUoas57TMxY0xASDeb9YJg== - -svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -svgpath@^2.2.1: - version "2.5.0" - resolved "https://registry.npmjs.org/svgpath/-/svgpath-2.5.0.tgz" - integrity sha512-o/vohwqjUO9nDAh4rcjE3KaW/v//At8UJu2LJMybXidf5QLQLVA4bxH0//4YCsr+1H4Gw1Wi/Jc62ynzSBYidw== - -symbol-observable@^1.0.4: - version "1.2.0" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tailwindcss@^3.0.2: - version "3.2.7" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz" - integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== - dependencies: - arg "^5.0.2" - chokidar "^3.5.3" - color-name "^1.1.4" - detective "^5.2.1" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - lilconfig "^2.0.6" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.0.9" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" - postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -temp@^0.9.4: - version "0.9.4" - resolved "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz" - integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== - dependencies: - mkdirp "^0.5.1" - rimraf "~2.6.2" - -tempy@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" - integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== - dependencies: - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: - version "5.3.6" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.14" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" - -terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: - version "5.16.5" - resolved "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz" - integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" - integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== - -through@^2.3.8: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: - version "1.2.0" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.0, tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== - -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -topojson-client@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz" - integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== - dependencies: - commander "2" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - -ts-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -ts-node@^10.7.0: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.1: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tween-functions@1.x, tween-functions@^1.2.0, tween-functions@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz" - integrity sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA== - -tween-one@^1.0.52: - version "1.1.8" - resolved "https://registry.npmjs.org/tween-one/-/tween-one-1.1.8.tgz" - integrity sha512-b9WD0/ZauKmhpomV5skXkTw6MMOEKLmBsWXV754Vp0WuJALcDP5u7PQSvMMFqVSQ/eg8R8DAxiaNebHZtB57fg== - dependencies: - "@babel/runtime" "^7.11.1" - flubber "^0.4.2" - raf "^3.4.1" - style-utils "^0.3.6" - svg-path-properties "^1.0.4" - tween-functions "^1.2.0" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.0: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript-compare@^0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz" - integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== - dependencies: - typescript-logic "^0.0.0" - -typescript-logic@^0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz" - integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== - -typescript-tuple@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz" - integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== - dependencies: - typescript-compare "^0.0.2" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -uncontrollable@^7.2.1: - version "7.2.1" - resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" - integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== - dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" ">=16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -universal-cookie@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz" - integrity sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw== - dependencies: - "@types/cookie" "^0.3.3" - cookie "^0.4.0" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unload@2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" - integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -upath@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -use-memo-one@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz" - integrity sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ== - -use-sync-external-store@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vanilla-picker@^2.12.1: - version "2.12.1" - resolved "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz" - integrity sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg== - dependencies: - "@sphinxxxx/color-conversion" "^2.2.2" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -victory-vendor@^36.6.8: - version "36.6.8" - resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.8.tgz" - integrity sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ== - dependencies: - "@types/d3-array" "^3.0.3" - "@types/d3-ease" "^3.0.0" - "@types/d3-interpolate" "^3.0.1" - "@types/d3-scale" "^4.0.2" - "@types/d3-shape" "^3.1.0" - "@types/d3-time" "^3.0.0" - "@types/d3-timer" "^3.0.0" - d3-array "^3.1.6" - d3-ease "^3.0.1" - d3-interpolate "^3.0.1" - d3-scale "^4.0.2" - d3-shape "^3.1.0" - d3-time "^3.0.0" - d3-timer "^3.0.1" - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -warning@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-vitals@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz" - integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.6.0: - version "4.11.1" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" - -webpack-manifest-plugin@^4.0.2: - version "4.1.1" - resolved "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz" - integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== - dependencies: - tapable "^2.0.0" - webpack-sources "^2.2.0" - -webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -"webpack-sources@^2.0.0 || ^3.0.0", webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack-sources@^2.2.0: - version "2.3.1" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz" - integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" - -webpack@^5.64.4: - version "5.75.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@^3.6.2: - version "3.6.2" - resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -workbox-background-sync@6.5.3, workbox-background-sync@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz" - integrity sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw== - dependencies: - idb "^6.1.4" - workbox-core "6.5.3" - -workbox-background-sync@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz" - integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== - dependencies: - idb "^7.0.1" - workbox-core "6.5.4" - -workbox-broadcast-update@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz" - integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== - dependencies: - workbox-core "6.5.4" - -workbox-broadcast-update@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz" - integrity sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg== - dependencies: - workbox-core "6.5.3" - -workbox-build@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz" - integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== - dependencies: - "@apideck/better-ajv-errors" "^0.3.1" - "@babel/core" "^7.11.1" - "@babel/preset-env" "^7.11.0" - "@babel/runtime" "^7.11.2" - "@rollup/plugin-babel" "^5.2.0" - "@rollup/plugin-node-resolve" "^11.2.1" - "@rollup/plugin-replace" "^2.4.1" - "@surma/rollup-plugin-off-main-thread" "^2.2.3" - ajv "^8.6.0" - common-tags "^1.8.0" - fast-json-stable-stringify "^2.1.0" - fs-extra "^9.0.1" - glob "^7.1.6" - lodash "^4.17.20" - pretty-bytes "^5.3.0" - rollup "^2.43.1" - rollup-plugin-terser "^7.0.0" - source-map "^0.8.0-beta.0" - stringify-object "^3.3.0" - strip-comments "^2.0.1" - tempy "^0.6.0" - upath "^1.2.0" - workbox-background-sync "6.5.4" - workbox-broadcast-update "6.5.4" - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-google-analytics "6.5.4" - workbox-navigation-preload "6.5.4" - workbox-precaching "6.5.4" - workbox-range-requests "6.5.4" - workbox-recipes "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - workbox-streams "6.5.4" - workbox-sw "6.5.4" - workbox-window "6.5.4" - -workbox-cacheable-response@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz" - integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== - dependencies: - workbox-core "6.5.4" - -workbox-cacheable-response@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz" - integrity sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ== - dependencies: - workbox-core "6.5.3" - -workbox-core@6.5.3, workbox-core@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz" - integrity sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q== - -workbox-core@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz" - integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== - -workbox-expiration@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz" - integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== - dependencies: - idb "^7.0.1" - workbox-core "6.5.4" - -workbox-expiration@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz" - integrity sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw== - dependencies: - idb "^6.1.4" - workbox-core "6.5.3" - -workbox-google-analytics@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz" - integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== - dependencies: - workbox-background-sync "6.5.4" - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - -workbox-google-analytics@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz" - integrity sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw== - dependencies: - workbox-background-sync "6.5.3" - workbox-core "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" - -workbox-navigation-preload@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz" - integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== - dependencies: - workbox-core "6.5.4" - -workbox-navigation-preload@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz" - integrity sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg== - dependencies: - workbox-core "6.5.3" - -workbox-precaching@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz" - integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== - dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - -workbox-precaching@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz" - integrity sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ== - dependencies: - workbox-core "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" - -workbox-range-requests@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz" - integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== - dependencies: - workbox-core "6.5.4" - -workbox-range-requests@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz" - integrity sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA== - dependencies: - workbox-core "6.5.3" - -workbox-recipes@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz" - integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== - dependencies: - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-precaching "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - -workbox-routing@6.5.3, workbox-routing@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz" - integrity sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg== - dependencies: - workbox-core "6.5.3" - -workbox-routing@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz" - integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== - dependencies: - workbox-core "6.5.4" - -workbox-strategies@6.5.3, workbox-strategies@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz" - integrity sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w== - dependencies: - workbox-core "6.5.3" - -workbox-strategies@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz" - integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== - dependencies: - workbox-core "6.5.4" - -workbox-streams@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz" - integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== - dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - -workbox-streams@^6.5.3: - version "6.5.3" - resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz" - integrity sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w== - dependencies: - workbox-core "6.5.3" - workbox-routing "6.5.3" - -workbox-sw@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz" - integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== - -workbox-webpack-plugin@^6.4.1: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz" - integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== - dependencies: - fast-json-stable-stringify "^2.1.0" - pretty-bytes "^5.4.1" - upath "^1.2.0" - webpack-sources "^1.4.3" - workbox-build "6.5.4" - -workbox-window@6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz" - integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== - dependencies: - "@types/trusted-types" "^2.0.2" - workbox-core "6.5.4" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.4.2: - version "8.12.1" - resolved "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz" - integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== - -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== - -xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xxhashjs@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz" - integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== - dependencies: - cuint "^0.2.2" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/package-lock.json b/package-lock.json index 016fb76f3..fc6aa66cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,15 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.454.0", - "@aws-sdk/client-ses": "^3.454.0", - "@aws-sdk/credential-provider-node": "^3.451.0", - "@opensearch-project/opensearch": "^2.4.0", + "@aws-sdk/client-secrets-manager": "^3.490.0", + "@aws-sdk/client-ses": "^3.490.0", + "@aws-sdk/credential-provider-node": "^3.490.0", + "@opensearch-project/opensearch": "^2.5.0", "aws4": "^1.12.0", - "axios": "^1.6.2", + "axios": "^1.6.5", "bluebird": "^3.7.2", "body-parser": "^1.20.2", - "cloudinary": "^1.41.0", + "cloudinary": "^1.41.2", "compression": "^1.7.4", "cookie-parser": "^1.4.6", "cors": "2.8.5", @@ -25,7 +25,7 @@ "dinero.js": "^1.9.1", "dotenv": "^16.3.1", "express": "^4.18.2", - "firebase-admin": "^11.11.0", + "firebase-admin": "^12.0.0", "graphql": "^16.8.1", "graphql-request": "^6.1.0", "graylog2": "^0.2.1", @@ -33,20 +33,20 @@ "intuit-oauth": "^4.0.0", "json-2-csv": "^5.0.1", "lodash": "^4.17.21", - "moment": "^2.29.4", - "moment-timezone": "^0.5.41", + "moment": "^2.30.1", + "moment-timezone": "^0.5.44", "multer": "^1.4.5-lts.1", - "node-mailjet": "^6.0.4", - "node-persist": "^3.1.3", + "node-mailjet": "^6.0.5", + "node-persist": "^4.0.1", "node-quickbooks": "^2.0.43", - "nodemailer": "^6.9.7", - "phone": "^3.1.41", + "nodemailer": "^6.9.8", + "phone": "^3.1.42", "recursive-diff": "^1.0.9", "soap": "^1.0.0", - "socket.io": "^4.7.2", + "socket.io": "^4.7.4", "ssh2-sftp-client": "^9.1.0", - "stripe": "^14.5.0", - "twilio": "^4.19.0", + "stripe": "^14.11.0", + "twilio": "^4.20.0", "uuid": "^9.0.1", "xml2js": "^0.6.2", "xmlbuilder2": "^3.1.1" @@ -152,47 +152,48 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.454.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.454.0.tgz", - "integrity": "sha512-MASOypTtnUNInnbh68RVO7xho11kZI7HaNuCZYiF1hnKiiYwpkV5s6Rz4CGWkhTNTBqdMDAZC59xv924cMEGEA==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.490.0.tgz", + "integrity": "sha512-wd+PBIMOfSY9CpHfAAE9ztwwde7wom3/VdSqLbBUAUAvAlArANmBS610iCZSFP3ds38v8rnliAV9fjzf7IVnxQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.454.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.451.0", - "@aws-sdk/middleware-host-header": "3.451.0", - "@aws-sdk/middleware-logger": "3.451.0", - "@aws-sdk/middleware-recursion-detection": "3.451.0", - "@aws-sdk/middleware-signing": "3.451.0", - "@aws-sdk/middleware-user-agent": "3.451.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.451.0", - "@aws-sdk/util-endpoints": "3.451.0", - "@aws-sdk/util-user-agent-browser": "3.451.0", - "@aws-sdk/util-user-agent-node": "3.451.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", + "@aws-sdk/client-sts": "3.490.0", + "@aws-sdk/core": "3.490.0", + "@aws-sdk/credential-provider-node": "3.490.0", + "@aws-sdk/middleware-host-header": "3.489.0", + "@aws-sdk/middleware-logger": "3.489.0", + "@aws-sdk/middleware-recursion-detection": "3.489.0", + "@aws-sdk/middleware-signing": "3.489.0", + "@aws-sdk/middleware-user-agent": "3.489.0", + "@aws-sdk/region-config-resolver": "3.489.0", + "@aws-sdk/types": "3.489.0", + "@aws-sdk/util-endpoints": "3.489.0", + "@aws-sdk/util-user-agent-browser": "3.489.0", + "@aws-sdk/util-user-agent-node": "3.489.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/core": "^1.2.2", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/hash-node": "^2.0.18", + "@smithy/invalid-dependency": "^2.0.16", + "@smithy/middleware-content-length": "^2.0.18", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/node-http-handler": "^2.2.2", + "@smithy/protocol-http": "^3.0.12", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.24", + "@smithy/util-defaults-mode-node": "^2.0.32", + "@smithy/util-endpoints": "^1.0.8", + "@smithy/util-retry": "^2.0.9", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0", "uuid": "^8.3.2" @@ -210,49 +211,50 @@ } }, "node_modules/@aws-sdk/client-ses": { - "version": "3.454.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.454.0.tgz", - "integrity": "sha512-6rLwDHHwjLv3gYL68V8sZeDlgiO60e/pIWmu2H7POoDTTFlQdcmS/ARdFzdIgAuA2yMAYFZvsFcrZTYxLl1q8g==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.490.0.tgz", + "integrity": "sha512-vcU4+1DfdZ+7AcrpaSxG+xohPkA9rMA0l6Jt3zJPkLqUBhrBQfkWISaQ6CNpS6QlAfxzrSudI4t4J5T9J0xs/g==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.454.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.451.0", - "@aws-sdk/middleware-host-header": "3.451.0", - "@aws-sdk/middleware-logger": "3.451.0", - "@aws-sdk/middleware-recursion-detection": "3.451.0", - "@aws-sdk/middleware-signing": "3.451.0", - "@aws-sdk/middleware-user-agent": "3.451.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.451.0", - "@aws-sdk/util-endpoints": "3.451.0", - "@aws-sdk/util-user-agent-browser": "3.451.0", - "@aws-sdk/util-user-agent-node": "3.451.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", + "@aws-sdk/client-sts": "3.490.0", + "@aws-sdk/core": "3.490.0", + "@aws-sdk/credential-provider-node": "3.490.0", + "@aws-sdk/middleware-host-header": "3.489.0", + "@aws-sdk/middleware-logger": "3.489.0", + "@aws-sdk/middleware-recursion-detection": "3.489.0", + "@aws-sdk/middleware-signing": "3.489.0", + "@aws-sdk/middleware-user-agent": "3.489.0", + "@aws-sdk/region-config-resolver": "3.489.0", + "@aws-sdk/types": "3.489.0", + "@aws-sdk/util-endpoints": "3.489.0", + "@aws-sdk/util-user-agent-browser": "3.489.0", + "@aws-sdk/util-user-agent-node": "3.489.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/core": "^1.2.2", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/hash-node": "^2.0.18", + "@smithy/invalid-dependency": "^2.0.16", + "@smithy/middleware-content-length": "^2.0.18", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/node-http-handler": "^2.2.2", + "@smithy/protocol-http": "^3.0.12", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.24", + "@smithy/util-defaults-mode-node": "^2.0.32", + "@smithy/util-endpoints": "^1.0.8", + "@smithy/util-retry": "^2.0.9", "@smithy/util-utf8": "^2.0.2", - "@smithy/util-waiter": "^2.0.13", + "@smithy/util-waiter": "^2.0.16", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -261,44 +263,45 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.451.0.tgz", - "integrity": "sha512-KkYSke3Pdv3MfVH/5fT528+MKjMyPKlcLcd4zQb0x6/7Bl7EHrPh1JZYjzPLHelb+UY5X0qN8+cb8iSu1eiwIQ==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.490.0.tgz", + "integrity": "sha512-yfxoHmCL1w/IKmFRfzCxdVCQrGlSQf4eei9iVEm5oi3iE8REFyPj3o/BmKQEHG3h2ITK5UbdYDb5TY4xoYHsyA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/middleware-host-header": "3.451.0", - "@aws-sdk/middleware-logger": "3.451.0", - "@aws-sdk/middleware-recursion-detection": "3.451.0", - "@aws-sdk/middleware-user-agent": "3.451.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.451.0", - "@aws-sdk/util-endpoints": "3.451.0", - "@aws-sdk/util-user-agent-browser": "3.451.0", - "@aws-sdk/util-user-agent-node": "3.451.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", + "@aws-sdk/core": "3.490.0", + "@aws-sdk/middleware-host-header": "3.489.0", + "@aws-sdk/middleware-logger": "3.489.0", + "@aws-sdk/middleware-recursion-detection": "3.489.0", + "@aws-sdk/middleware-user-agent": "3.489.0", + "@aws-sdk/region-config-resolver": "3.489.0", + "@aws-sdk/types": "3.489.0", + "@aws-sdk/util-endpoints": "3.489.0", + "@aws-sdk/util-user-agent-browser": "3.489.0", + "@aws-sdk/util-user-agent-node": "3.489.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/core": "^1.2.2", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/hash-node": "^2.0.18", + "@smithy/invalid-dependency": "^2.0.16", + "@smithy/middleware-content-length": "^2.0.18", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/node-http-handler": "^2.2.2", + "@smithy/protocol-http": "^3.0.12", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.24", + "@smithy/util-defaults-mode-node": "^2.0.32", + "@smithy/util-endpoints": "^1.0.8", + "@smithy/util-retry": "^2.0.9", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, @@ -307,47 +310,47 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.454.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.454.0.tgz", - "integrity": "sha512-0fDvr8WeB6IYO8BUCzcivWmahgGl/zDbaYfakzGnt4mrl5ztYaXE875WI6b7+oFcKMRvN+KLvwu5TtyFuNY+GQ==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.490.0.tgz", + "integrity": "sha512-n2vQ5Qu2qi2I0XMI+IH99ElpIRHOJTa1+sqNC4juMYxKQBMvw+EnsqUtaL3QvTHoyxNB/R7mpkeBB6SzPQ1TtA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.451.0", - "@aws-sdk/middleware-host-header": "3.451.0", - "@aws-sdk/middleware-logger": "3.451.0", - "@aws-sdk/middleware-recursion-detection": "3.451.0", - "@aws-sdk/middleware-sdk-sts": "3.451.0", - "@aws-sdk/middleware-signing": "3.451.0", - "@aws-sdk/middleware-user-agent": "3.451.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.451.0", - "@aws-sdk/util-endpoints": "3.451.0", - "@aws-sdk/util-user-agent-browser": "3.451.0", - "@aws-sdk/util-user-agent-node": "3.451.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", + "@aws-sdk/core": "3.490.0", + "@aws-sdk/credential-provider-node": "3.490.0", + "@aws-sdk/middleware-host-header": "3.489.0", + "@aws-sdk/middleware-logger": "3.489.0", + "@aws-sdk/middleware-recursion-detection": "3.489.0", + "@aws-sdk/middleware-user-agent": "3.489.0", + "@aws-sdk/region-config-resolver": "3.489.0", + "@aws-sdk/types": "3.489.0", + "@aws-sdk/util-endpoints": "3.489.0", + "@aws-sdk/util-user-agent-browser": "3.489.0", + "@aws-sdk/util-user-agent-node": "3.489.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/core": "^1.2.2", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/hash-node": "^2.0.18", + "@smithy/invalid-dependency": "^2.0.16", + "@smithy/middleware-content-length": "^2.0.18", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/node-http-handler": "^2.2.2", + "@smithy/protocol-http": "^3.0.12", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.24", + "@smithy/util-defaults-mode-node": "^2.0.32", + "@smithy/util-endpoints": "^1.0.8", + "@smithy/util-middleware": "^2.0.9", + "@smithy/util-retry": "^2.0.9", "@smithy/util-utf8": "^2.0.2", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" @@ -357,11 +360,15 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.451.0.tgz", - "integrity": "sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.490.0.tgz", + "integrity": "sha512-TSBWkXtxMU7q1Zo6w3v5wIOr/sj7P5Jw3OyO7lJrFGsPsDC2xwpxkVqTesDxkzgMRypO52xjYEmveagn1xxBHg==", "dependencies": { - "@smithy/smithy-client": "^2.1.15", + "@smithy/core": "^1.2.2", + "@smithy/protocol-http": "^3.0.12", + "@smithy/signature-v4": "^2.0.0", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -369,13 +376,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.451.0.tgz", - "integrity": "sha512-9dAav7DcRgaF7xCJEQR5ER9ErXxnu/tdnVJ+UPmb1NPeIZdESv1A3lxFDEq1Fs8c4/lzAj9BpshGyJVIZwZDKg==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.489.0.tgz", + "integrity": "sha512-5PqYsx9G5SB2tqPT9/z/u0EkF6D4wP6HTMWQs+DfMdmwXihrqQAgeYaTtV3KbXqb88p6sfacwxhUvE6+Rm494w==", "dependencies": { - "@aws-sdk/types": "3.451.0", + "@aws-sdk/types": "3.489.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -383,19 +390,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.451.0.tgz", - "integrity": "sha512-TySt64Ci5/ZbqFw1F9Z0FIGvYx5JSC9e6gqDnizIYd8eMnn8wFRUscRrD7pIHKfrhvVKN5h0GdYovmMO/FMCBw==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.490.0.tgz", + "integrity": "sha512-7m63zyCpVqj9FsoDxWMWWRvL6c7zZzOcXYkHZmHujVVlmAXH0RT/vkXFkYgt+Ku+ov+v5NQrzwO5TmVoRt6O8g==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.451.0", - "@aws-sdk/credential-provider-process": "3.451.0", - "@aws-sdk/credential-provider-sso": "3.451.0", - "@aws-sdk/credential-provider-web-identity": "3.451.0", - "@aws-sdk/types": "3.451.0", + "@aws-sdk/credential-provider-env": "3.489.0", + "@aws-sdk/credential-provider-process": "3.489.0", + "@aws-sdk/credential-provider-sso": "3.490.0", + "@aws-sdk/credential-provider-web-identity": "3.489.0", + "@aws-sdk/types": "3.489.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -403,20 +410,20 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.451.0.tgz", - "integrity": "sha512-AEwM1WPyxUdKrKyUsKyFqqRFGU70e4qlDyrtBxJnSU9NRLZI8tfEZ67bN7fHSxBUBODgDXpMSlSvJiBLh5/3pw==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.490.0.tgz", + "integrity": "sha512-Gh33u2O5Xbout8G3z/Z5H/CZzdG1ophxf/XS3iMFxA1cazQ7swY1UMmGvB7Lm7upvax5anXouItD1Ph3gzKc4w==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.451.0", - "@aws-sdk/credential-provider-ini": "3.451.0", - "@aws-sdk/credential-provider-process": "3.451.0", - "@aws-sdk/credential-provider-sso": "3.451.0", - "@aws-sdk/credential-provider-web-identity": "3.451.0", - "@aws-sdk/types": "3.451.0", + "@aws-sdk/credential-provider-env": "3.489.0", + "@aws-sdk/credential-provider-ini": "3.490.0", + "@aws-sdk/credential-provider-process": "3.489.0", + "@aws-sdk/credential-provider-sso": "3.490.0", + "@aws-sdk/credential-provider-web-identity": "3.489.0", + "@aws-sdk/types": "3.489.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -424,14 +431,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.451.0.tgz", - "integrity": "sha512-HQywSdKeD5PErcLLnZfSyCJO+6T+ZyzF+Lm/QgscSC+CbSUSIPi//s15qhBRVely/3KBV6AywxwNH+5eYgt4lQ==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.489.0.tgz", + "integrity": "sha512-3vKQYJZ5cZYjy0870CPmbmKRBgATw2xCygxhn4m4UDCjOXVXcGUtYD51DMWsvBo3S0W8kH+FIJV4yuEDMFqLFQ==", "dependencies": { - "@aws-sdk/types": "3.451.0", + "@aws-sdk/types": "3.489.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -439,16 +446,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.451.0.tgz", - "integrity": "sha512-Usm/N51+unOt8ID4HnQzxIjUJDrkAQ1vyTOC0gSEEJ7h64NSSPGD5yhN7il5WcErtRd3EEtT1a8/GTC5TdBctg==", + "version": "3.490.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.490.0.tgz", + "integrity": "sha512-3UUBUoPbFvT58IhS4Vb23omYj/QPNkjgxu9p9ruQ3KSjLkanI4w8t/l/jljA65q83P7CoLnM5UKG9L7RA8/V1Q==", "dependencies": { - "@aws-sdk/client-sso": "3.451.0", - "@aws-sdk/token-providers": "3.451.0", - "@aws-sdk/types": "3.451.0", + "@aws-sdk/client-sso": "3.490.0", + "@aws-sdk/token-providers": "3.489.0", + "@aws-sdk/types": "3.489.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -456,13 +463,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.451.0.tgz", - "integrity": "sha512-Xtg3Qw65EfDjWNG7o2xD6sEmumPfsy3WDGjk2phEzVg8s7hcZGxf5wYwe6UY7RJvlEKrU0rFA+AMn6Hfj5oOzg==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.489.0.tgz", + "integrity": "sha512-mjIuE2Wg1H/ds0nXQ/7vfusEDudmdd8YzKZI1y5O4n60iZZtyB2RNIECtvLMx1EQAKclidY7/06qQkArrGau5Q==", "dependencies": { - "@aws-sdk/types": "3.451.0", + "@aws-sdk/types": "3.489.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -470,13 +477,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.451.0.tgz", - "integrity": "sha512-j8a5jAfhWmsK99i2k8oR8zzQgXrsJtgrLxc3js6U+525mcZytoiDndkWTmD5fjJ1byU1U2E5TaPq+QJeDip05Q==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.489.0.tgz", + "integrity": "sha512-Cl7HJ1jhOfllwf0CRx1eB4ypRGMqdGKWpc0eSTXty7wWSvCdMZUhwfjQqu2bIOIlgYxg/gFu6TVmVZ6g4O8PlA==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.489.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -484,12 +491,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.451.0.tgz", - "integrity": "sha512-0kHrYEyVeB2QBfP6TfbI240aRtatLZtcErJbhpiNUb+CQPgEL3crIjgVE8yYiJumZ7f0jyjo8HLPkwD1/2APaw==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.489.0.tgz", + "integrity": "sha512-+EVDnWese61MdImcBNAgz/AhTcIZJaska/xsU3GWU9CP905x4a4qZdB7fExFMDu1Jlz5pJqNteFYYHCFMJhHfg==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.489.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -497,27 +504,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.451.0.tgz", - "integrity": "sha512-J6jL6gJ7orjHGM70KDRcCP7so/J2SnkN4vZ9YRLTeeZY6zvBuHDjX8GCIgSqPn/nXFXckZO8XSnA7u6+3TAT0w==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.489.0.tgz", + "integrity": "sha512-m4rU+fTzziQcu9DKjRNZ4nQlXENEd2ZnJblJV4ONdWqqEjbmOgOj3P6aCCQlJdIbzuNvX1FBOZ5tY59ZpERo7Q==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.451.0.tgz", - "integrity": "sha512-UJ6UfVUEgp0KIztxpAeelPXI5MLj9wUtUCqYeIMP7C1ZhoEMNm3G39VLkGN43dNhBf1LqjsV9jkKMZbVfYXuwg==", - "dependencies": { - "@aws-sdk/middleware-signing": "3.451.0", - "@aws-sdk/types": "3.451.0", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.489.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -525,16 +518,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.451.0.tgz", - "integrity": "sha512-s5ZlcIoLNg1Huj4Qp06iKniE8nJt/Pj1B/fjhWc6cCPCM7XJYUCejCnRh6C5ZJoBEYodjuwZBejPc1Wh3j+znA==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.489.0.tgz", + "integrity": "sha512-rlHcWYZn6Ym3v/u0DvKNDiD7ogIzEsHlerm0lowTiQbszkFobOiUClRTALwvsUZdAAztl706qO1OKbnGnD6Ubw==", "dependencies": { - "@aws-sdk/types": "3.451.0", + "@aws-sdk/types": "3.489.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", + "@smithy/protocol-http": "^3.0.12", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.5.0", - "@smithy/util-middleware": "^2.0.6", + "@smithy/types": "^2.8.0", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -542,14 +535,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.451.0.tgz", - "integrity": "sha512-8NM/0JiKLNvT9wtAQVl1DFW0cEO7OvZyLSUBLNLTHqyvOZxKaZ8YFk7d8PL6l76LeUKRxq4NMxfZQlUIRe0eSA==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.489.0.tgz", + "integrity": "sha512-M54Cv2fAN3GGgdfUjLtZ4wFUIrfM/ivbXv4DgpcNsacEQ2g4H+weQgKp41X7XZW8MWAzl+k1zJaryK69RYNQkQ==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@aws-sdk/util-endpoints": "3.451.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.489.0", + "@aws-sdk/util-endpoints": "3.489.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -557,14 +550,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.451.0.tgz", - "integrity": "sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.489.0.tgz", + "integrity": "sha512-UvrnB78XTz9ddby7mr0vuUHn2MO3VTjzaIu+GQhyedMGQU0QlIQrYOlzbbu4LC5rL1O8FxFLUxRe/AAjgwyuGw==", "dependencies": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.6", + "@aws-sdk/types": "3.489.0", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/types": "^2.8.0", + "@smithy/util-config-provider": "^2.1.0", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -572,45 +566,45 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.451.0.tgz", - "integrity": "sha512-ij1L5iUbn6CwxVOT1PG4NFjsrsKN9c4N1YEM0lkl6DwmaNOscjLKGSNyj9M118vSWsOs1ZDbTwtj++h0O/BWrQ==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.489.0.tgz", + "integrity": "sha512-hSgjB8CMQoA8EIQ0ripDjDtbBcWDSa+7vSBYPIzksyknaGERR/GUfGXLV2dpm5t17FgFG6irT5f3ZlBzarL8Dw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.451.0", - "@aws-sdk/middleware-logger": "3.451.0", - "@aws-sdk/middleware-recursion-detection": "3.451.0", - "@aws-sdk/middleware-user-agent": "3.451.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.451.0", - "@aws-sdk/util-endpoints": "3.451.0", - "@aws-sdk/util-user-agent-browser": "3.451.0", - "@aws-sdk/util-user-agent-node": "3.451.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", + "@aws-sdk/middleware-host-header": "3.489.0", + "@aws-sdk/middleware-logger": "3.489.0", + "@aws-sdk/middleware-recursion-detection": "3.489.0", + "@aws-sdk/middleware-user-agent": "3.489.0", + "@aws-sdk/region-config-resolver": "3.489.0", + "@aws-sdk/types": "3.489.0", + "@aws-sdk/util-endpoints": "3.489.0", + "@aws-sdk/util-user-agent-browser": "3.489.0", + "@aws-sdk/util-user-agent-node": "3.489.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/hash-node": "^2.0.18", + "@smithy/invalid-dependency": "^2.0.16", + "@smithy/middleware-content-length": "^2.0.18", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/node-http-handler": "^2.2.2", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", + "@smithy/protocol-http": "^3.0.12", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.24", + "@smithy/util-defaults-mode-node": "^2.0.32", + "@smithy/util-endpoints": "^1.0.8", + "@smithy/util-retry": "^2.0.9", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, @@ -619,11 +613,11 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.451.0.tgz", - "integrity": "sha512-rhK+qeYwCIs+laJfWCcrYEjay2FR/9VABZJ2NRM89jV/fKqGVQR52E5DQqrI+oEIL5JHMhhnr4N4fyECMS35lw==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.489.0.tgz", + "integrity": "sha512-kcDtLfKog/p0tC4gAeqJqWxAiEzfe2LRPnKamvSG2Mjbthx4R/alE2dxyIq/wW+nvRv0fqR3OD5kD1+eVfdr/w==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -631,12 +625,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.451.0.tgz", - "integrity": "sha512-giqLGBTnRIcKkDqwU7+GQhKbtJ5Ku35cjGQIfMyOga6pwTBUbaK0xW1Sdd8sBQ1GhApscnChzI9o/R9x0368vw==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.489.0.tgz", + "integrity": "sha512-uGyG1u84ATX03mf7bT4xD9XD/vlYJGD5+RxMN/UpzeTfzXfh+jvCQWbOQ44z8ttFJWYQQqrLxkfpF/JgvALzLA==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@smithy/util-endpoints": "^1.0.4", + "@aws-sdk/types": "3.489.0", + "@smithy/types": "^2.8.0", + "@smithy/util-endpoints": "^1.0.8", "tslib": "^2.5.0" }, "engines": { @@ -655,24 +650,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.451.0.tgz", - "integrity": "sha512-Ws5mG3J0TQifH7OTcMrCTexo7HeSAc3cBgjfhS/ofzPUzVCtsyg0G7I6T7wl7vJJETix2Kst2cpOsxygPgPD9w==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.489.0.tgz", + "integrity": "sha512-85B9KMsuMpAZauzWQ16r52ZBAHYnznW6BVitnBglsibN7oJKn10Hggt4QGuRhvQFCxQ8YhvBl7r+vQGFO4hxIw==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.489.0", + "@smithy/types": "^2.8.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.451.0.tgz", - "integrity": "sha512-TBzm6P+ql4mkGFAjPlO1CI+w3yUT+NulaiALjl/jNX/nnUp6HsJsVxJf4nVFQTG5KRV0iqMypcs7I3KIhH+LmA==", + "version": "3.489.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.489.0.tgz", + "integrity": "sha512-CYdkBHig8sFNc0dv11Ni9WXvZQHeI5+z77OrDHKkbidFx/V4BDTuwZw4K1vWg62pzFOEfzunJFiULRcDZWJR3w==", "dependencies": { - "@aws-sdk/types": "3.451.0", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.489.0", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -695,18 +690,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", - "optional": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/runtime": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", @@ -747,6 +730,11 @@ "node": ">=14" } }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, "node_modules/@firebase/app-types": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", @@ -767,10 +755,11 @@ } }, "node_modules/@firebase/database": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", - "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.2.tgz", + "integrity": "sha512-8X6NBJgUQzDz0xQVaCISoOLINKat594N2eBbMR3Mu/MH/ei4WM+aAMlsNzngF22eljXu1SILP5G3evkyvsG3Ng==", "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -780,22 +769,22 @@ } }, "node_modules/@firebase/database-compat": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", - "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.2.tgz", + "integrity": "sha512-09ryJnXDvuycsxn8aXBzLhBTuCos3HEnCOBWY6hosxfYlNCGnLvG8YMlbSAt5eNhf7/00B095AEfDsdrrLjxqA==", "dependencies": { "@firebase/component": "0.6.4", - "@firebase/database": "0.14.4", - "@firebase/database-types": "0.10.4", + "@firebase/database": "1.0.2", + "@firebase/database-types": "1.0.0", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-types": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", - "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", + "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", "dependencies": { "@firebase/app-types": "0.9.0", "@firebase/util": "1.9.3" @@ -818,78 +807,99 @@ } }, "node_modules/@google-cloud/firestore": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-6.8.0.tgz", - "integrity": "sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.1.0.tgz", + "integrity": "sha512-kkTC0Sb9r2lONuFF8Tr2wFfBfk0DT1/EKcTKOhsuoXUVClv3jCqGYVPtHgQsHFjdOsubS+tx9G5D5WG+obB2DA==", "optional": true, "dependencies": { "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^3.5.7", + "google-gax": "^4.0.4", "protobufjs": "^7.2.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@google-cloud/paginator": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz", - "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", + "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", "optional": true, "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, "node_modules/@google-cloud/projectify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", - "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@google-cloud/promisify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", - "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", "optional": true, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/@google-cloud/storage": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.12.0.tgz", - "integrity": "sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.7.0.tgz", + "integrity": "sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==", "optional": true, "dependencies": { - "@google-cloud/paginator": "^3.0.7", - "@google-cloud/projectify": "^3.0.0", - "@google-cloud/promisify": "^3.0.0", + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "compressible": "^2.0.12", "duplexify": "^4.0.0", "ent": "^2.2.0", - "extend": "^3.0.2", - "fast-xml-parser": "^4.2.2", - "gaxios": "^5.0.0", - "google-auth-library": "^8.0.1", + "fast-xml-parser": "^4.3.0", + "gaxios": "^6.0.2", + "google-auth-library": "^9.0.0", "mime": "^3.0.0", "mime-types": "^2.0.8", "p-limit": "^3.0.1", - "retry-request": "^5.0.0", - "teeny-request": "^8.0.0", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", "uuid": "^8.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage/node_modules/fast-xml-parser": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" } }, "node_modules/@google-cloud/storage/node_modules/uuid": { @@ -910,12 +920,12 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.8.21", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.21.tgz", - "integrity": "sha512-KeyQeZpxeEBSqFVTi3q2K7PiPXmgBfECc4updA1ejCLjYmoAlvvM3ZMp5ztTDUCUQmoY3CpDxvchjO1+rFkoHg==", + "version": "1.9.13", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.13.tgz", + "integrity": "sha512-OEZZu9v9AA+7/tghMDE8o5DAMD5THVnwSqDWuh7PPYO5287rTyqy0xEHT6/e4pbqSrhyLPdQFsam4TwFQVVIIw==", "optional": true, "dependencies": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" }, "engines": { @@ -945,18 +955,6 @@ "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" }, - "node_modules/@jsdoc/salty": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.6.tgz", - "integrity": "sha512-aA+awb5yoml8TQ3CzI5Ue7sM3VMRC4l1zJJW4fgZ8OCL1wshJZhNzaf0PL85DSnOUw6QuFgeHGD/eq/xwwAF2g==", - "optional": true, - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, "node_modules/@oozcitak/dom": { "version": "1.15.10", "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", @@ -1002,9 +1000,9 @@ } }, "node_modules/@opensearch-project/opensearch": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.4.0.tgz", - "integrity": "sha512-r0ZNIlDxAua1ZecOBJ8qOXshf2ZQhNKmfly7o0aNuACf0pDa6Et/8mWMZuaFOu7xlNEeRNB7IjDQUYFy2SPElw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.5.0.tgz", + "integrity": "sha512-RY5J6Jt/Jbbr2F9XByGY9LJr0VNmXJjgVvvntpKE4NtZa/r9ak3o8YtGK1iey1yHgzMzze25598qq7ZYFk42DA==", "dependencies": { "aws4": "^1.11.0", "debug": "^4.3.1", @@ -1082,11 +1080,11 @@ "optional": true }, "node_modules/@smithy/abort-controller": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.13.tgz", - "integrity": "sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.16.tgz", + "integrity": "sha512-4foO7738k8kM9flMHu3VLabqu7nPgvIj8TB909S0CnKx0YZz/dcDH3pZ/4JHdatfxlZdKF1JWOYCw9+v3HVVsw==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1094,14 +1092,32 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.18.tgz", - "integrity": "sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.23.tgz", + "integrity": "sha512-XakUqgtP2YY8Mi+Nlif5BiqJgWdvfxJafSpOSQeCOMizu+PUhE4fBQSy6xFcR+eInrwVadaABNxoJyGUMn15ew==", "dependencies": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.6", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/types": "^2.8.0", + "@smithy/util-config-provider": "^2.1.0", + "@smithy/util-middleware": "^2.0.9", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.2.tgz", + "integrity": "sha512-uLjrskLT+mWb0emTR5QaiAIxVEU7ndpptDaVDrTwwhD+RjvHhjIiGQ3YL5jKk1a5VSDQUA2RGkXvJ6XKRcz6Dg==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/protocol-http": "^3.0.12", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -1109,14 +1125,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.1.tgz", - "integrity": "sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.5.tgz", + "integrity": "sha512-VfvE6Wg1MUWwpTZFBnUD7zxvPhLY8jlHCzu6bCjlIYoWgXCDzZAML76IlZUEf45nib3rjehnFgg0s1rgsuN/bg==", "dependencies": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/property-provider": "^2.0.14", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/property-provider": "^2.0.17", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "tslib": "^2.5.0" }, "engines": { @@ -1124,34 +1140,34 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.13.tgz", - "integrity": "sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.16.tgz", + "integrity": "sha512-umYh5pdCE9GHgiMAH49zu9wXWZKNHHdKPm/lK22WYISTjqu29SepmpWNmPiBLy/yUu4HFEGJHIFrDWhbDlApaw==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.6.tgz", - "integrity": "sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.2.tgz", + "integrity": "sha512-O9R/OlnAOTsnysuSDjt0v2q6DcSvCz5cCFC/CFAWWcLyBwJDeFyGTCTszgpQTb19+Fi8uRwZE5/3ziAQBFeDMQ==", "dependencies": { - "@smithy/protocol-http": "^3.0.9", - "@smithy/querystring-builder": "^2.0.13", - "@smithy/types": "^2.5.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/querystring-builder": "^2.0.16", + "@smithy/types": "^2.8.0", "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.15.tgz", - "integrity": "sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.18.tgz", + "integrity": "sha512-gN2JFvAgnZCyDN9rJgcejfpK0uPPJrSortVVVVWsru9whS7eQey6+gj2eM5ln2i6rHNntIXzal1Fm9XOPuoaKA==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" @@ -1161,11 +1177,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.13.tgz", - "integrity": "sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.16.tgz", + "integrity": "sha512-apEHakT/kmpNo1VFHP4W/cjfeP9U0x5qvfsLJubgp7UM/gq4qYp0GbqdE7QhsjUaYvEnrftRqs7+YrtWreV0wA==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" } }, @@ -1181,12 +1197,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.15.tgz", - "integrity": "sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.18.tgz", + "integrity": "sha512-ZJ9uKPTfxYheTKSKYB+GCvcj+izw9WGzRLhjn8n254q0jWLojUzn7Vw0l4R/Gq7Wdpf/qmk/ptD+6CCXHNVCaw==", "dependencies": { - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1194,16 +1210,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.0.tgz", - "integrity": "sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.3.0.tgz", + "integrity": "sha512-VsOAG2YQ8ykjSmKO+CIXdJBIWFo6AAvG6Iw95BakBTqk66/4BI7XyqLevoNSq/lZ6NgZv24sLmrcIN+fLDWBCg==", "dependencies": { - "@smithy/middleware-serde": "^2.0.13", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/shared-ini-file-loader": "^2.2.4", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-middleware": "^2.0.6", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/shared-ini-file-loader": "^2.2.8", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -1211,16 +1227,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.20.tgz", - "integrity": "sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.26.tgz", + "integrity": "sha512-Qzpxo0U5jfNiq9iD38U3e2bheXwvTEX4eue9xruIvEgh+UKq6dKuGqcB66oBDV7TD/mfoJi9Q/VmaiqwWbEp7A==", "dependencies": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/protocol-http": "^3.0.9", - "@smithy/service-error-classification": "^2.0.6", - "@smithy/types": "^2.5.0", - "@smithy/util-middleware": "^2.0.6", - "@smithy/util-retry": "^2.0.6", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/protocol-http": "^3.0.12", + "@smithy/service-error-classification": "^2.0.9", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/util-middleware": "^2.0.9", + "@smithy/util-retry": "^2.0.9", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -1237,11 +1254,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.13.tgz", - "integrity": "sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.16.tgz", + "integrity": "sha512-5EAd4t30pcc4M8TSSGq7q/x5IKrxfXR5+SrU4bgxNy7RPHQo2PSWBUco9C+D9Tfqp/JZvprRpK42dnupZafk2g==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1249,11 +1266,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.7.tgz", - "integrity": "sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.10.tgz", + "integrity": "sha512-I2rbxctNq9FAPPEcuA1ntZxkTKOPQFy7YBPOaD/MLg1zCvzv21CoNxR0py6J8ZVC35l4qE4nhxB0f7TF5/+Ldw==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1261,13 +1278,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.5.tgz", - "integrity": "sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.9.tgz", + "integrity": "sha512-tUyW/9xrRy+s7RXkmQhgYkAPMpTIF8izK4orhHjNFEKR3QZiOCbWB546Y8iB/Fpbm3O9+q0Af9rpywLKJOwtaQ==", "dependencies": { - "@smithy/property-provider": "^2.0.14", - "@smithy/shared-ini-file-loader": "^2.2.4", - "@smithy/types": "^2.5.0", + "@smithy/property-provider": "^2.0.17", + "@smithy/shared-ini-file-loader": "^2.2.8", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1275,14 +1292,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.9.tgz", - "integrity": "sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.2.tgz", + "integrity": "sha512-XO58TO/Eul/IBQKFKaaBtXJi0ItEQQCT+NI4IiKHCY/4KtqaUT6y/wC1EvDqlA9cP7Dyjdj7FdPs4DyynH3u7g==", "dependencies": { - "@smithy/abort-controller": "^2.0.13", - "@smithy/protocol-http": "^3.0.9", - "@smithy/querystring-builder": "^2.0.13", - "@smithy/types": "^2.5.0", + "@smithy/abort-controller": "^2.0.16", + "@smithy/protocol-http": "^3.0.12", + "@smithy/querystring-builder": "^2.0.16", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1290,11 +1307,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.14.tgz", - "integrity": "sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.17.tgz", + "integrity": "sha512-+VkeZbVu7qtQ2DjI48Qwaf9fPOr3gZIwxQpuLJgRRSkWsdSvmaTCxI3gzRFKePB63Ts9r4yjn4HkxSCSkdWmcQ==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1302,11 +1319,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", - "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.12.tgz", + "integrity": "sha512-Xz4iaqLiaBfbQpB9Hgi3VcZYbP7xRDXYhd8XWChh4v94uw7qwmvlxdU5yxzfm6ACJM66phHrTbS5TVvj5uQ72w==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1314,11 +1331,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.13.tgz", - "integrity": "sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.16.tgz", + "integrity": "sha512-Q/GsJT0C0mijXMRs7YhZLLCP5FcuC4797lYjKQkME5CZohnLC4bEhylAd2QcD3gbMKNjCw8+T2I27WKiV/wToA==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -1327,11 +1344,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.13.tgz", - "integrity": "sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.16.tgz", + "integrity": "sha512-c4ueAuL6BDYKWpkubjrQthZKoC3L5kql5O++ovekNxiexRXTlLIVlCR4q3KziOktLIw66EU9SQljPXd/oN6Okg==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1339,22 +1356,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.6.tgz", - "integrity": "sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.9.tgz", + "integrity": "sha512-0K+8GvtwI7VkGmmInPydM2XZyBfIqLIbfR7mDQ+oPiz8mIinuHbV6sxOLdvX1Jv/myk7XTK9orgt3tuEpBu/zg==", "dependencies": { - "@smithy/types": "^2.5.0" + "@smithy/types": "^2.8.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.4.tgz", - "integrity": "sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.8.tgz", + "integrity": "sha512-E62byatbwSWrtq9RJ7xN40tqrRKDGrEL4EluyNpaIDvfvet06a/QC58oHw2FgVaEgkj0tXZPjZaKrhPfpoU0qw==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1362,15 +1379,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.15.tgz", - "integrity": "sha512-SRTEJSEhQYVlBKIIdZ9SZpqW+KFqxqcNnEcBX+8xkDdWx+DItme9VcCDkdN32yTIrICC+irUufnUdV7mmHPjoA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.19.tgz", + "integrity": "sha512-nwc3JihdM+kcJjtORv/n7qRHN2Kfh7S2RJI2qr8pz9UcY5TD8rSCRGQ0g81HgyS3jZ5X9U/L4p014P3FonBPhg==", "dependencies": { - "@smithy/eventstream-codec": "^2.0.13", + "@smithy/eventstream-codec": "^2.0.16", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.6", + "@smithy/util-middleware": "^2.0.9", "@smithy/util-uri-escape": "^2.0.0", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" @@ -1380,13 +1397,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.15.tgz", - "integrity": "sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.1.tgz", + "integrity": "sha512-SpD7FLK92XV2fon2hMotaNDa2w5VAy5/uVjP9WFmjGSgWM8pTPVkHcDl1yFs5Z8LYbij0FSz+DbCBK6i+uXXUA==", "dependencies": { - "@smithy/middleware-stack": "^2.0.7", - "@smithy/types": "^2.5.0", - "@smithy/util-stream": "^2.0.20", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", + "@smithy/util-stream": "^2.0.24", "tslib": "^2.5.0" }, "engines": { @@ -1394,9 +1413,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.5.0.tgz", - "integrity": "sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.8.0.tgz", + "integrity": "sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA==", "dependencies": { "tslib": "^2.5.0" }, @@ -1405,12 +1424,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.13.tgz", - "integrity": "sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.16.tgz", + "integrity": "sha512-Wfz5WqAoRT91TjRy1JeLR0fXtkIXHGsMbgzKFTx7E68SrZ55TB8xoG+vm11Ru4gheFTMXjAjwAxv1jQdC+pAQA==", "dependencies": { - "@smithy/querystring-parser": "^2.0.13", - "@smithy/types": "^2.5.0", + "@smithy/querystring-parser": "^2.0.16", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" } }, @@ -1427,9 +1446,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", "dependencies": { "tslib": "^2.5.0" } @@ -1458,9 +1477,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.1.0.tgz", + "integrity": "sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1469,13 +1488,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.19.tgz", - "integrity": "sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw==", + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.24.tgz", + "integrity": "sha512-TsP5mBuLgO2C21+laNG2nHYZEyUdkbGURv2tHvSuQQxLz952MegX95uwdxOY2jR2H4GoKuVRfdJq7w4eIjGYeg==", "dependencies": { - "@smithy/property-provider": "^2.0.14", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", + "@smithy/property-provider": "^2.0.17", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1484,16 +1503,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.25.tgz", - "integrity": "sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA==", + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.32.tgz", + "integrity": "sha512-d0S33dXA2cq1NyorVMroMrEtqKMr3MlyLITcfTBf9pXiigYiPMOtbSI7czHIfDbuVuM89Cg0urAgpt73QV9mPQ==", "dependencies": { - "@smithy/config-resolver": "^2.0.18", - "@smithy/credential-provider-imds": "^2.1.1", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/property-provider": "^2.0.14", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/credential-provider-imds": "^2.1.5", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/property-provider": "^2.0.17", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1501,12 +1520,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.4.tgz", - "integrity": "sha512-FPry8j1xye5yzrdnf4xKUXVnkQErxdN7bUIaqC0OFoGsv2NfD9b2UUMuZSSt+pr9a8XWAqj0HoyVNUfPiZ/PvQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.8.tgz", + "integrity": "sha512-l8zVuyZZ61IzZBYp5NWvsAhbaAjYkt0xg9R4xUASkg5SEeTT2meHOJwJHctKMFUXe4QZbn9fR2MaBYjP2119+w==", "dependencies": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1525,11 +1544,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.6.tgz", - "integrity": "sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.9.tgz", + "integrity": "sha512-PnCnBJ07noMX1lMDTEefmxSlusWJUiLfrme++MfK5TD0xz8NYmakgoXy5zkF/16zKGmiwOeKAztWT/Vjk1KRIQ==", "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1537,12 +1556,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.6.tgz", - "integrity": "sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.9.tgz", + "integrity": "sha512-46BFWe9RqB6g7f4mxm3W3HlqknqQQmWHKlhoqSFZuGNuiDU5KqmpebMbvC3tjTlUkqn4xa2Z7s3Hwb0HNs5scw==", "dependencies": { - "@smithy/service-error-classification": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/service-error-classification": "^2.0.9", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1550,13 +1569,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.20.tgz", - "integrity": "sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg==", + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.24.tgz", + "integrity": "sha512-hRpbcRrOxDriMVmbya+Mv77VZVupxRAsfxVDKS54XuiURhdiwCUXJP0X1iJhHinuUf6n8pBF0MkG9C8VooMnWw==", "dependencies": { - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/types": "^2.5.0", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/node-http-handler": "^2.2.2", + "@smithy/types": "^2.8.0", "@smithy/util-base64": "^2.0.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -1591,12 +1610,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.13.tgz", - "integrity": "sha512-YovIQatiuM7giEsRFotqJa2i3EbU2EE3PgtpXgtLgpx5rXiZMAwPxXYDFVFhuO0lbqvc/Zx4n+ZIisXOHPSqyg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.16.tgz", + "integrity": "sha512-5i4YONHQ6HoUWDd+X0frpxTXxSXgJhUFl+z0iMy/zpUmVeCQY2or3Vss6DzHKKMMQL4pmVHpQm9WayHDorFdZg==", "dependencies": { - "@smithy/abort-controller": "^2.0.13", - "@smithy/types": "^2.5.0", + "@smithy/abort-controller": "^2.0.16", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -1625,6 +1644,12 @@ "@types/node": "*" } }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "optional": true + }, "node_modules/@types/concat-stream": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", @@ -1684,16 +1709,6 @@ "@types/node": "*" } }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "optional": true, - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -1707,34 +1722,12 @@ "@types/node": "*" } }, - "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", - "optional": true - }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "optional": true }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "optional": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", - "optional": true - }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -1745,16 +1738,10 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "optional": true - }, "node_modules/@types/node": { - "version": "20.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", - "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dependencies": { "undici-types": "~5.26.4" } @@ -1769,14 +1756,30 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, - "node_modules/@types/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", "optional": true, "dependencies": { - "@types/glob": "*", - "@types/node": "*" + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, "node_modules/@types/send": { @@ -1851,15 +1854,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "optional": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/acorn-walk": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", @@ -1923,12 +1917,6 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "optional": true - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -2019,11 +2007,11 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2043,7 +2031,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "dev": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -2149,7 +2137,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "devOptional": true, + "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -2222,23 +2210,11 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "optional": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2254,7 +2230,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2313,9 +2289,9 @@ } }, "node_modules/cloudinary": { - "version": "1.41.0", - "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.0.tgz", - "integrity": "sha512-qFf2McjvILJITePf4VF1PrY/8c2zy+/q5FVV6V3VWrP/gpIZsusPqXL4QZ6ZKXibPRukzMYqsQEhaSQgJHKKow==", + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.2.tgz", + "integrity": "sha512-9gH6ofz+N8AzfjqtmTgB9lVxwWcroHFfMOOM6iiX/g1H+KYz+sArClXWtd0prRE6m/IoBBBbbaJ12yRdJNnMxA==", "dependencies": { "cloudinary-core": "^2.13.0", "core-js": "^3.30.1", @@ -2463,7 +2439,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true + "dev": true }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3084,15 +3060,6 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/escodegen": { "version": "1.14.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", @@ -3122,35 +3089,6 @@ "node": ">=4.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "optional": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "optional": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -3163,15 +3101,6 @@ "node": ">=4" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "optional": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3359,12 +3288,6 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "optional": true - }, "node_modules/fast-xml-parser": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", @@ -3458,14 +3381,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/firebase-admin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.11.0.tgz", - "integrity": "sha512-lp784gXFAJgUEtjSdYNZGTWZqltqjBkoaPSQhDKnmWXJP/MCbWdiDY1hsdkl/6O4O4KFovTjUDLu26sojwdQvw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", + "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", "dependencies": { "@fastify/busboy": "^1.2.1", - "@firebase/database-compat": "^0.3.4", - "@firebase/database-types": "^0.10.4", - "@types/node": ">=12.12.47", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^20.10.3", "jsonwebtoken": "^9.0.0", "jwks-rsa": "^3.0.1", "node-forge": "^1.3.1", @@ -3475,8 +3398,8 @@ "node": ">=14" }, "optionalDependencies": { - "@google-cloud/firestore": "^6.6.0", - "@google-cloud/storage": "^6.9.5" + "@google-cloud/firestore": "^7.1.0", + "@google-cloud/storage": "^7.7.0" } }, "node_modules/flat-util": { @@ -3490,9 +3413,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -3575,7 +3498,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true + "dev": true }, "node_modules/ftp": { "version": "0.3.10", @@ -3625,31 +3548,56 @@ "optional": true }, "node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "optional": true, "dependencies": { "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9" }, "engines": { - "node": ">=12" + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "optional": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", "optional": true, "dependencies": { - "gaxios": "^5.0.0", + "gaxios": "^6.0.0", "json-bigint": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/get-caller-file": { @@ -3710,112 +3658,43 @@ "assert-plus": "^1.0.0" } }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/google-auth-library": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", - "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.4.1.tgz", + "integrity": "sha512-Chs7cuzDuav8W/BXOoRgSXw4u0zxYtuqAHETDR5Q6dG1RwNwz7NUKjsDDHAsBV3KkiiJBtJqjbzy1XU1L41w1g==", "optional": true, "dependencies": { - "arrify": "^2.0.0", "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.3.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/google-gax": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz", - "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.0.5.tgz", + "integrity": "sha512-yLoYtp4zE+8OQA74oBEbNkbzI6c95W01JSL7RqC8XERKpRvj3ytZp1dgnbA6G9aRsc8pZB25xWYBcCmrbYOEhA==", "optional": true, "dependencies": { - "@grpc/grpc-js": "~1.8.0", + "@grpc/grpc-js": "~1.9.6", "@grpc/proto-loader": "^0.7.0", "@types/long": "^4.0.0", - "@types/rimraf": "^3.0.2", "abort-controller": "^3.0.0", "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^8.0.2", - "is-stream-ended": "^0.1.4", + "google-auth-library": "^9.0.0", "node-fetch": "^2.6.1", "object-hash": "^3.0.0", - "proto3-json-serializer": "^1.0.0", - "protobufjs": "7.2.4", - "protobufjs-cli": "1.1.1", - "retry-request": "^5.0.0" - }, - "bin": { - "compileProtos": "build/tools/compileProtos.js", - "minifyProtoJson": "build/tools/minify.js" + "proto3-json-serializer": "^2.0.0", + "protobufjs": "7.2.5", + "retry-request": "^7.0.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/google-gax/node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/google-p12-pem": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", - "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", - "optional": true, - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" + "node": ">=14" } }, "node_modules/gopd": { @@ -3863,17 +3742,16 @@ } }, "node_modules/gtoken": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", - "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz", + "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", "optional": true, "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", + "gaxios": "^6.0.0", "jws": "^4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/gzip-size": { @@ -3916,7 +3794,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -4081,7 +3959,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4227,12 +4105,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "optional": true - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -4333,67 +4205,11 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "optional": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, - "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", - "optional": true, - "dependencies": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsdoc/node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "optional": true - }, "node_modules/json-2-csv": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-5.0.1.tgz", @@ -4536,15 +4352,6 @@ "xmldom": "^0.1.21" } }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -4567,15 +4374,6 @@ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "optional": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, "node_modules/list-stylesheets": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-2.0.1.tgz", @@ -4705,59 +4503,6 @@ "make-error": "^1.2.0" } }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "optional": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "optional": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "optional": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "optional": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "optional": true - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4827,7 +4572,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "devOptional": true, + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4855,17 +4600,17 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } }, "node_modules/moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", "dependencies": { "moment": "^2.29.4" }, @@ -4945,11 +4690,11 @@ } }, "node_modules/node-mailjet": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/node-mailjet/-/node-mailjet-6.0.4.tgz", - "integrity": "sha512-gNWfbVnsH+KxkhfDLPA8OrQ2Q25OgyKp19C7DSJYmN2zNfqTKIXzhB9BZwgxZtErmPxz2Fp1NR18WPCmrJDuwg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/node-mailjet/-/node-mailjet-6.0.5.tgz", + "integrity": "sha512-upufsTkMyrDF7Z6OiJ4M4Yw4L6MkB0vOQB27W1V9q0CxxSA6e2xOJif3koPwwwgDELpbJNG7asZjKFdghtxUCw==", "dependencies": { - "axios": "^0.27.2", + "axios": "1.6.2", "json-bigint": "^1.0.0", "url-join": "^4.0.0" }, @@ -4959,18 +4704,19 @@ } }, "node_modules/node-mailjet/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/node-persist": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-3.1.3.tgz", - "integrity": "sha512-CaFv+kSZtsc+VeDRldK1yR47k1vPLBpzYB9re2z7LIwITxwBtljMq3s8VQnnr+x3E8pQfHbc5r2IyJsBLJhtXg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-4.0.1.tgz", + "integrity": "sha512-QtRjwAlcOQChQpfG6odtEhxYmA3nS5XYr+bx9JRjwahl1TM3sm9J3CCn51/MI0eoHRb2DrkEsCOFo8sq8jG5sQ==", "engines": { "node": ">=10.12.0" } @@ -5005,9 +4751,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", - "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", + "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", "engines": { "node": ">=6.0.0" } @@ -5205,7 +4951,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5221,9 +4967,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/phone": { - "version": "3.1.41", - "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.41.tgz", - "integrity": "sha512-sjYk1DdjYqSbcfYyeHQ6FNXr2RH7gHtkQflyleSBQ0V83db3tO9sXHhsr5WyYdsXaOW2tBg4p+P8HVgwFRJp+Q==", + "version": "3.1.42", + "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.42.tgz", + "integrity": "sha512-J+cbZtGcN/ph10TRxwCLYZx9/k4WOU1wImMiUiUjr/2sWnY7bR7CadehbsM8E9UyG+/shgmH++eKbhD0kR4EZA==", "engines": { "node": ">=12" } @@ -5298,15 +5044,15 @@ } }, "node_modules/proto3-json-serializer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz", - "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.0.tgz", + "integrity": "sha512-FB/YaNrpiPkyQNSNPilpn8qn0KdEfkgmJ9JP93PQyF/U4bAiXY5BiUdDhiDO4S48uSQ6AesklgVlrKiqZPzegw==", "optional": true, "dependencies": { "protobufjs": "^7.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/protobufjs": { @@ -5333,34 +5079,6 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs-cli": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", - "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", - "optional": true, - "dependencies": { - "chalk": "^4.0.0", - "escodegen": "^1.13.0", - "espree": "^9.0.0", - "estraverse": "^5.1.0", - "glob": "^8.0.0", - "jsdoc": "^4.0.0", - "minimist": "^1.2.0", - "semver": "^7.1.2", - "tmp": "^0.2.1", - "uglify-js": "^3.7.7" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "protobufjs": "^7.0.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -5644,15 +5362,6 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, - "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "optional": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -5663,16 +5372,18 @@ } }, "node_modules/retry-request": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", - "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.1.tgz", + "integrity": "sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ==", "optional": true, "dependencies": { + "@types/request": "^2.48.8", "debug": "^4.1.1", - "extend": "^3.0.2" + "extend": "^3.0.2", + "teeny-request": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/rimraf": { @@ -5954,9 +5665,9 @@ } }, "node_modules/socket.io": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", + "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -6357,22 +6068,10 @@ "node": ">=4" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stripe": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.5.0.tgz", - "integrity": "sha512-MTt0P0VYDAj2VZyZMW41AxcXVs9s06EDFIHYat4UUkluJgnBHo4T4E2byPhnxoJCPvdzWBwBLnhWbSOg//VTpA==", + "version": "14.11.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.11.0.tgz", + "integrity": "sha512-NmFEkDC0PldP7CQtdPgKs5dVZA/pF+IepldbmB+Kk9B4d7EBkWnbANp0y+/zJcbRGul48s8hmQzeqNWUlWW0wg==", "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" @@ -6478,19 +6177,19 @@ } }, "node_modules/teeny-request": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", - "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", "optional": true, "dependencies": { "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.9", "stream-events": "^1.0.5", "uuid": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/teeny-request/node_modules/@tootallnate/once": { @@ -6539,75 +6238,6 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "optional": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/tmp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tmp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -6680,11 +6310,11 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/twilio": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.19.0.tgz", - "integrity": "sha512-4tM1LNM5LeUvnko4kIqIreY6vmjIo5Ag5jMEhjTDPj+GES82MnkfSkJv8N1k5/ZmeSvIdk5hjI87GB/DpDDePQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.20.0.tgz", + "integrity": "sha512-Dl49awVTgv9LOLrmXi7elKa2mb69rtkwJHlKNbIR9HjXN7q66gEEaiZsE6gdr+Wfk/zInOvPDVBCdQM+SYXqkA==", "dependencies": { - "axios": "^0.26.1", + "axios": "^1.6.0", "dayjs": "^1.11.9", "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^9.0.0", @@ -6697,14 +6327,6 @@ "node": ">=14.0" } }, - "node_modules/twilio/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -6733,24 +6355,6 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "optional": true - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -7066,12 +6670,6 @@ "node": ">=12.0" } }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "optional": true - }, "node_modules/xmldom": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", diff --git a/package.json b/package.json index b506b10ba..175d7cd6e 100644 --- a/package.json +++ b/package.json @@ -17,15 +17,15 @@ "start": "node server.js" }, "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.454.0", - "@aws-sdk/client-ses": "^3.454.0", - "@aws-sdk/credential-provider-node": "^3.451.0", - "@opensearch-project/opensearch": "^2.4.0", + "@aws-sdk/client-secrets-manager": "^3.490.0", + "@aws-sdk/client-ses": "^3.490.0", + "@aws-sdk/credential-provider-node": "^3.490.0", + "@opensearch-project/opensearch": "^2.5.0", "aws4": "^1.12.0", - "axios": "^1.6.2", + "axios": "^1.6.5", "bluebird": "^3.7.2", "body-parser": "^1.20.2", - "cloudinary": "^1.41.0", + "cloudinary": "^1.41.2", "compression": "^1.7.4", "cookie-parser": "^1.4.6", "cors": "2.8.5", @@ -33,7 +33,7 @@ "dinero.js": "^1.9.1", "dotenv": "^16.3.1", "express": "^4.18.2", - "firebase-admin": "^11.11.0", + "firebase-admin": "^12.0.0", "graphql": "^16.8.1", "graphql-request": "^6.1.0", "graylog2": "^0.2.1", @@ -41,20 +41,20 @@ "intuit-oauth": "^4.0.0", "json-2-csv": "^5.0.1", "lodash": "^4.17.21", - "moment": "^2.29.4", - "moment-timezone": "^0.5.41", + "moment": "^2.30.1", + "moment-timezone": "^0.5.44", "multer": "^1.4.5-lts.1", - "node-mailjet": "^6.0.4", - "node-persist": "^3.1.3", + "node-mailjet": "^6.0.5", + "node-persist": "^4.0.1", "node-quickbooks": "^2.0.43", - "nodemailer": "^6.9.7", - "phone": "^3.1.41", + "nodemailer": "^6.9.8", + "phone": "^3.1.42", "recursive-diff": "^1.0.9", "soap": "^1.0.0", - "socket.io": "^4.7.2", + "socket.io": "^4.7.4", "ssh2-sftp-client": "^9.1.0", - "stripe": "^14.5.0", - "twilio": "^4.19.0", + "stripe": "^14.11.0", + "twilio": "^4.20.0", "uuid": "^9.0.1", "xml2js": "^0.6.2", "xmlbuilder2": "^3.1.1" diff --git a/server.js b/server.js index b54aefb78..b78edfb77 100644 --- a/server.js +++ b/server.js @@ -36,6 +36,10 @@ const io = new Server(server, { "https://www.imex.online", "https://romeonline.io", "https://www.romeonline.io", + "https://beta.test.romeonline.io", + "https://www.beta.test.romeonline.io", + "https://beta.romeonline.io", + "https://www.beta.romeonline.io", ], methods: ["GET", "POST"], credentials: true, @@ -230,6 +234,7 @@ app.post("/qbo/payments", fb.validateFirebaseIdToken, qbo.payments); var data = require("./server/data/data"); app.post("/data/ah", data.autohouse); app.post("/data/cc", data.claimscorp); +app.post("/data/kaizen", data.kaizen); app.post("/record-handler/arms", data.arms); var taskHandler = require("./server/tasks/tasks"); diff --git a/server/data/claimscorp.js b/server/data/claimscorp.js index 60943aed3..1768f6eb1 100644 --- a/server/data/claimscorp.js +++ b/server/data/claimscorp.js @@ -507,7 +507,7 @@ const CreateRepairOrderTag = (job, errorCallback) => { Body: repairCosts.BodyLaborTotalCost.toFormat(CCDineroFormat), Paint: repairCosts.RefinishLaborTotalCost.toFormat(CCDineroFormat), Prep: Dinero().toFormat(CCDineroFormat), - Frame: Dinero(job.job_totals.rates.laf.total).toFormat(CCDineroFormat), + Frame: repairCosts.FrameLaborTotalCost.toFormat(CCDineroFormat), Mech: repairCosts.MechanicalLaborTotalCost.toFormat(CCDineroFormat), Glass: repairCosts.GlassLaborTotalCost.toFormat(CCDineroFormat), Elec: repairCosts.ElectricalLaborTotalCost.toFormat(CCDineroFormat), diff --git a/server/data/data.js b/server/data/data.js index 077f9f134..18ec4c321 100644 --- a/server/data/data.js +++ b/server/data/data.js @@ -1,3 +1,4 @@ +exports.arms = require("./arms").default; exports.autohouse = require("./autohouse").default; exports.claimscorp = require("./claimscorp").default; -exports.arms = require("./arms").default; \ No newline at end of file +exports.kaizen = require("./kaizen").default; \ No newline at end of file diff --git a/server/data/kaizen.js b/server/data/kaizen.js new file mode 100644 index 000000000..0d3720d25 --- /dev/null +++ b/server/data/kaizen.js @@ -0,0 +1,837 @@ +const path = require("path"); +const queries = require("../graphql-client/queries"); +const Dinero = require("dinero.js"); +const moment = require("moment-timezone"); +var builder = require("xmlbuilder2"); +const _ = require("lodash"); +const logger = require("../utils/logger"); +const fs = require("fs"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +let Client = require("ssh2-sftp-client"); + +const client = require("../graphql-client/graphql-client").client; +const { sendServerEmail } = require("../email/sendemail"); +const DineroFormat = "0,0.00"; +const DateFormat = "MM/DD/YYYY"; + +const repairOpCodes = ["OP4", "OP9", "OP10"]; +const replaceOpCodes = ["OP2", "OP5", "OP11", "OP12"]; + +const ftpSetup = { + host: process.env.KAIZEN_HOST, + port: process.env.KAIZEN_PORT, + username: process.env.KAIZEN_USER, + password: process.env.KAIZEN_PASSWORD, + debug: (message, ...data) => logger.log(message, "DEBUG", "api", null, data), + algorithms: { + serverHostKey: [ + "ssh-rsa", + "ssh-dss", + "rsa-sha2-256", + "rsa-sha2-512", + "ecdsa-sha2-nistp256", + "ecdsa-sha2-nistp384", + ], + }, +}; + +exports.default = async (req, res) => { + //Query for the List of Bodyshop Clients. + logger.log("kaizen-start", "DEBUG", "api", null, null); + const kaizenShopsIDs = ["SUMMIT", "STRATHMORE", "SUNRIDGE"]; + + const { bodyshops } = await client.request(queries.GET_KAIZEN_SHOPS, { + imexshopid: kaizenShopsIDs, + }); + + const specificShopIds = req.body.bodyshopIds; // ['uuid] + const { start, end, skipUpload } = req.body; //YYYY-MM-DD + if (req.headers["x-imex-auth"] !== process.env.AUTOHOUSE_AUTH_TOKEN) { + res.sendStatus(401); + return; + } + const allxmlsToUpload = []; + const allErrors = []; + try { + for (const bodyshop of specificShopIds + ? bodyshops.filter((b) => specificShopIds.includes(b.id)) + : bodyshops) { + logger.log("kaizen-start-shop-extract", "DEBUG", "api", bodyshop.id, { + shopname: bodyshop.shopname, + }); + const erroredJobs = []; + try { + const { jobs, bodyshops_by_pk } = await client.request( + queries.KAIZEN_QUERY, + { + bodyshopid: bodyshop.id, + start: start + ? moment(start).startOf("hours") + : moment().subtract(2, "hours").startOf("hour"), + ...(end && { end: moment(end).endOf("hours") }), + } + ); + + const kaizenObject = { + DataFeed: { + ShopInfo: { + ShopName: bodyshops_by_pk.shopname, + Jobs: jobs.map((j) => + CreateRepairOrderTag( + { ...j, bodyshop: bodyshops_by_pk }, + function ({ job, error }) { + erroredJobs.push({ job: job, error: error.toString() }); + } + ) + ), + }, + }, + }; + + if (erroredJobs.length > 0) { + logger.log("kaizen-failed-jobs", "ERROR", "api", bodyshop.id, { + count: erroredJobs.length, + jobs: JSON.stringify(erroredJobs.map((j) => j.job.ro_number)), + }); + } + + var ret = builder + .create( + { + // version: "1.0", + // encoding: "UTF-8", + //keepNullNodes: true, + }, + kaizenObject + ) + .end({ allowEmptyTags: true }); + + allxmlsToUpload.push({ + count: kaizenObject.DataFeed.ShopInfo.Jobs.length, + xml: ret, + filename: `${bodyshop.shopname}-${moment().format( + "YYYYMMDDTHHMMss" + )}.xml`, + }); + + logger.log("kaizen-end-shop-extract", "DEBUG", "api", bodyshop.id, { + shopname: bodyshop.shopname, + }); + } catch (error) { + //Error at the shop level. + logger.log("kaizen-error-shop", "ERROR", "api", bodyshop.id, { + ...error, + }); + + allErrors.push({ + bodyshopid: bodyshop.id, + imexshopid: bodyshop.imexshopid, + shopname: bodyshop.shopname, + fatal: true, + errors: [error.toString()], + }); + } finally { + allErrors.push({ + bodyshopid: bodyshop.id, + imexshopid: bodyshop.imexshopid, + shopname: bodyshop.shopname, + errors: erroredJobs.map((ej) => ({ + ro_number: ej.job?.ro_number, + jobid: ej.job?.id, + error: ej.error, + })), + }); + } + } + + if (skipUpload) { + for (const xmlObj of allxmlsToUpload) { + fs.writeFileSync(`./logs/${xmlObj.filename}`, xmlObj.xml); + } + + res.json(allxmlsToUpload); + sendServerEmail({ + subject: `Kaizen Report ${moment().format("MM-DD-YY")}`, + text: `Errors: ${allErrors.map((e) => JSON.stringify(e, null, 2))} + Uploaded: ${JSON.stringify( + allxmlsToUpload.map((x) => ({ filename: x.filename, count: x.count })), + null, + 2 + )} + `, + }); + return; + } + + let sftp = new Client(); + sftp.on("error", (errors) => + logger.log("kaizen-sftp-error", "ERROR", "api", null, { + ...errors, + }) + ); + try { + //Connect to the FTP and upload all. + + await sftp.connect(ftpSetup); + + for (const xmlObj of allxmlsToUpload) { + logger.log("kaizen-sftp-upload", "DEBUG", "api", null, { + filename: xmlObj.filename, + }); + + const uploadResult = await sftp.put( + Buffer.from(xmlObj.xml), + `/${xmlObj.filename}` + ); + logger.log("kaizen-sftp-upload-result", "DEBUG", "api", null, { + uploadResult, + }); + } + + //***TODO Change filing naming when creating the cron job. IM_ShopInternalName_DDMMYYYY_HHMMSS.xml + } catch (error) { + logger.log("kaizen-sftp-error", "ERROR", "api", null, { + ...error, + }); + } finally { + sftp.end(); + } + sendServerEmail({ + subject: `Kaizen Report ${moment().format("MM-DD-YY")}`, + text: `Errors: ${allErrors.map((e) => JSON.stringify(e, null, 2))} + Uploaded: ${JSON.stringify( + allxmlsToUpload.map((x) => ({ filename: x.filename, count: x.count })), + null, + 2 + )} + `, + }); + res.sendStatus(200); + } catch (error) { + res.status(200).json(error); + } +}; + +const CreateRepairOrderTag = (job, errorCallback) => { + //Level 2 + + if (!job.job_totals) { + errorCallback({ + jobid: job.id, + job: job, + ro_number: job.ro_number, + error: { toString: () => "No job totals for RO." }, + }); + return {}; + } + + const repairCosts = CreateCosts(job); + + try { + const ret = { + JobID: job.id, + RoNumber: job.ro_number, + JobStatus: job.tlos_ind + ? "Total Loss" + : job.ro_number + ? job.status + : "Estimate", + Customer: { + CompanyName: job.ownr_co_nm?.trim() || "", + FirstName: job.ownr_fn?.trim() || "", + LastName: job.ownr_ln?.trim() || "", + Address1: job.ownr_addr1?.trim() || "", + Address2: job.ownr_addr2?.trim() || "", + City: job.ownr_city?.trim() || "", + State: job.ownr_st?.trim() || "", + Zip: job.ownr_zip?.trim() || "", + }, + Vehicle: { + Year: job.v_model_yr + ? parseInt(job.v_model_yr.match(/\d/g)) + ? parseInt(job.v_model_yr.match(/\d/g).join(""), 10) + : "" + : "", + Make: job.v_make_desc || "", + Model: job.v_model_desc || "", + BodyStyle: job.vehicle?.v_bstyle || "", + Color: job.v_color || "", + VIN: job.v_vin || "", + PlateNo: job.plate_no || "", + }, + InsuranceCompany: job.ins_co_nm || "", + Claim: job.clm_no || "", + Contacts: { + CSR: job.employee_csr_rel + ? `${ + job.employee_csr_rel.last_name + ? job.employee_csr_rel.last_name + : "" + }${job.employee_csr_rel.last_name ? ", " : ""}${ + job.employee_csr_rel.first_name + ? job.employee_csr_rel.first_name + : "" + }` + : "", + Estimator: `${job.est_ct_ln ? job.est_ct_ln : ""}${ + job.est_ct_ln ? ", " : "" + }${job.est_ct_fn ? job.est_ct_fn : ""}`, + }, + Dates: { + DateEstimated: + (job.date_estimated && + moment(job.date_estimated).format(DateFormat)) || + "", + DateOpened: + (job.date_opened && moment(job.date_opened).format(DateFormat)) || "", + DateScheduled: + (job.scheduled_in && + moment(job.scheduled_in) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateArrived: + (job.actual_in && + moment(job.actual_in) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateStart: job.date_repairstarted + ? (job.date_repairstarted && + moment(job.date_repairstarted) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "" + : (job.actual_in && + moment(job.actual_in) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateScheduledCompletion: + (job.scheduled_completion && + moment(job.scheduled_completion) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateCompleted: + (job.actual_completion && + moment(job.actual_completion) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateScheduledDelivery: + (job.scheduled_delivery && + moment(job.scheduled_delivery) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateDelivered: + (job.actual_delivery && + moment(job.actual_delivery) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateInvoiced: + (job.date_invoiced && + moment(job.date_invoiced) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + DateExported: + (job.date_exported && + moment(job.date_exported) + .tz(job.bodyshop.timezone) + .format(DateFormat)) || + "", + }, + Sales: { + Labour: { + Aluminum: Dinero(job.job_totals.rates.laa.total).toFormat( + DineroFormat + ), + Body: Dinero(job.job_totals.rates.lab.total).toFormat(DineroFormat), + Diagnostic: Dinero(job.job_totals.rates.lad.total).toFormat( + DineroFormat + ), + Electrical: Dinero(job.job_totals.rates.lae.total).toFormat( + DineroFormat + ), + Frame: Dinero(job.job_totals.rates.laf.total).toFormat(DineroFormat), + Glass: Dinero(job.job_totals.rates.lag.total).toFormat(DineroFormat), + Mechanical: Dinero(job.job_totals.rates.lam.total).toFormat( + DineroFormat + ), + OtherLabour: Dinero(job.job_totals.rates.la1.total) + .add(Dinero(job.job_totals.rates.la2.total)) + .add(Dinero(job.job_totals.rates.la3.total)) + .add(Dinero(job.job_totals.rates.la4.total)) + .add(Dinero(job.job_totals.rates.lau.total)) + .toFormat(DineroFormat), + Refinish: Dinero(job.job_totals.rates.lar.total).toFormat( + DineroFormat + ), + Structural: Dinero(job.job_totals.rates.las.total).toFormat( + DineroFormat + ), + }, + Materials: { + Body: Dinero(job.job_totals.rates.mash.total).toFormat(DineroFormat), + Refinish: Dinero(job.job_totals.rates.mapa.total).toFormat( + DineroFormat + ), + }, + Parts: { + Aftermarket: Dinero( + job.job_totals.parts.parts.list.PAA && + job.job_totals.parts.parts.list.PAA.total + ).toFormat(DineroFormat), + LKQ: Dinero( + job.job_totals.parts.parts.list.PAL && + job.job_totals.parts.parts.list.PAL.total + ).toFormat(DineroFormat), + OEM: Dinero( + job.job_totals.parts.parts.list.PAN && + job.job_totals.parts.parts.list.PAN.total + ) + .add( + Dinero( + job.job_totals.parts.parts.list.PAP && + job.job_totals.parts.parts.list.PAP.total + ) + ) + .toFormat(DineroFormat), + OtherParts: Dinero( + job.job_totals.parts.parts.list.PAO && + job.job_totals.parts.parts.list.PAO.total + ).toFormat(DineroFormat), + Reconditioned: Dinero( + job.job_totals.parts.parts.list.PAM && + job.job_totals.parts.parts.list.PAM.total + ).toFormat(DineroFormat), + TotalParts: Dinero( + job.job_totals.parts.parts.list.PAA && + job.job_totals.parts.parts.list.PAA.total + ) + .add( + Dinero( + job.job_totals.parts.parts.list.PAL && + job.job_totals.parts.parts.list.PAL.total + ) + ) + .add( + Dinero( + job.job_totals.parts.parts.list.PAN && + job.job_totals.parts.parts.list.PAN.total + ) + ) + .add( + Dinero( + job.job_totals.parts.parts.list.PAO && + job.job_totals.parts.parts.list.PAO.total + ) + ) + .add( + Dinero( + job.job_totals.parts.parts.list.PAM && + job.job_totals.parts.parts.list.PAM.total + ) + ) + .toFormat(DineroFormat), + }, + OtherSales: Dinero(job.job_totals.additional.storage).toFormat( + DineroFormat + ), + Sublet: Dinero(job.job_totals.parts.sublets.total).toFormat( + DineroFormat + ), + Towing: Dinero(job.job_totals.additional.towing).toFormat(DineroFormat), + ATS: + job.job_totals.additional.additionalCostItems.includes( + "ATS Amount" + ) === true + ? Dinero( + job.job_totals.additional.additionalCostItems[ + job.job_totals.additional.additionalCostItems.indexOf( + "ATS Amount" + ) + ].total + ).toFormat(DineroFormat) + : Dinero().toFormat(DineroFormat), + SaleSubtotal: Dinero(job.job_totals.totals.subtotal).toFormat( + DineroFormat + ), + Tax: Dinero(job.job_totals.totals.local_tax) + .add(Dinero(job.job_totals.totals.state_tax)) + .add(Dinero(job.job_totals.totals.federal_tax)) + .add(Dinero(job.job_totals.additional.pvrt)) + .toFormat(DineroFormat), + SaleTotal: Dinero(job.job_totals.totals.total_repairs).toFormat( + DineroFormat + ), + }, + SaleHours: { + Aluminum: job.job_totals.rates.laa.hours.toFixed(2), + Body: job.job_totals.rates.lab.hours.toFixed(2), + Diagnostic: job.job_totals.rates.lad.hours.toFixed(2), + Electrical: job.job_totals.rates.lae.hours.toFixed(2), + Frame: job.job_totals.rates.laf.hours.toFixed(2), + Glass: job.job_totals.rates.lag.hours.toFixed(2), + Mechanical: job.job_totals.rates.lam.hours.toFixed(2), + Other: ( + job.job_totals.rates.la1.hours + + job.job_totals.rates.la2.hours + + job.job_totals.rates.la3.hours + + job.job_totals.rates.la4.hours + + job.job_totals.rates.lau.hours + ).toFixed(2), + Refinish: job.job_totals.rates.lar.hours.toFixed(2), + Structural: job.job_totals.rates.las.hours.toFixed(2), + TotalHours: job.joblines + .reduce((acc, val) => acc + val.mod_lb_hrs, 0) + .toFixed(2), + }, + Costs: { + Labour: { + Aluminum: repairCosts.AluminumLabourTotalCost.toFormat(DineroFormat), + Body: repairCosts.BodyLabourTotalCost.toFormat(DineroFormat), + Diagnostic: + repairCosts.DiagnosticLabourTotalCost.toFormat(DineroFormat), + Electrical: + repairCosts.ElectricalLabourTotalCost.toFormat(DineroFormat), + Frame: repairCosts.FrameLabourTotalCost.toFormat(DineroFormat), + Glass: repairCosts.GlassLabourTotalCost.toFormat(DineroFormat), + Mechancial: + repairCosts.MechanicalLabourTotalCost.toFormat(DineroFormat), + OtherLabour: repairCosts.LabourMiscTotalCost.toFormat(DineroFormat), + Refinish: repairCosts.RefinishLabourTotalCost.toFormat(DineroFormat), + Structural: + repairCosts.StructuralLabourTotalCost.toFormat(DineroFormat), + TotalLabour: repairCosts.LabourTotalCost.toFormat(DineroFormat), + }, + Materials: { + Body: repairCosts.BMTotalCost.toFormat(DineroFormat), + Refinish: repairCosts.PMTotalCost.toFormat(DineroFormat), + }, + Parts: { + Aftermarket: repairCosts.PartsAMCost.toFormat(DineroFormat), + LKQ: repairCosts.PartsRecycledCost.toFormat(DineroFormat), + OEM: repairCosts.PartsOemCost.toFormat(DineroFormat), + OtherCost: repairCosts.PartsOtherCost.toFormat(DineroFormat), + Reconditioned: + repairCosts.PartsReconditionedCost.toFormat(DineroFormat), + TotalParts: repairCosts.PartsAMCost.add(repairCosts.PartsRecycledCost) + .add(repairCosts.PartsReconditionedCost) + .add(repairCosts.PartsOemCost) + .add(repairCosts.PartsOtherCost) + .toFormat(DineroFormat), + }, + Sublet: repairCosts.SubletTotalCost.toFormat(DineroFormat), + Towing: repairCosts.TowingTotalCost.toFormat(DineroFormat), + ATS: Dinero().toFormat(DineroFormat), + Storage: repairCosts.StorageTotalCost.toFormat(DineroFormat), + CostTotal: repairCosts.TotalCost.toFormat(DineroFormat), + }, + CostHours: { + Aluminum: repairCosts.AluminumLabourTotalHrs.toFixed(2), + Body: repairCosts.BodyLabourTotalHrs.toFixed(2), + Diagnostic: repairCosts.DiagnosticLabourTotalHrs.toFixed(2), + Refinish: repairCosts.RefinishLabourTotalHrs.toFixed(2), + Frame: repairCosts.FrameLabourTotalHrs.toFixed(2), + Mechanical: repairCosts.MechanicalLabourTotalHrs.toFixed(2), + Glass: repairCosts.GlassLabourTotalHrs.toFixed(2), + Electrical: repairCosts.ElectricalLabourTotalHrs.toFixed(2), + Structural: repairCosts.StructuralLabourTotalHrs.toFixed(2), + Other: repairCosts.LabourMiscTotalHrs.toFixed(2), + CostTotalHours: repairCosts.TotalHrs.toFixed(2), + }, + }; + return ret; + } catch (error) { + logger.log("kaizen-job-calculate-error", "ERROR", "api", null, { + error, + }); + + errorCallback({ jobid: job.id, ro_number: job.ro_number, error }); + } +}; + +const CreateCosts = (job) => { + //Create a mapping based on AH Requirements + + //For DMS, the keys in the object below are the CIECA part types. + const billTotalsByCostCenters = job.bills.reduce((bill_acc, bill_val) => { + //At the bill level. + bill_val.billlines.map((line_val) => { + //At the bill line level. + + if (!bill_acc[line_val.cost_center]) + bill_acc[line_val.cost_center] = Dinero(); + + bill_acc[line_val.cost_center] = bill_acc[line_val.cost_center].add( + Dinero({ + amount: Math.round((line_val.actual_cost || 0) * 100), + }) + .multiply(line_val.quantity) + .multiply(bill_val.is_credit_memo ? -1 : 1) + ); + + return null; + }); + return bill_acc; + }, {}); + + //If the hourly rates for job costing are set, add them in. + if ( + job.bodyshop.jc_hourly_rates && + (job.bodyshop.jc_hourly_rates.mapa || + typeof job.bodyshop.jc_hourly_rates.mapa === "number" || + isNaN(job.bodyshop.jc_hourly_rates.mapa) === false) + ) { + if ( + !billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ] + ) + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ] = Dinero(); + if (job.bodyshop.use_paint_scale_data === true) { + if (job.mixdata.length > 0) { + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ] = Dinero({ + amount: Math.round( + ((job.mixdata[0] && job.mixdata[0].totalliquidcost) || 0) * 100 + ), + }); + } else { + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ] = billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ].add( + Dinero({ + amount: Math.round( + (job.bodyshop.jc_hourly_rates && + job.bodyshop.jc_hourly_rates.mapa * 100) || + 0 + ), + }).multiply(job.job_totals.rates.mapa.hours) + ); + } + } else { + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ] = billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MAPA + ].add( + Dinero({ + amount: Math.round( + (job.bodyshop.jc_hourly_rates && + job.bodyshop.jc_hourly_rates.mapa * 100) || + 0 + ), + }).multiply(job.job_totals.rates.mapa.hours) + ); + } + } + if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mash) { + if ( + !billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] + ) + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] = Dinero(); + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] = billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ].add( + Dinero({ + amount: Math.round( + (job.bodyshop.jc_hourly_rates && + job.bodyshop.jc_hourly_rates.mash * 100) || + 0 + ), + }).multiply(job.job_totals.rates.mash.hours) + ); + } + //Uses CIECA Labour types. + const ticketTotalsByCostCenter = job.timetickets.reduce( + (ticket_acc, ticket_val) => { + //At the invoice level. + if (!ticket_acc[ticket_val.cost_center]) + ticket_acc[ticket_val.cost_center] = Dinero(); + + ticket_acc[ticket_val.cost_center] = ticket_acc[ + ticket_val.cost_center + ].add( + Dinero({ + amount: Math.round((ticket_val.rate || 0) * 100), + }).multiply( + (ticket_val.flat_rate + ? ticket_val.productivehrs + : ticket_val.actualhrs) || 0 + ) + ); + + return ticket_acc; + }, + {} + ); + const ticketHrsByCostCenter = job.timetickets.reduce( + (ticket_acc, ticket_val) => { + //At the invoice level. + if (!ticket_acc[ticket_val.cost_center]) + ticket_acc[ticket_val.cost_center] = 0; + + ticket_acc[ticket_val.cost_center] = + ticket_acc[ticket_val.cost_center] + + (ticket_val.flat_rate + ? ticket_val.productivehrs + : ticket_val.actualhrs) || 0; + + return ticket_acc; + }, + {} + ); + //CIECA STANDARD MAPPING OBJECT. + + const ciecaObj = { + ATS: "ATS", + LA1: "LA1", + LA2: "LA2", + LA3: "LA3", + LA4: "LA4", + LAA: "LAA", + LAB: "LAB", + LAD: "LAD", + LAE: "LAE", + LAF: "LAF", + LAG: "LAG", + LAM: "LAM", + LAR: "LAR", + LAS: "LAS", + LAU: "LAU", + PAA: "PAA", + PAC: "PAC", + PAG: "PAG", + PAL: "PAL", + PAM: "PAM", + PAN: "PAN", + PAO: "PAO", + PAP: "PAP", + PAR: "PAR", + PAS: "PAS", + TOW: "TOW", + MAPA: "MAPA", + MASH: "MASH", + PASL: "PASL", + }; + const defaultCosts = + job.bodyshop.cdk_dealerid || job.bodyshop.pbs_serialnumber + ? ciecaObj + : job.bodyshop.md_responsibility_centers.defaults.costs; + + return { + PartsTotalCost: Object.keys(billTotalsByCostCenters).reduce((acc, key) => { + if ( + key !== defaultCosts.PAS && + key !== defaultCosts.PASL && + key !== defaultCosts.MAPA && + key !== defaultCosts.MASH && + key !== defaultCosts.TOW + ) + return acc.add(billTotalsByCostCenters[key]); + return acc; + }, Dinero()), + PartsOemCost: (billTotalsByCostCenters[defaultCosts.PAN] || Dinero()).add( + billTotalsByCostCenters[defaultCosts.PAP] || Dinero() + ), + PartsAMCost: billTotalsByCostCenters[defaultCosts.PAA] || Dinero(), + PartsReconditionedCost: + billTotalsByCostCenters[defaultCosts.PAM] || Dinero(), + PartsRecycledCost: billTotalsByCostCenters[defaultCosts.PAL] || Dinero(), + PartsOtherCost: billTotalsByCostCenters[defaultCosts.PAO] || Dinero(), + + SubletTotalCost: + billTotalsByCostCenters[defaultCosts.PAS] || + Dinero(billTotalsByCostCenters[defaultCosts.PASL] || Dinero()), + + AluminumLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAA] || Dinero(), + AluminumLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAA] || 0, + BodyLabourTotalCost: ticketTotalsByCostCenter[defaultCosts.LAB] || Dinero(), + BodyLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAB] || 0, + DiagnosticLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAD] || Dinero(), + DiagnosticLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAD] || 0, + ElectricalLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAE] || Dinero(), + ElectricalLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAE] || 0, + FrameLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAF] || Dinero(), + FrameLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAF] || 0, + GlassLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAG] || Dinero(), + GlassLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAG] || 0, + LabourMiscTotalCost: ( + ticketTotalsByCostCenter[defaultCosts.LA1] || Dinero() + ) + .add(ticketTotalsByCostCenter[defaultCosts.LA2] || Dinero()) + .add(ticketTotalsByCostCenter[defaultCosts.LA2] || Dinero()) + .add(ticketTotalsByCostCenter[defaultCosts.LA3] || Dinero()) + .add(ticketTotalsByCostCenter[defaultCosts.LA4] || Dinero()) + .add(ticketTotalsByCostCenter[defaultCosts.LAU] || Dinero()), + LabourMiscTotalHrs: + (ticketHrsByCostCenter[defaultCosts.LA1] || 0) + + (ticketHrsByCostCenter[defaultCosts.LA2] || 0) + + (ticketHrsByCostCenter[defaultCosts.LA3] || 0) + + (ticketHrsByCostCenter[defaultCosts.LA4] || 0) + + (ticketHrsByCostCenter[defaultCosts.LAU] || 0), + MechanicalLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAM] || Dinero(), + MechanicalLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAM] || 0, + RefinishLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAR] || Dinero(), + RefinishLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAR] || 0, + StructuralLabourTotalCost: + ticketTotalsByCostCenter[defaultCosts.LAS] || Dinero(), + StructuralLabourTotalHrs: ticketHrsByCostCenter[defaultCosts.LAS] || 0, + + PMTotalCost: billTotalsByCostCenters[defaultCosts.MAPA] || Dinero(), + BMTotalCost: billTotalsByCostCenters[defaultCosts.MASH] || Dinero(), + + MiscTotalCost: billTotalsByCostCenters[defaultCosts.PAO] || Dinero(), + TowingTotalCost: billTotalsByCostCenters[defaultCosts.TOW] || Dinero(), + StorageTotalCost: Dinero(), + DetailTotal: Dinero(), + DetailTotalCost: Dinero(), + + SalesTaxTotalCost: Dinero(), + LabourTotalCost: Object.keys(ticketTotalsByCostCenter).reduce( + (acc, key) => { + return acc.add(ticketTotalsByCostCenter[key]); + }, + Dinero() + ), + TotalCost: Object.keys(billTotalsByCostCenters).reduce((acc, key) => { + return acc.add(billTotalsByCostCenters[key]); + }, Dinero()), + TotalHrs: job.timetickets.reduce((acc, ticket_val) => { + return ( + acc + + (ticket_val.flat_rate + ? ticket_val.productivehrs + : ticket_val.actualhrs) || 0 + ); + }, 0), + }; +}; diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 4f627553a..c3aab2951 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -1073,6 +1073,183 @@ query ENTEGRAL_EXPORT($bodyshopid: uuid!) { } }`; +exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uuid!, $end: timestamptz) { + bodyshops_by_pk(id: $bodyshopid){ + id + shopname + address1 + city + state + zip_post + country + phone + last_name_first + md_ro_statuses + md_order_statuses + md_responsibility_centers + jc_hourly_rates + cdk_dealerid + pbs_serialnumber + use_paint_scale_data + timezone + } + jobs(where: {_and: [{updated_at: {_gt: $start}}, {updated_at: {_lte: $end}}, {shopid: {_eq: $bodyshopid}}]}) { + actual_completion + actual_delivery + actual_in + asgn_date + bills { + billlines { + actual_cost + cost_center + id + quantity + } + federal_tax_rate + id + is_credit_memo + local_tax_rate + state_tax_rate + } + created_at + clm_no + date_estimated + date_exported + date_invoiced + date_open + date_repairstarted + employee_body_rel { + first_name + last_name + employee_number + id + } + employee_csr_rel { + first_name + last_name + employee_number + id + } + employee_prep_rel { + first_name + last_name + employee_number + id + } + employee_refinish_rel { + first_name + last_name + employee_number + id + } + est_ct_fn + est_ct_ln + id + ins_co_nm + joblines(where: {removed: {_eq: false}}) { + act_price + billlines(order_by: {bill: {date: desc_nulls_last}} limit: 1) { + actual_cost + actual_price + quantity + bill { + vendor { + name + } + invoice_number + date + } + } + db_price + id + lbr_op + line_desc + line_ind + line_no + mod_lb_hrs + mod_lbr_ty + parts_order_lines(order_by: {parts_order: {order_date: desc_nulls_last}} limit: 1){ + parts_order{ + id + order_date + } + } + part_qty + part_type + profitcenter_part + profitcenter_labor + prt_dsmk_m + prt_dsmk_p + oem_partno + status + } + job_totals + loss_date + mixdata(limit: 1, order_by: {updated_at: desc}) { + jobid + totalliquidcost + } + ownr_addr1 + ownr_addr2 + ownr_city + ownr_co_nm + ownr_fn + ownr_ln + ownr_st + ownr_zip + parts_orders(limit: 1, order_by: {created_at: desc}) { + created_at + } + parts_tax_rates + plate_no + rate_la1 + rate_la2 + rate_la3 + rate_la4 + rate_laa + rate_lab + rate_lad + rate_lae + rate_laf + rate_lag + rate_lam + rate_lar + rate_las + rate_lau + rate_ma2s + rate_ma2t + rate_ma3s + rate_mabl + rate_macs + rate_mahw + rate_matd + rate_mapa + rate_mash + ro_number + scheduled_completion + scheduled_delivery + scheduled_in + status + timetickets { + id + rate + cost_center + actualhrs + productivehrs + flat_rate + } + tlos_ind + v_color + v_model_yr + v_model_desc + v_make_desc + v_vin + vehicle { + v_bstyle + } + } +}`; + exports.UPDATE_JOB = ` mutation UPDATE_JOB($jobId: uuid!, $job: jobs_set_input!) { update_jobs(where: { id: { _eq: $jobId } }, _set: $job) { @@ -1538,7 +1715,7 @@ exports.GET_CLAIMSCORP_SHOPS = `query GET_CLAIMSCORP_SHOPS { } }`; -exports.GET_ENTEGRAL_SHOPS = `query GET_AUTOHOUSE_SHOPS { +exports.GET_ENTEGRAL_SHOPS = `query GET_ENTEGRAL_SHOPS { bodyshops(where: {entegral_id: {_is_null: false}, _or: {entegral_id: {_neq: ""}}}){ id shopname @@ -1558,6 +1735,26 @@ exports.GET_ENTEGRAL_SHOPS = `query GET_AUTOHOUSE_SHOPS { } }`; +exports.GET_KAIZEN_SHOPS = `query GET_KAIZEN_SHOPS($imexshopid: [String]) { + bodyshops(where: {imexshopid: {_in: $imexshopid}}){ + id + shopname + address1 + city + state + zip_post + country + phone + md_ro_statuses + md_order_statuses + autohouseid + md_responsibility_centers + jc_hourly_rates + imexshopid + timezone + } +}`; + exports.DELETE_ALL_DMS_VEHICLES = `mutation DELETE_ALL_DMS_VEHICLES{ delete_dms_vehicles(where: {}) { affected_rows diff --git a/server/tasks/tasks.js b/server/tasks/tasks.js index 74f543bea..9ba237635 100644 --- a/server/tasks/tasks.js +++ b/server/tasks/tasks.js @@ -54,27 +54,27 @@ function functionMapper(f, timezone) { case "date.yesterday": return moment().tz(timezone).subtract(1, "day").format(isoFormat); case "date.3daysago": - return moment().tz(timezone).subtract(3, "days").format(isoFormat); + return moment().tz(timezone).subtract(3, "day").format(isoFormat); case "date.7daysago": - return moment().tz(timezone).subtract(7, "days").format(isoFormat); + return moment().tz(timezone).subtract(7, "day").format(isoFormat); case "date.tomorrow": return moment().tz(timezone).add(1, "day").format(isoFormat); case "date.3daysfromnow": - return moment().tz(timezone).add(3, "days").format(isoFormat); + return moment().tz(timezone).add(3, "day").format(isoFormat); case "date.7daysfromnow": - return moment().tz(timezone).add(7, "days").format(isoFormat); + return moment().tz(timezone).add(7, "day").format(isoFormat); case "date.yesterdaytz": return moment().tz(timezone).subtract(1, "day"); case "date.3daysagotz": - return moment().tz(timezone).subtract(3, "days"); + return moment().tz(timezone).subtract(3, "day"); case "date.7daysagotz": - return moment().tz(timezone).subtract(7, "days"); + return moment().tz(timezone).subtract(7, "day"); case "date.tomorrowtz": return moment().tz(timezone).add(1, "day"); case "date.3daysfromnowtz": - return moment().tz(timezone).add(3, "days"); + return moment().tz(timezone).add(3, "day"); case "date.7daysfromnowtz": - return moment().tz(timezone).add(7, "days"); + return moment().tz(timezone).add(7, "day"); case "date.now": return moment().tz(timezone);