merge aio

This commit is contained in:
Dave Richer
2024-03-26 10:09:29 -04:00
34 changed files with 1018 additions and 768 deletions

288
client/package-lock.json generated
View File

@@ -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,

View File

@@ -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",

View File

@@ -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");

View File

@@ -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 (
<Suspense
fallback={
<LoadingSpinner
@@ -159,7 +162,13 @@ export function App({
})}
/>
}
>
>
<ProductFruits //workspaceCode="aoJoEifvezYI0Z0P"
language="en" user={{
email: currentUser.email,
username: currentUser.email,
}} />
<Routes>
<Route
path="*"

View File

@@ -1,5 +1,5 @@
import {useMutation, useQuery} from "@apollo/client";
import {Button, Form, Popconfirm, Space} from "antd";
import {Button, Divider, Form, Popconfirm, Space} from "antd";
import dayjs from "../../utils/day";
import queryString from "query-string";
import React, {useState} from "react";
@@ -203,7 +203,7 @@ export function BillDetailEditcontainer({setPartsOrderContext, insertAuditTrail,
layout="vertical"
>
<BillFormContainer form={form} billEdit disabled={exported}/>
<Divider orientation="left">{t("general.labels.media")}</Divider>
{bodyshop.uselocalmediaserver ? (
<JobsDocumentsLocalGallery
job={{id: data ? data.bills_by_pk.jobid : null}}

View File

@@ -173,7 +173,11 @@ export function BillDetailEditReturn({
</Form>
</Modal>
<Button
disabled={data.bills_by_pk.is_credit_memo || disabled}
disabled={
data.bills_by_pk.is_credit_memo ||
data.bills_by_pk.isinhouse ||
disabled
}
onClick={() => {
setOpen(true);
}}

View File

@@ -172,6 +172,7 @@ function BillEnterModalContainer({
],
},
refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID", "GET_JOB_BY_PK"],
awaitRefetchQueries: true
});
await Promise.all(

File diff suppressed because it is too large Load Diff

View File

@@ -12,6 +12,7 @@ import "./chat-affix.styles.scss";
export function ChatAffixContainer({bodyshop, chatVisible}) {
const {t} = useTranslation();
const client = useApolloClient();
useEffect(() => {
if (!bodyshop || !bodyshop.messagingservicesid) return;
@@ -31,6 +32,7 @@ export function ChatAffixContainer({bodyshop, chatVisible}) {
error
);
notification.open({
key: 'fcm',
type: "warning",
message: t("general.errors.fcm"),
btn: (
@@ -62,7 +64,7 @@ export function ChatAffixContainer({bodyshop, chatVisible}) {
SubscribeToTopic();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
}, [bodyshop]);
useEffect(() => {
function handleMessage(payload) {

View File

@@ -61,6 +61,10 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
value: "courtesycars.status.in",
},
{
text: t("courtesycars.status.inservice"),
value: "courtesycars.status.inservice",
},
{
text: t("courtesycars.status.out"),
value: "courtesycars.status.out",
},
@@ -73,7 +77,7 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
value: "courtesycars.status.leasereturn",
},
],
onFilter: (value, record) => value.includes(record.status),
onFilter: (value, record) => record.status === value,
sortOrder:
state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
render: (text, record) => {
@@ -176,7 +180,7 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
title: t("courtesycars.fields.fuel"),
dataIndex: "fuel",
key: "fuel",
sorter: (a, b) => alphaSort(a.fuel, b.fuel),
sorter: (a, b) => a.fuel - b.fuel,
sortOrder:
state.sortedInfo.columnKey === "fuel" && state.sortedInfo.order,
render: (text, record) => {
@@ -185,12 +189,14 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
return t("courtesycars.labels.fuel.full");
case 88:
return t("courtesycars.labels.fuel.78");
case 63:
case 75:
return t("courtesycars.labels.fuel.34");
case 63:
return t("courtesycars.labels.fuel.58");
case 50:
return t("courtesycars.labels.fuel.12");
case 38:
return t("courtesycars.labels.fuel.34");
return t("courtesycars.labels.fuel.38");
case 25:
return t("courtesycars.labels.fuel.14");
case 13:

View File

@@ -23,7 +23,6 @@ export function JobEmployeeAssignments({
jobRO,
body,
refinish,
prep,
csr,
handleAdd,
@@ -78,7 +77,7 @@ export function JobEmployeeAssignments({
setVisibility(false);
}}
>
Assign
{t("allocations.actions.assign")}
</Button>
<Button onClick={() => setVisibility(false)}>Close</Button>
</Space>

View File

@@ -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 (
<div>

View File

@@ -82,7 +82,7 @@ export default function JobReconciliationBillsTable({
state.sortedInfo.order,
render: (text, record) => (
<Checkbox disabled checked={record.bill.is_credit_memo}/>
<Checkbox checked={record.bill.is_credit_memo}/>
),
},
];

View File

@@ -217,6 +217,12 @@ export function JobsDetailHeader({job, bodyshop, disabled}) {
{job.owner?.tax_number || ""}
</DataLabel>
)}
<DataLabel
label={t("owners.fields.note")}
valueStyle={{ overflow: "hidden", textOverflow: "ellipsis" }}
>
{job.owner?.note || ""}
</DataLabel>
</div>
</Card>
</Col>

View File

@@ -327,7 +327,7 @@ const {Enhanced_Payroll} = treatments;
onFilter: (value, record) =>
value.includes(record.special_coverage_policy),
render: (text, record) => (
<Checkbox disabled checked={record.special_coverage_policy} />
<Checkbox checked={record.special_coverage_policy} />
),
},

View File

@@ -241,17 +241,17 @@ export function ShopInfoResponsibilityCenterComponent({bodyshop, form}) {
</Select>
</Form.Item>
<Space align="center">
d
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
<Space align="center">
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>

View File

@@ -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 (
<Select
ref={ref}
showSearch
value={option}
style={{
width: "100%",
}}
popupMatchSelectWidth={false}
onChange={setOption}
optionFilterProp="name"
onSelect={onSelect}
disabled={disabled || false}
optionLabelProp={"name"}
>
{favorites
? favorites.map((o) => (
<Option
key={`favorite-${o.id}`}
value={o.id}
name={o.name}
discount={o.discount}
>
<div className="imex-flex-row">
<div style={{flex: 1}}>{o.name}</div>
<Space style={{marginLeft: "1rem"}}>
<HeartOutlined style={{color: "red"}}/>
{o.phone && showPhone && (
<PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>
)}
{o.discount && o.discount !== 0 ? (
<Tag color="green">{`${o.discount * 100}%`}</Tag>
) : null}
</Space>
</div>
</Option>
))
: null}
{options
? options.map((o) => (
<Option key={o.id} value={o.id} name={o.name} discount={o.discount}>
<div className="imex-flex-row" style={{width: "100%"}}>
<div style={{flex: 1}}>{o.name}</div>
return (
<Select
ref={ref}
showSearch
value={option}
style={{
width: '100%',
}}
labelRender={({ label, value, ...rest }) => {
if (!value || !options) return label;
const discount = options?.find((o) => o.id === value)?.discount;
return (
<div className="imex-flex-row" style={{ width: '100%' }}>
<div style={{ flex: 1 }}>{label}</div>
<Space style={{marginLeft: "1rem"}}>
{o.phone && showPhone && (
<PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>
)}
{o.discount && o.discount !== 0 ? (
<Tag color="green">{`${o.discount * 100}%`}</Tag>
) : null}
</Space>
</div>
</Option>
{discount && discount !== 0 ? <Tag color="green">{`${discount * 100}%`}</Tag> : null}
</div>
);
}}
popupMatchSelectWidth={false}
onChange={setOption}
optionFilterProp="name"
onSelect={onSelect}
disabled={disabled || false}
optionLabelProp={'name'}
>
{favorites
? favorites.map((o) => (
<Option key={`favorite-${o.id}`} value={o.id} name={o.name} discount={o.discount}>
<div className="imex-flex-row">
<div style={{ flex: 1 }}>{o.name}</div>
<Space style={{ marginLeft: '1rem' }}>
<HeartOutlined style={{ color: 'red' }} />
{o.phone && showPhone && <PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>}
{o.discount && o.discount !== 0 ? (
<Tag color="green">{`${o.discount * 100}%`}</Tag>
) : null}
</Space>
</div>
</Option>
))
: null}
{options
? options.map((o) => (
<Option key={o.id} value={o.id} name={o.name} discount={o.discount}>
<div className="imex-flex-row" style={{ width: '100%' }}>
<div style={{ flex: 1 }}>{o.name}</div>
))
: null}
</Select>
);
<Space style={{ marginLeft: '1rem' }}>
{o.phone && showPhone && <PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>}
{o.discount && o.discount !== 0 ? (
<Tag color="green">{`${o.discount * 100}%`}</Tag>
) : null}
</Space>
</div>
</Option>
))
: null}
</Select>
);
};
export default forwardRef(VendorSearchSelect);

View File

@@ -721,6 +721,7 @@ export const GET_JOB_BY_PK = gql`
other_amount_payable
owner {
id
note
ownr_addr1
ownr_addr2
ownr_city

View File

@@ -126,7 +126,7 @@ export function BillsListPage({
state.sortedInfo.columnKey === "is_credit_memo" &&
state.sortedInfo.order,
render: (text, record) => (
<Checkbox disabled checked={record.is_credit_memo}/>
<Checkbox checked={record.is_credit_memo}/>
),
},
{
@@ -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) => <Checkbox disabled checked={record.exported}/>,
render: (text, record) => <Checkbox checked={record.exported}/>,
},
{
title: t("general.labels.actions"),

View File

@@ -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) => (
<Checkbox disabled checked={record.successful}/>
),
},
{
title: t("general.labels.message"),
dataIndex: "message",
key: "message",
render: (text, record) =>
record.message && (
<div>
<ul>
{JSON.parse(record.message).map((m, idx) => (
<li key={idx}>{m}</li>
))}
</ul>
</div>
),
},
];
render: (text, record) => <Checkbox checked={record.successful} />,
},
{
title: t("general.labels.message"),
dataIndex: "message",
key: "message",
render: (text, record) =>
record.message && (
<div>
<ul>
{JSON.parse(record.message).map((m, idx) => (
<li key={idx}>{m}</li>
))}
</ul>
</div>
),
},
];
return (
<Card

View File

@@ -371,8 +371,9 @@ export function JobsCloseComponent({job, bodyshop, jobRO, insertAuditTrail}) {
</Form.Item>
)}
</LayoutFormRow>
<Divider>{t("jobs.labels.multipayers")}</Divider>
{Qb_Multi_Ar.treatment === "on" && (
<><Divider>{t("jobs.labels.multipayers")}</Divider>
<Row gutter={[16, 16]}>
<Col lg={8} md={24}>
<Form.List
@@ -451,7 +452,9 @@ export function JobsCloseComponent({job, bodyshop, jobRO, insertAuditTrail}) {
<DeleteFilled
disabled={jobRO}
onClick={() => {
if(!jobRO){
remove(field.name);
}
}}
/>
</Space>
@@ -529,6 +532,7 @@ export function JobsCloseComponent({job, bodyshop, jobRO, insertAuditTrail}) {
</Form.Item>
</Col>
</Row>
</>
)}
<Divider/>
<JobsCloseLines job={job}/>

View File

@@ -332,7 +332,7 @@ export function JobsDetailPage({
{
key: "partssublet",
icon: <ToolFilled/>,
label: t("menus.jobsdetail.partssublet"),
label: HasFeatureAccess({featureName: "bills", bodyshop}) ? t("menus.jobsdetail.partssublet") : t("menus.jobsdetail.parts"),
children: <JobsDetailPliContainer job={job}/>,
},
...InstanceRenderManager({ imex: true, rome: true, promanager: HasFeatureAccess({ featureName: 'timetickets', bodyshop }) }) ? [ {

View File

@@ -541,13 +541,12 @@ export function Manage({conflict, bodyshop,enableJoyRide,joyRideSteps,setJoyRide
}}
>
<div style={{ display: 'flex' }}>
{`Joy Ride Status: ${enableJoyRide}`}
<div>
{`${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
}`}
</div>

View File

@@ -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) {

View File

@@ -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",

View File

@@ -2174,6 +2174,7 @@
"insurance": "",
"labor": "Labor",
"lifecycle": "",
"parts": "",
"partssublet": "Piezas / Subarrendamiento",
"rates": "",
"repairdata": "Datos de reparación",

View File

@@ -2174,6 +2174,7 @@
"insurance": "",
"labor": "La main d'oeuvre",
"lifecycle": "",
"parts": "",
"partssublet": "Pièces / Sous-location",
"rates": "",
"repairdata": "Données de réparation",

View File

@@ -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,