diff --git a/.circleci/config.yml b/.circleci/config.yml index 167007b98..79a9f7217 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,9 +41,8 @@ jobs: imex-app-build: docker: - image: cimg/node:18.18.2 - + resource_class: large working_directory: ~/repo/client - steps: - checkout: path: ~/repo @@ -63,6 +62,31 @@ jobs: to: "s3://imex-online-production/" arguments: "--exclude '*.map'" + imex-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:production:imex + + - aws-cli/setup: + aws_access_key_id: AWS_ACCESS_KEY_ID + aws_secret_access_key: AWS_SECRET_ACCESS_KEY + region: AWS_REGION + + - aws-s3/sync: + from: dist + to: "s3://imex-online-beta/" + arguments: "--exclude '*.map'" + rome-api-deploy: docker: - image: "cimg/base:stable" @@ -181,7 +205,7 @@ jobs: imex-test-app-build: docker: - - image: cimg/node:16.15.0 + - image: cimg/node:18.18.2 resource_class: large working_directory: ~/repo/client @@ -199,6 +223,32 @@ jobs: to: "s3://imex-online-test/" arguments: "--exclude '*.map'" + imex-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:imex + + - aws-cli/setup: + aws_access_key_id: AWS_ACCESS_KEY_ID + aws_secret_access_key: AWS_SECRET_ACCESS_KEY + region: AWS_REGION + + - aws-s3/sync: + from: build + to: "s3://imex-online-test-beta/" + arguments: "--exclude '*.map'" + admin-app-build: docker: @@ -236,12 +286,16 @@ workflows: - imex-api-deploy: filters: branches: - only: master + only: master-AIO - imex-app-build: filters: branches: only: master - - hasura-migrate: + - imex-app-beta-build: + filters: + branches: + only: master-AIO + - imex-hasura-migrate: secret: ${HASURA_PROD_SECRET} filters: branches: @@ -263,7 +317,10 @@ workflows: filters: branches: only: test - + - imex-test-app-beta-build: + filters: + branches: + only: test-AIO - test-hasura-migrate: secret: ${HASURA_TEST_SECRET} filters: diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 6b24dfd21..105fb3b01 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -37126,6 +37126,27 @@ + + parts + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + partssublet false diff --git a/client/package-lock.json b/client/package-lock.json index 14e0ce87c..5fc873078 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -20,7 +20,7 @@ "@splitsoftware/splitio-react": "^1.11.0", "@tanem/react-nprogress": "^5.0.51", "@vitejs/plugin-react": "^4.2.1", - "antd": "^5.14.2", + "antd": "^5.15.3", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^3.3.0", "axios": "^1.6.7", @@ -54,6 +54,7 @@ "react-joyride": "^2.7.4", "react-markdown": "^9.0.1", "react-number-format": "^5.3.3", + "react-product-fruits": "^2.2.6", "react-redux": "^9.1.0", "react-resizable": "^3.0.5", "react-router-dom": "^6.22.2", @@ -71,6 +72,7 @@ "styled-components": "^6.1.8", "subscriptions-transport-ws": "^0.11.0", "terser-webpack-plugin": "^5.3.10", + "userpilot": "^1.3.1", "vite-plugin-ejs": "^1.7.0", "web-vitals": "^3.5.2", "workbox-core": "^7.0.0", @@ -186,8 +188,9 @@ } }, "node_modules/@ant-design/icons": { - "version": "5.3.0", - "license": "MIT", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.3.4.tgz", + "integrity": "sha512-U5eTSeSFr2V9SeJzYOo5mybAZfsoNuiIA8bvFoZUe+h9LBLs8UwrVaVwcMQC4AhBuojXkLMlmtnIlvUczXXHaQ==", "dependencies": { "@ant-design/colors": "^7.0.0", "@ant-design/icons-svg": "^4.4.0", @@ -2104,8 +2107,9 @@ "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -4970,6 +4974,32 @@ "version": "2.0.4", "license": "MIT" }, + "node_modules/@ndhoule/each": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ndhoule/each/-/each-2.0.1.tgz", + "integrity": "sha512-wHuJw6x+rF6Q9Skgra++KccjBozCr9ymtna0FhxmV/8xT/hZ2ExGYR8SV8prg8x4AH/7mzDYErNGIVHuzHeybw==", + "dependencies": { + "@ndhoule/keys": "^2.0.0" + } + }, + "node_modules/@ndhoule/includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ndhoule/includes/-/includes-2.0.1.tgz", + "integrity": "sha512-Q8zN6f3yIhxgBwZ5ldLozHqJlc/fRQ5+hFFsPMFeC9SJvz0nq8vG9hoRXL1c1iaNFQd7yAZIy2igQpERoFqxqg==", + "dependencies": { + "@ndhoule/each": "^2.0.1" + } + }, + "node_modules/@ndhoule/keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ndhoule/keys/-/keys-2.0.0.tgz", + "integrity": "sha512-vtCqKBC1Av6dsBA8xpAO+cgk051nfaI+PnmTZep2Px0vYrDvpUmLxv7z40COlWH5yCpu3gzNhepk+02yiQiZNw==" + }, + "node_modules/@ndhoule/pick": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ndhoule/pick/-/pick-2.0.0.tgz", + "integrity": "sha512-xkYtpf1pRd8egwvl5tJcdGu+GBd6ZZH3S/zoIQ9txEI+pHF9oTIlxMC9G4CB3sRugAeLgu8qYJGl3tnxWq74Qw==" + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "license": "MIT", @@ -5150,8 +5180,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rc-component/color-picker": { - "version": "1.5.2", - "license": "MIT", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.3.tgz", + "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==", "dependencies": { "@babel/runtime": "^7.23.6", "@ctrl/tinycolor": "^3.6.1", @@ -5165,7 +5196,8 @@ }, "node_modules/@rc-component/context": { "version": "1.4.0", - "license": "MIT", + "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" @@ -5203,7 +5235,8 @@ }, "node_modules/@rc-component/portal": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", @@ -5218,12 +5251,13 @@ } }, "node_modules/@rc-component/tour": { - "version": "1.12.3", - "license": "MIT", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.14.2.tgz", + "integrity": "sha512-A75DZ8LVvahBIvxooj3Gvf2sxe+CGOkmzPNX7ek0i0AJHyKZ1HXe5ieIGo3m0FMdZfVOlbCJ952Duq8VKAHk6g==", "dependencies": { "@babel/runtime": "^7.18.0", "@rc-component/portal": "^1.0.0-9", - "@rc-component/trigger": "^1.3.6", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.3.2", "rc-util": "^5.24.4" }, @@ -5236,8 +5270,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "1.18.3", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.0.0.tgz", + "integrity": "sha512-niwKADPdY5dhdIblV6uwSayVivwo2uUISfJqri+/ovYQcH/omxDYBJKo755QKeoIIsWptxnRpgr7reEnNEZGFg==", "dependencies": { "@babel/runtime": "^7.23.2", "@rc-component/portal": "^1.1.0", @@ -7522,54 +7557,56 @@ } }, "node_modules/antd": { - "version": "5.14.2", - "license": "MIT", + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.15.3.tgz", + "integrity": "sha512-53dpdGbfwipHVbqITmppp8N16i+BscMzz8NUNwaJgxwSvO9VQh/NfC/90lqGq3I2oBmxQ8TzRIxzFVKD/9OhlQ==", "dependencies": { "@ant-design/colors": "^7.0.2", "@ant-design/cssinjs": "^1.18.4", - "@ant-design/icons": "^5.3.0", + "@ant-design/icons": "^5.3.3", "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.24.0", "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~1.5.2", + "@rc-component/color-picker": "~1.5.3", "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/tour": "~1.12.3", - "@rc-component/trigger": "^1.18.3", + "@rc-component/tour": "~1.14.2", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.10", "qrcode.react": "^3.1.0", - "rc-cascader": "~3.21.2", - "rc-checkbox": "~3.1.0", + "rc-cascader": "~3.24.0", + "rc-checkbox": "~3.2.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-dialog": "~9.4.0", + "rc-drawer": "~7.1.0", + "rc-dropdown": "~4.2.0", + "rc-field-form": "~1.42.1", + "rc-image": "~7.6.0", + "rc-input": "~1.4.5", "rc-input-number": "~9.0.0", - "rc-mentions": "~2.10.1", - "rc-menu": "~9.12.4", + "rc-mentions": "~2.11.1", + "rc-menu": "~9.13.0", "rc-motion": "^2.9.0", "rc-notification": "~5.3.0", "rc-pagination": "~4.0.4", - "rc-picker": "~4.1.4", + "rc-picker": "~4.3.0", "rc-progress": "~3.5.1", "rc-rate": "~2.12.0", "rc-resize-observer": "^1.4.0", "rc-segmented": "~2.3.0", - "rc-select": "~14.11.0", + "rc-select": "~14.13.0", "rc-slider": "~10.5.0", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", - "rc-table": "~7.39.0", - "rc-tabs": "~14.0.0", + "rc-table": "~7.42.0", + "rc-tabs": "~14.1.1", "rc-textarea": "~1.6.3", - "rc-tooltip": "~6.1.3", + "rc-tooltip": "~6.2.0", "rc-tree": "~5.8.5", - "rc-tree-select": "~5.17.0", + "rc-tree-select": "~5.19.0", "rc-upload": "~4.5.2", - "rc-util": "^5.38.2", + "rc-util": "^5.39.1", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.0" }, @@ -7698,7 +7735,8 @@ }, "node_modules/array-tree-filter": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" }, "node_modules/array-union": { "version": "2.1.0", @@ -7887,7 +7925,8 @@ }, "node_modules/async-validator": { "version": "4.2.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", @@ -9625,6 +9664,11 @@ "version": "1.0.1", "license": "MIT" }, + "node_modules/component-indexof": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", + "integrity": "sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==" + }, "node_modules/compressible": { "version": "2.0.18", "license": "MIT", @@ -14347,6 +14391,14 @@ "node": ">= 10" } }, + "node_modules/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "engines": { + "node": "*" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "license": "MIT", @@ -18809,6 +18861,11 @@ "version": "2.2.7", "license": "MIT" }, + "node_modules/obj-case": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/obj-case/-/obj-case-0.2.1.tgz", + "integrity": "sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==" + }, "node_modules/object-assign": { "version": "4.1.1", "license": "MIT", @@ -20836,6 +20893,11 @@ "version": "2.0.1", "license": "MIT" }, + "node_modules/product-fruits": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/product-fruits/-/product-fruits-1.0.25.tgz", + "integrity": "sha512-w//YC14ZBv3AJ9Ki/XEYPPltodXGJYLue/Wkv/E0Q6BnB/mZ4UvFZMcVYqTCMKUJWdsaeqwO840JC0BGaG3g1w==" + }, "node_modules/progress": { "version": "2.0.3", "license": "MIT", @@ -21136,13 +21198,14 @@ } }, "node_modules/rc-cascader": { - "version": "3.21.2", - "license": "MIT", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.24.0.tgz", + "integrity": "sha512-NwkYsVULA61S085jbOYbq8Z7leyIxVmLwf+71mWLjA3kCfUf/rAKC0WfjQbqBDaLGlU9d4z1EzyPaHBKLYWv6A==", "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", "classnames": "^2.3.1", - "rc-select": "~14.11.0", + "rc-select": "~14.13.0", "rc-tree": "~5.8.1", "rc-util": "^5.37.0" }, @@ -21152,8 +21215,9 @@ } }, "node_modules/rc-checkbox": { - "version": "3.1.0", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.2.0.tgz", + "integrity": "sha512-8inzw4y9dAhZmv/Ydl59Qdy5tdp9CKg4oPVcRigi+ga/yKPZS5m5SyyQPtYSgbcqHRYOdUhiPSeKfktc76du1A==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -21179,8 +21243,9 @@ } }, "node_modules/rc-dialog": { - "version": "9.3.4", - "license": "MIT", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.4.0.tgz", + "integrity": "sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", @@ -21194,14 +21259,15 @@ } }, "node_modules/rc-drawer": { - "version": "7.0.0", - "license": "MIT", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.1.0.tgz", + "integrity": "sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w==", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.23.9", "@rc-component/portal": "^1.1.1", "classnames": "^2.2.6", "rc-motion": "^2.6.1", - "rc-util": "^5.36.0" + "rc-util": "^5.38.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -21209,11 +21275,12 @@ } }, "node_modules/rc-dropdown": { - "version": "4.1.0", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", + "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", "dependencies": { "@babel/runtime": "^7.18.3", - "@rc-component/trigger": "^1.7.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", "rc-util": "^5.17.0" }, @@ -21223,8 +21290,9 @@ } }, "node_modules/rc-field-form": { - "version": "1.41.0", - "license": "MIT", + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.42.1.tgz", + "integrity": "sha512-SqiEmWNP+I61Lt80+ofPvT+3l8Ij6vb35IS+x14gheVnCJN0SRnOwEgsqCEB5FslT7xqjUqDnU845hRZ1jzlAA==", "dependencies": { "@babel/runtime": "^7.18.0", "async-validator": "^4.1.0", @@ -21271,13 +21339,14 @@ } }, "node_modules/rc-image": { - "version": "7.5.1", - "license": "MIT", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.6.0.tgz", + "integrity": "sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", "classnames": "^2.2.6", - "rc-dialog": "~9.3.4", + "rc-dialog": "~9.4.0", "rc-motion": "^2.6.2", "rc-util": "^5.34.1" }, @@ -21287,8 +21356,9 @@ } }, "node_modules/rc-input": { - "version": "1.4.3", - "license": "MIT", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.4.5.tgz", + "integrity": "sha512-AjzykhwnwYTRSwwgCu70CGKBIAv6bP2nqnFptnNTprph/TF1BAs0Qxl91mie/BR6n827WIJB6ZjaRf9iiMwAfw==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -21315,14 +21385,15 @@ } }, "node_modules/rc-mentions": { - "version": "2.10.1", - "license": "MIT", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.11.1.tgz", + "integrity": "sha512-upb4AK1SRFql7qGnbLEvJqLMugVVIyjmwBJW9L0eLoN9po4JmJZaBzmKA4089fNtsU8k6l/tdZiVafyooeKnLw==", "dependencies": { "@babel/runtime": "^7.22.5", - "@rc-component/trigger": "^1.5.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", "rc-input": "~1.4.0", - "rc-menu": "~9.12.0", + "rc-menu": "~9.13.0", "rc-textarea": "~1.6.1", "rc-util": "^5.34.1" }, @@ -21332,11 +21403,12 @@ } }, "node_modules/rc-menu": { - "version": "9.12.4", - "license": "MIT", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.13.0.tgz", + "integrity": "sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^1.17.0", + "@rc-component/trigger": "^2.0.0", "classnames": "2.x", "rc-motion": "^2.4.3", "rc-overflow": "^1.3.1", @@ -21379,7 +21451,8 @@ }, "node_modules/rc-overflow": { "version": "1.3.2", - "license": "MIT", + "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", @@ -21405,11 +21478,12 @@ } }, "node_modules/rc-picker": { - "version": "4.1.4", - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.3.0.tgz", + "integrity": "sha512-bQNB/+NdW55jlQ5lPnNqF5J90Tq4SihLbAF7tzPBvGDJyoYmDgwLm4FN0ZB3Ot9i1v6vJY/1mgqZZTT9jbYc5w==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^1.5.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.1", "rc-overflow": "^1.3.2", "rc-resize-observer": "^1.4.0", @@ -21499,11 +21573,12 @@ } }, "node_modules/rc-select": { - "version": "14.11.0", - "license": "MIT", + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.13.0.tgz", + "integrity": "sha512-ew34FsaqHokK4dxVrcIxSYrgWJ2XJYlkk32eiOIiEo3GkHUExdCzmozMYaUc2P67c5QJRUvvY0uqCs3QG67h5A==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^1.5.0", + "@rc-component/trigger": "^2.0.0", "classnames": "2.x", "rc-motion": "^2.0.1", "rc-overflow": "^1.3.1", @@ -21564,8 +21639,9 @@ } }, "node_modules/rc-table": { - "version": "7.39.0", - "license": "MIT", + "version": "7.42.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.42.0.tgz", + "integrity": "sha512-GwHV9Zs3HvWxBkoXatO/IeKoElzy3Ojf3dcyw1Rj3cyQVb+ZHtexslKdyzsrKRPJ0mUa62BoX+ZAg3zgTEql8w==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/context": "^1.4.0", @@ -21583,13 +21659,14 @@ } }, "node_modules/rc-tabs": { - "version": "14.0.0", - "license": "MIT", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-14.1.1.tgz", + "integrity": "sha512-5nOr9PVpJy2SWHTLgv1+kESDOb0tFzl0cYU9r9d8LfL0Wg9i/n1B558rmkxdQHgBwMqxmwoyPSAbQROxMQe8nw==", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", - "rc-dropdown": "~4.1.0", - "rc-menu": "~9.12.0", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.13.0", "rc-motion": "^2.6.2", "rc-resize-observer": "^1.0.0", "rc-util": "^5.34.1" @@ -21604,7 +21681,8 @@ }, "node_modules/rc-textarea": { "version": "1.6.3", - "license": "MIT", + "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", @@ -21618,11 +21696,12 @@ } }, "node_modules/rc-tooltip": { - "version": "6.1.3", - "license": "MIT", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", + "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", "dependencies": { "@babel/runtime": "^7.11.2", - "@rc-component/trigger": "^1.18.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.3.1" }, "peerDependencies": { @@ -21632,7 +21711,8 @@ }, "node_modules/rc-tree": { "version": "5.8.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.5.tgz", + "integrity": "sha512-PRfcZtVDNkR7oh26RuNe1hpw11c1wfgzwmPFL0lnxGnYefe9lDAO6cg5wJKIAwyXFVt5zHgpjYmaz0CPy1ZtKg==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -21649,12 +21729,13 @@ } }, "node_modules/rc-tree-select": { - "version": "5.17.0", - "license": "MIT", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.19.0.tgz", + "integrity": "sha512-f4l5EsmSGF3ggj76YTzKNPY9SnXfFaer7ZccTSGb3urUf54L+cCqyT+UsPr+S5TAr8mZSxJ7g3CgkCe+cVQ6sw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", - "rc-select": "~14.11.0-0", + "rc-select": "~14.13.0", "rc-tree": "~5.8.1", "rc-util": "^5.16.1" }, @@ -21677,8 +21758,9 @@ } }, "node_modules/rc-util": { - "version": "5.38.2", - "license": "MIT", + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.1.tgz", + "integrity": "sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ==", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -21694,7 +21776,8 @@ }, "node_modules/rc-virtual-list": { "version": "3.11.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.4.tgz", + "integrity": "sha512-NbBi0fvyIu26gP69nQBiWgUMTPX3mr4FcuBQiVqagU0BnuX8WQkiivnMs105JROeuUIFczLrlgUhLQwTWV1XDA==", "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", @@ -22225,6 +22308,17 @@ "react-dom": ">=16.3.0" } }, + "node_modules/react-product-fruits": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/react-product-fruits/-/react-product-fruits-2.2.6.tgz", + "integrity": "sha512-f57m1rCD+Cu8QfFQSpkHJjLaWauPbD01GNrbh4icQaOHA/6bHJGpcoSSEQfAtk3g2PyQBpsDdRvL9jC+hyxhhQ==", + "dependencies": { + "product-fruits": "^1.0.25" + }, + "peerDependencies": { + "react": ">= 17.0.0" + } + }, "node_modules/react-redux": { "version": "9.1.0", "license": "MIT", @@ -25941,6 +26035,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/userpilot": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/userpilot/-/userpilot-1.3.1.tgz", + "integrity": "sha512-HwOqRhTY829m++tx76E/4wMHLpqG39JPAESXnC54zdYIBASoX1wOO8ItaqpBlf5sH1rdIxU8/dUFa8nMQ60KYQ==", + "dependencies": { + "@ndhoule/includes": "^2.0.1", + "@ndhoule/pick": "^2.0.0", + "component-indexof": "0.0.3", + "is": "^3.1.0", + "obj-case": "^0.2.0" + } + }, "node_modules/util": { "version": "0.12.5", "dev": true, diff --git a/client/package.json b/client/package.json index d4ff11605..135f59420 100644 --- a/client/package.json +++ b/client/package.json @@ -20,7 +20,7 @@ "@splitsoftware/splitio-react": "^1.11.0", "@tanem/react-nprogress": "^5.0.51", "@vitejs/plugin-react": "^4.2.1", - "antd": "^5.14.2", + "antd": "^5.15.3", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^3.3.0", "axios": "^1.6.7", @@ -54,6 +54,7 @@ "react-joyride": "^2.7.4", "react-markdown": "^9.0.1", "react-number-format": "^5.3.3", + "react-product-fruits": "^2.2.6", "react-redux": "^9.1.0", "react-resizable": "^3.0.5", "react-router-dom": "^6.22.2", @@ -71,6 +72,7 @@ "styled-components": "^6.1.8", "subscriptions-transport-ws": "^0.11.0", "terser-webpack-plugin": "^5.3.10", + "userpilot": "^1.3.1", "vite-plugin-ejs": "^1.7.0", "web-vitals": "^3.5.2", "workbox-core": "^7.0.0", @@ -121,6 +123,9 @@ "resolutions": { "react-error-overlay": "6.0.9" }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.6.1" + }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/preset-react": "^7.23.3", diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index e908ba45f..13c751c58 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -12,6 +12,12 @@ import App from "./App"; import * as Sentry from "@sentry/react"; import themeProvider from "./themeProvider"; +import { Userpilot } from 'userpilot' + +// Initialize Userpilot +if(import.meta.env.DEV){ + Userpilot.initialize('NX-69145f08'); +} dayjs.locale("en"); diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index 54808973e..5453a25a3 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -27,6 +27,8 @@ import "./App.styles.scss"; import handleBeta from "../utils/betaHandler"; import Eula from "../components/eula/eula.component"; import InstanceRenderMgr from "../utils/instanceRenderMgr"; +import { ProductFruits } from 'react-product-fruits'; + const ResetPassword = lazy(() => import("../pages/reset-password/reset-password.component") ); @@ -149,6 +151,7 @@ export function App({ // Any route that is not assigned and matched will default to the Landing Page component return ( + } - > + > + + - + {t("general.labels.media")} {bodyshop.uselocalmediaserver ? ( 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 b36345ed3..db8a1e931 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 @@ -44,13 +44,13 @@ export function JobEmployeeAssignmentsContainer({ }); if (refetch) refetch(); - insertAuditTrail({ - jobid: job.id, - operation: AuditTrailMapping.jobassignmentchange(operation, name), - type: "jobassignmentchange", - }); - - if (!!result.errors) { + if (!!!result.errors) { + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobassignmentchange(operation, name), + type: "jobassignmentchange", + }); + } else { notification["error"]({ message: t("jobs.errors.assigning", { message: JSON.stringify(result.errors), @@ -68,19 +68,21 @@ export function JobEmployeeAssignmentsContainer({ 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), - type: "jobassignmentremoved",}); - setLoading(false); - }; + if (!!!result.errors) { + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.jobassignmentremoved(operation), + type: "jobassignmentremoved", + }); + } else { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; return (
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 f796eb2ad..849cea1c3 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 @@ -82,7 +82,7 @@ export default function JobReconciliationBillsTable({ state.sortedInfo.order, render: (text, record) => ( - + ), }, ]; diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx index eed6441d4..6b7479b13 100644 --- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx +++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx @@ -217,6 +217,12 @@ export function JobsDetailHeader({job, bodyshop, disabled}) { {job.owner?.tax_number || ""} )} + + {job.owner?.note || ""} +
diff --git a/client/src/components/production-list-columns/production-list-columns.data.jsx b/client/src/components/production-list-columns/production-list-columns.data.jsx index 0dd7a849f..abff04e3c 100644 --- a/client/src/components/production-list-columns/production-list-columns.data.jsx +++ b/client/src/components/production-list-columns/production-list-columns.data.jsx @@ -327,7 +327,7 @@ const {Enhanced_Payroll} = treatments; onFilter: (value, record) => value.includes(record.special_coverage_policy), render: (text, record) => ( - + ), }, 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 e727e0f1c..177d622c8 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx @@ -241,17 +241,17 @@ export function ShopInfoResponsibilityCenterComponent({bodyshop, form}) { - - d - onClick={() => { - remove(field.name); - }} - /> - + + { + remove(field.name); + }} + /> + 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 aaf0626ed..dbc588137 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,92 +1,91 @@ -import {HeartOutlined} from "@ant-design/icons"; -import {Select, Space, Tag} from "antd"; -import React, {forwardRef, useEffect, useState} from "react"; -import PhoneNumberFormatter from "../../utils/PhoneFormatter"; +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 ( - { + if (!value || !options) return label; + const discount = options?.find((o) => o.id === value)?.discount; + return ( +
+
{label}
- - {o.phone && showPhone && ( - {o.phone} - )} - {o.discount && o.discount !== 0 ? ( - {`${o.discount * 100}%`} - ) : null} - -
- + {discount && discount !== 0 ? {`${discount * 100}%`} : null} + + ); + }} + popupMatchSelectWidth={false} + onChange={setOption} + optionFilterProp="name" + onSelect={onSelect} + disabled={disabled || false} + optionLabelProp={'name'} + > + {favorites + ? favorites.map((o) => ( + + )) + : null} + {options + ? options.map((o) => ( + + )) + : null} + + ); }; export default forwardRef(VendorSearchSelect); diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index bd4feb1ad..174f6ad04 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -721,6 +721,7 @@ export const GET_JOB_BY_PK = gql` other_amount_payable owner { id + note ownr_addr1 ownr_addr2 ownr_city diff --git a/client/src/pages/bills/bills.page.component.jsx b/client/src/pages/bills/bills.page.component.jsx index 2b2db61f3..9ab2bb185 100644 --- a/client/src/pages/bills/bills.page.component.jsx +++ b/client/src/pages/bills/bills.page.component.jsx @@ -126,7 +126,7 @@ export function BillsListPage({ state.sortedInfo.columnKey === "is_credit_memo" && state.sortedInfo.order, render: (text, record) => ( - + ), }, { @@ -136,7 +136,7 @@ export function BillsListPage({ sorter: (a, b) => a.exported - b.exported, sortOrder: state.sortedInfo.columnKey === "exported" && state.sortedInfo.order, - render: (text, record) => , + render: (text, record) => , }, { title: t("general.labels.actions"), 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 cd3017926..66fca6317 100644 --- a/client/src/pages/export-logs/export-logs.page.component.jsx +++ b/client/src/pages/export-logs/export-logs.page.component.jsx @@ -162,26 +162,24 @@ sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), { text: "False", value: false }, ], onFilter: (value, record) => record.successful === value, - 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}
  • - ))} -
-
- ), - }, - ]; + 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 ( )} - {t("jobs.labels.multipayers")} + {Qb_Multi_Ar.treatment === "on" && ( + <>{t("jobs.labels.multipayers")} { + if(!jobRO){ remove(field.name); + } }} />
@@ -529,6 +532,7 @@ export function JobsCloseComponent({job, bodyshop, jobRO, insertAuditTrail}) { + )} 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 d9121f1fe..1027001f4 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -332,7 +332,7 @@ export function JobsDetailPage({ { key: "partssublet", icon: , - label: t("menus.jobsdetail.partssublet"), + label: HasFeatureAccess({featureName: "bills", bodyshop}) ? t("menus.jobsdetail.partssublet") : t("menus.jobsdetail.parts"), children: , }, ...InstanceRenderManager({ imex: true, rome: true, promanager: HasFeatureAccess({ featureName: 'timetickets', bodyshop }) }) ? [ { diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index c7a717e36..038543d59 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -541,13 +541,12 @@ export function Manage({conflict, bodyshop,enableJoyRide,joyRideSteps,setJoyRide }} >
- {`Joy Ride Status: ${enableJoyRide}`}
{`${InstanceRenderManager({ imex: t('titles.imexonline'), rome: t('titles.romeonline'), promanager: t('titles.promanager'), - })} ${import.meta.env.VITE_APP_GIT_SHA || 'Local Build'} - ${ + })} - ${ import.meta.env.VITE_APP_GIT_SHA_DATE }`}
diff --git a/client/src/redux/user/user.sagas.js b/client/src/redux/user/user.sagas.js index 6f00c390d..6d6921d0d 100644 --- a/client/src/redux/user/user.sagas.js +++ b/client/src/redux/user/user.sagas.js @@ -47,6 +47,7 @@ import client from "../../utils/GraphQLClient"; import {QUERY_EULA} from "../../graphql/bodyshop.queries"; import day from "../../utils/day"; import InstanceRenderManager from "../../utils/instanceRenderMgr"; +import { Userpilot } from "userpilot"; const fpPromise = FingerprintJS.load(); @@ -227,6 +228,15 @@ export function* signInSuccessSaga({payload}) { window.$crisp.push(['set', 'user:nickname', [payload.displayName || payload.email]]); window.$crisp.push(['set', 'session:segments', [['user']]]); }, + promanager: () =>{ + Userpilot.identify( + payload.email, + { + email: payload.email, + } + ); + console.log("*** Userpilot identified.") + } }); } catch (error) { diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 08a6737cf..14a98d82a 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1165,6 +1165,7 @@ "loadingshop": "Loading shop data...", "loggingin": "Authorizing...", "markedexported": "Manually marked as exported.", + "media": "Media", "message": "Message", "monday": "Monday", "na": "N/A", @@ -2174,6 +2175,7 @@ "insurance": "Insurance Information", "labor": "Labor", "lifecycle": "Lifecycle", + "parts": "Parts", "partssublet": "Parts & Bills", "rates": "Rates", "repairdata": "Repair Data", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 7c4416b16..ba11bb4a3 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2174,6 +2174,7 @@ "insurance": "", "labor": "Labor", "lifecycle": "", + "parts": "", "partssublet": "Piezas / Subarrendamiento", "rates": "", "repairdata": "Datos de reparación", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index c219fbd89..1117003e0 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2174,6 +2174,7 @@ "insurance": "", "labor": "La main d'oeuvre", "lifecycle": "", + "parts": "", "partssublet": "Pièces / Sous-location", "rates": "", "repairdata": "Données de réparation", diff --git a/client/vite.config.js b/client/vite.config.js index 2ec487ccb..a5d9f6734 100644 --- a/client/vite.config.js +++ b/client/vite.config.js @@ -105,6 +105,9 @@ export default defineConfig({ react(), // CompressionPlugin(), //Cloudfront already compresses assets, so not needed. ], + define:{ + "APP_VERSION": JSON.stringify(process.env.npm_package_version) + }, server: { host: true, port: 3000, diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index 38dff43fa..a9ee63e81 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -832,6 +832,13 @@ table: name: ioevents schema: public + - name: ioevents + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: ioevents + schema: public - name: jobs using: foreign_key_constraint_on: @@ -867,6 +874,13 @@ table: name: tasks schema: public + - name: tasks + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: tasks + schema: public - name: timetickets using: foreign_key_constraint_on: @@ -3353,6 +3367,13 @@ table: name: tasks schema: public + - name: tasks + using: + foreign_key_constraint_on: + column: jobid + table: + name: tasks + schema: public - name: timetickets using: foreign_key_constraint_on: @@ -5057,6 +5078,13 @@ table: name: tasks schema: public + - name: tasks + using: + foreign_key_constraint_on: + column: partsorderid + table: + name: tasks + schema: public insert_permissions: - role: user permission: diff --git a/hasura/migrations/1710532848432_create_table_public_tasks/down.sql b/hasura/migrations/1710532848432_create_table_public_tasks/down.sql new file mode 100644 index 000000000..ba949320f --- /dev/null +++ b/hasura/migrations/1710532848432_create_table_public_tasks/down.sql @@ -0,0 +1 @@ +DROP TABLE "public"."tasks"; diff --git a/hasura/migrations/1710532848432_create_table_public_tasks/up.sql b/hasura/migrations/1710532848432_create_table_public_tasks/up.sql new file mode 100644 index 000000000..f5e9db3c6 --- /dev/null +++ b/hasura/migrations/1710532848432_create_table_public_tasks/up.sql @@ -0,0 +1,18 @@ +CREATE TABLE "public"."tasks" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), "title" text NOT NULL, "description" Text, "deleted" boolean NOT NULL DEFAULT false, "deleted_at" timestamptz, "due_date" timestamptz, "created_by" text NOT NULL, "assigned_to" Text, "completed" boolean NOT NULL DEFAULT false, "completed_at" timestamptz, "remind_at" timestamptz, "priority" numeric, "bodyshopid" UUID NOT NULL, "jobid" UUID NOT NULL, "joblineid" UUID, "partsorderid" UUID, "billid" UUID, PRIMARY KEY ("id") , FOREIGN KEY ("created_by") REFERENCES "public"."users"("email") ON UPDATE restrict ON DELETE restrict, FOREIGN KEY ("assigned_to") REFERENCES "public"."users"("email") ON UPDATE restrict ON DELETE restrict, FOREIGN KEY ("bodyshopid") REFERENCES "public"."bodyshops"("id") ON UPDATE restrict ON DELETE restrict, FOREIGN KEY ("jobid") REFERENCES "public"."jobs"("id") ON UPDATE cascade ON DELETE cascade, FOREIGN KEY ("joblineid") REFERENCES "public"."joblines"("id") ON UPDATE set null ON DELETE set null, FOREIGN KEY ("partsorderid") REFERENCES "public"."parts_orders"("id") ON UPDATE set null ON DELETE set null, FOREIGN KEY ("billid") REFERENCES "public"."bills"("id") ON UPDATE set null ON DELETE set null); +CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() +RETURNS TRIGGER AS $$ +DECLARE + _new record; +BEGIN + _new := NEW; + _new."updated_at" = NOW(); + RETURN _new; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "set_public_tasks_updated_at" +BEFORE UPDATE ON "public"."tasks" +FOR EACH ROW +EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); +COMMENT ON TRIGGER "set_public_tasks_updated_at" ON "public"."tasks" +IS 'trigger to set value of column "updated_at" to current timestamp on row update'; +CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/server/accounting/pbs/pbs-job-export.js b/server/accounting/pbs/pbs-job-export.js index 69945505e..013d49c1d 100644 --- a/server/accounting/pbs/pbs-job-export.js +++ b/server/accounting/pbs/pbs-job-export.js @@ -16,7 +16,7 @@ const CalculateAllocations = const CdkBase = require("../../web-sockets/web-socket"); const moment = require("moment-timezone"); const Dinero = require("dinero.js"); -const { default: InstanceManager } = require("../../utils/instanceMgr").default; +const InstanceManager = require("../../utils/instanceMgr").default; const axios = AxiosLib.create(); axios.interceptors.request.use((x) => { @@ -661,7 +661,7 @@ async function InsertAccountPostingData(socket) { .toISOString(), //"0001-01-01T00:00:00.0000000Z", Description: socket.txEnvelope.story, //AdditionalInfo: "String", - Source: InstanceManager({imex: t("titles.imexonline"), rome:t("titles.romeonline")}), + Source: InstanceManager({imex: "ImEX Online", rome:"Rome Online"}), Lines: wips, }, },