feature/IO-3497-Ant-Design-v5-to-v6 - Signed off Files
This commit is contained in:
153
client/package-lock.json
generated
153
client/package-lock.json
generated
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@amplitude/analytics-browser": "^2.33.1",
|
"@amplitude/analytics-browser": "^2.33.1",
|
||||||
"@ant-design/pro-layout": "^7.22.6",
|
"@ant-design/pro-layout": "^7.22.6",
|
||||||
"@apollo/client": "^3.13.9",
|
"@apollo/client": "^4.0.12",
|
||||||
"@emotion/is-prop-valid": "^1.4.0",
|
"@emotion/is-prop-valid": "^1.4.0",
|
||||||
"@fingerprintjs/fingerprintjs": "^4.6.1",
|
"@fingerprintjs/fingerprintjs": "^4.6.1",
|
||||||
"@firebase/analytics": "^0.10.19",
|
"@firebase/analytics": "^0.10.19",
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
"@splitsoftware/splitio-react": "^2.6.1",
|
"@splitsoftware/splitio-react": "^2.6.1",
|
||||||
"@tanem/react-nprogress": "^5.0.56",
|
"@tanem/react-nprogress": "^5.0.56",
|
||||||
"antd": "^6.1.4",
|
"antd": "^6.1.4",
|
||||||
"apollo-link-logger": "^2.0.1",
|
"apollo-link-logger": "^3.0.0",
|
||||||
"apollo-link-sentry": "^4.4.0",
|
"apollo-link-sentry": "^4.4.0",
|
||||||
"autosize": "^6.0.1",
|
"autosize": "^6.0.1",
|
||||||
"axios": "^1.13.2",
|
"axios": "^1.13.2",
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
"normalize-url": "^8.1.1",
|
"normalize-url": "^8.1.1",
|
||||||
"object-hash": "^3.0.0",
|
"object-hash": "^3.0.0",
|
||||||
"phone": "^3.1.69",
|
"phone": "^3.1.69",
|
||||||
"posthog-js": "^1.316.1",
|
"posthog-js": "^1.318.2",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"query-string": "^9.3.1",
|
"query-string": "^9.3.1",
|
||||||
"raf-schd": "^4.0.3",
|
"raf-schd": "^4.0.3",
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
"reselect": "^5.1.1",
|
"reselect": "^5.1.1",
|
||||||
"sass": "^1.97.2",
|
"sass": "^1.97.2",
|
||||||
"socket.io-client": "^4.8.3",
|
"socket.io-client": "^4.8.3",
|
||||||
"styled-components": "^6.2.0",
|
"styled-components": "^6.3.5",
|
||||||
"subscriptions-transport-ws": "^0.11.0",
|
"subscriptions-transport-ws": "^0.11.0",
|
||||||
"use-memo-one": "^1.1.3",
|
"use-memo-one": "^1.1.3",
|
||||||
"vite-plugin-ejs": "^1.7.0",
|
"vite-plugin-ejs": "^1.7.0",
|
||||||
@@ -553,30 +553,30 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@apollo/client": {
|
"node_modules/@apollo/client": {
|
||||||
"version": "3.14.0",
|
"version": "4.0.12",
|
||||||
"resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.14.0.tgz",
|
"resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.0.12.tgz",
|
||||||
"integrity": "sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ==",
|
"integrity": "sha512-CyDR+2A18TFH08rKvH3DaV63eRE0E4pj34gT8UZIQVP64bRRXnQiYuKTf/c6oJNY8+4FrCrcPwWEldnVbh02bA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"workspaces": [
|
||||||
|
"dist",
|
||||||
|
"codegen",
|
||||||
|
"scripts/codemods/ac3-to-ac4"
|
||||||
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@graphql-typed-document-node/core": "^3.1.1",
|
"@graphql-typed-document-node/core": "^3.1.1",
|
||||||
"@wry/caches": "^1.0.0",
|
"@wry/caches": "^1.0.0",
|
||||||
"@wry/equality": "^0.5.6",
|
"@wry/equality": "^0.5.6",
|
||||||
"@wry/trie": "^0.5.0",
|
"@wry/trie": "^0.5.0",
|
||||||
"graphql-tag": "^2.12.6",
|
"graphql-tag": "^2.12.6",
|
||||||
"hoist-non-react-statics": "^3.3.2",
|
|
||||||
"optimism": "^0.18.0",
|
"optimism": "^0.18.0",
|
||||||
"prop-types": "^15.7.2",
|
"tslib": "^2.3.0"
|
||||||
"rehackt": "^0.1.0",
|
|
||||||
"symbol-observable": "^4.0.0",
|
|
||||||
"ts-invariant": "^0.10.3",
|
|
||||||
"tslib": "^2.3.0",
|
|
||||||
"zen-observable-ts": "^1.2.5"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"graphql": "^15.0.0 || ^16.0.0",
|
"graphql": "^16.0.0",
|
||||||
"graphql-ws": "^5.5.5 || ^6.0.3",
|
"graphql-ws": "^5.5.5 || ^6.0.3",
|
||||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc",
|
"react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc",
|
||||||
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc",
|
"react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc",
|
||||||
|
"rxjs": "^7.3.0",
|
||||||
"subscriptions-transport-ws": "^0.9.0 || ^0.11.0"
|
"subscriptions-transport-ws": "^0.9.0 || ^0.11.0"
|
||||||
},
|
},
|
||||||
"peerDependenciesMeta": {
|
"peerDependenciesMeta": {
|
||||||
@@ -4225,9 +4225,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@posthog/types": {
|
"node_modules/@posthog/types": {
|
||||||
"version": "1.316.1",
|
"version": "1.318.2",
|
||||||
"resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.316.1.tgz",
|
"resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.318.2.tgz",
|
||||||
"integrity": "sha512-rh8GSOnmnwd0fUIBYzQcXt4WYXMg9QPkY0tE46K0eneWYVyqNYXFXzcdf2U37g+ZYNiBq9ubLeCD7h0C0MDJgw==",
|
"integrity": "sha512-/4m1DStpyaZStTJJ4b7RyftnFoSM/IWmVBTiWvdm2e2I8A8W3D4+YY7YkTpPtTinRZEhDQEZFjhlHdDgNCiNuA==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/aspromise": {
|
"node_modules/@protobufjs/aspromise": {
|
||||||
@@ -6805,7 +6805,7 @@
|
|||||||
"version": "2.0.7",
|
"version": "2.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
|
||||||
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
|
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/unist": {
|
"node_modules/@types/unist": {
|
||||||
@@ -7266,16 +7266,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/apollo-link-logger": {
|
"node_modules/apollo-link-logger": {
|
||||||
"version": "2.0.1",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/apollo-link-logger/-/apollo-link-logger-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/apollo-link-logger/-/apollo-link-logger-3.0.0.tgz",
|
||||||
"integrity": "sha512-4KkdwCqWtlOc0vx0W/5o+UfotyZtcJZicraKNyo2KTaCmAGSJ8vDnNRyDlv6o5XtSgdv4NA36cSe6dt49OkGWA==",
|
"integrity": "sha512-7j557AndpQXqmOg6MLERh9eCGrKdQSoIzHPSU+9Umw8EnkwU+CphCXb4p22Zx6yRnYxVV7fOrqbB+4lsfloATQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10",
|
"node": ">= 10",
|
||||||
"npm": "> 3"
|
"npm": "> 3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@apollo/client": "^3.0.0"
|
"@apollo/client": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/apollo-link-sentry": {
|
"node_modules/apollo-link-sentry": {
|
||||||
@@ -9156,6 +9156,15 @@
|
|||||||
"url": "https://bevry.me/fund"
|
"url": "https://bevry.me/fund"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/dompurify": {
|
||||||
|
"version": "3.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz",
|
||||||
|
"integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==",
|
||||||
|
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@types/trusted-types": "^2.0.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/dot-case": {
|
"node_modules/dot-case": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
|
||||||
@@ -14189,16 +14198,18 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/posthog-js": {
|
"node_modules/posthog-js": {
|
||||||
"version": "1.316.1",
|
"version": "1.318.2",
|
||||||
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.316.1.tgz",
|
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.318.2.tgz",
|
||||||
"integrity": "sha512-4B0PHnMZwjV9aoQRQ5OqrPa40aCVlqRx1aZMCZCbZ4Z7c91bpOJDpENGGyxFvjUoNN+f8MP8LHZBdn5DPQyWTg==",
|
"integrity": "sha512-M5C/3HYlyNaqmCIwgGkmJLcGt5MREwsllwGLAOO3nMYhrWSjEuJnEzenplHxa/4UgwvhR4121ErzRHgK67qq1A==",
|
||||||
"license": "SEE LICENSE IN LICENSE",
|
"license": "SEE LICENSE IN LICENSE",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@posthog/core": "1.9.1",
|
"@posthog/core": "1.9.1",
|
||||||
"@posthog/types": "1.316.1",
|
"@posthog/types": "1.318.2",
|
||||||
"core-js": "^3.38.1",
|
"core-js": "^3.38.1",
|
||||||
|
"dompurify": "^3.3.1",
|
||||||
"fflate": "^0.4.8",
|
"fflate": "^0.4.8",
|
||||||
"preact": "^10.19.3",
|
"preact": "^10.19.3",
|
||||||
|
"query-selector-shadow-dom": "^1.0.1",
|
||||||
"web-vitals": "^4.2.4"
|
"web-vitals": "^4.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -14411,6 +14422,12 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/query-selector-shadow-dom": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/query-string": {
|
"node_modules/query-string": {
|
||||||
"version": "9.3.1",
|
"version": "9.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/query-string/-/query-string-9.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/query-string/-/query-string-9.3.1.tgz",
|
||||||
@@ -15249,24 +15266,6 @@
|
|||||||
"regjsparser": "bin/parser"
|
"regjsparser": "bin/parser"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rehackt": {
|
|
||||||
"version": "0.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz",
|
|
||||||
"integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"peerDependencies": {
|
|
||||||
"@types/react": "*",
|
|
||||||
"react": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@types/react": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"react": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/remark-parse": {
|
"node_modules/remark-parse": {
|
||||||
"version": "11.0.0",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
|
||||||
@@ -16543,20 +16542,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/styled-components": {
|
"node_modules/styled-components": {
|
||||||
"version": "6.2.0",
|
"version": "6.3.5",
|
||||||
"resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.5.tgz",
|
||||||
"integrity": "sha512-ryFCkETE++8jlrBmC+BoGPUN96ld1/Yp0s7t5bcXDobrs4XoXroY1tN+JbFi09hV6a5h3MzbcVi8/BGDP0eCgQ==",
|
"integrity": "sha512-f8jAunVw/r41o17+JlWVlMTsyBKyghCdQ84YCKPxgKSMOZJbK3CKPxeIhotz6hlXvHb0w62zG4yyOdGY0kaB3g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/is-prop-valid": "1.2.2",
|
"@emotion/is-prop-valid": "1.4.0",
|
||||||
"@emotion/unitless": "0.8.1",
|
"@emotion/unitless": "0.10.0",
|
||||||
"@types/stylis": "4.2.7",
|
"@types/stylis": "4.2.7",
|
||||||
"css-to-react-native": "3.2.0",
|
"css-to-react-native": "3.2.0",
|
||||||
"csstype": "3.2.3",
|
"csstype": "3.2.3",
|
||||||
"postcss": "8.4.49",
|
"postcss": "8.4.49",
|
||||||
"shallowequal": "1.1.0",
|
"shallowequal": "1.1.0",
|
||||||
"stylis": "4.3.6",
|
"stylis": "4.3.6",
|
||||||
"tslib": "2.6.2"
|
"tslib": "2.8.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 16"
|
"node": ">= 16"
|
||||||
@@ -16570,33 +16569,12 @@
|
|||||||
"react-dom": ">= 16.8.0"
|
"react-dom": ">= 16.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/styled-components/node_modules/@emotion/is-prop-valid": {
|
|
||||||
"version": "1.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
|
|
||||||
"integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@emotion/memoize": "^0.8.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/styled-components/node_modules/@emotion/memoize": {
|
|
||||||
"version": "0.8.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
|
|
||||||
"integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/styled-components/node_modules/@emotion/unitless": {
|
"node_modules/styled-components/node_modules/@emotion/unitless": {
|
||||||
"version": "0.8.1",
|
"version": "0.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
|
||||||
"integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
|
"integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/styled-components/node_modules/tslib": {
|
|
||||||
"version": "2.6.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
|
||||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
|
||||||
"license": "0BSD"
|
|
||||||
},
|
|
||||||
"node_modules/stylis": {
|
"node_modules/stylis": {
|
||||||
"version": "4.3.6",
|
"version": "4.3.6",
|
||||||
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
|
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
|
||||||
@@ -16695,15 +16673,6 @@
|
|||||||
"react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
"react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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/symbol-tree": {
|
"node_modules/symbol-tree": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
||||||
@@ -17038,18 +17007,6 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"url": "https://github.com/sponsors/wooorm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/tslib": {
|
"node_modules/tslib": {
|
||||||
"version": "2.8.1",
|
"version": "2.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@amplitude/analytics-browser": "^2.33.1",
|
"@amplitude/analytics-browser": "^2.33.1",
|
||||||
"@ant-design/pro-layout": "^7.22.6",
|
"@ant-design/pro-layout": "^7.22.6",
|
||||||
"@apollo/client": "^3.13.9",
|
"@apollo/client": "^4.0.12",
|
||||||
"@emotion/is-prop-valid": "^1.4.0",
|
"@emotion/is-prop-valid": "^1.4.0",
|
||||||
"@fingerprintjs/fingerprintjs": "^4.6.1",
|
"@fingerprintjs/fingerprintjs": "^4.6.1",
|
||||||
"@firebase/analytics": "^0.10.19",
|
"@firebase/analytics": "^0.10.19",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"@splitsoftware/splitio-react": "^2.6.1",
|
"@splitsoftware/splitio-react": "^2.6.1",
|
||||||
"@tanem/react-nprogress": "^5.0.56",
|
"@tanem/react-nprogress": "^5.0.56",
|
||||||
"antd": "^6.1.4",
|
"antd": "^6.1.4",
|
||||||
"apollo-link-logger": "^2.0.1",
|
"apollo-link-logger": "^3.0.0",
|
||||||
"apollo-link-sentry": "^4.4.0",
|
"apollo-link-sentry": "^4.4.0",
|
||||||
"autosize": "^6.0.1",
|
"autosize": "^6.0.1",
|
||||||
"axios": "^1.13.2",
|
"axios": "^1.13.2",
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
"normalize-url": "^8.1.1",
|
"normalize-url": "^8.1.1",
|
||||||
"object-hash": "^3.0.0",
|
"object-hash": "^3.0.0",
|
||||||
"phone": "^3.1.69",
|
"phone": "^3.1.69",
|
||||||
"posthog-js": "^1.316.1",
|
"posthog-js": "^1.318.2",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"query-string": "^9.3.1",
|
"query-string": "^9.3.1",
|
||||||
"raf-schd": "^4.0.3",
|
"raf-schd": "^4.0.3",
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"reselect": "^5.1.1",
|
"reselect": "^5.1.1",
|
||||||
"sass": "^1.97.2",
|
"sass": "^1.97.2",
|
||||||
"socket.io-client": "^4.8.3",
|
"socket.io-client": "^4.8.3",
|
||||||
"styled-components": "^6.2.0",
|
"styled-components": "^6.3.5",
|
||||||
"subscriptions-transport-ws": "^0.11.0",
|
"subscriptions-transport-ws": "^0.11.0",
|
||||||
"use-memo-one": "^1.1.3",
|
"use-memo-one": "^1.1.3",
|
||||||
"vite-plugin-ejs": "^1.7.0",
|
"vite-plugin-ejs": "^1.7.0",
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills, ref
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
dataSource={dataSource}
|
dataSource={dataSource}
|
||||||
pagination={{ position: "top", pageSize: exportPageLimit }}
|
pagination={{ placement: "top", pageSize: exportPageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, payments,
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
dataSource={dataSource}
|
dataSource={dataSource}
|
||||||
pagination={{ position: "top", pageSize: exportPageLimit }}
|
pagination={{ placement: "top", pageSize: exportPageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
dataSource={dataSource}
|
dataSource={dataSource}
|
||||||
pagination={{ position: "top", pageSize: exportPageLimit }}
|
pagination={{ placement: "top", pageSize: exportPageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export default function AuditTrailListComponent({ loading, data }) {
|
|||||||
<Table
|
<Table
|
||||||
{...formItemLayout}
|
{...formItemLayout}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top", defaultPageSize: pageLimit }}
|
pagination={{ placement: "top", defaultPageSize: pageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ export default function EmailAuditTrailListComponent({ loading, data }) {
|
|||||||
<Table
|
<Table
|
||||||
{...formItemLayout}
|
{...formItemLayout}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top", defaultPageSize: pageLimit }}
|
pagination={{ placement: "top", defaultPageSize: pageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ export function BillDetailEditcontainer({ insertAuditTrail, bodyshop }) {
|
|||||||
/>
|
/>
|
||||||
<Form form={form} onFinish={handleFinish} initialValues={transformData(data)} layout="vertical">
|
<Form form={form} onFinish={handleFinish} initialValues={transformData(data)} layout="vertical">
|
||||||
<BillFormContainer form={form} billEdit disabled={exported} disableInHouse={isinhouse} />
|
<BillFormContainer form={form} billEdit disabled={exported} disableInHouse={isinhouse} />
|
||||||
<Divider orientation="left">{t("general.labels.media")}</Divider>
|
<Divider titlePlacement="left">{t("general.labels.media")}</Divider>
|
||||||
{bodyshop.uselocalmediaserver ? (
|
{bodyshop.uselocalmediaserver ? (
|
||||||
<JobsDocumentsLocalGallery
|
<JobsDocumentsLocalGallery
|
||||||
job={{ id: data ? data.bills_by_pk.jobid : null }}
|
job={{ id: data ? data.bills_by_pk.jobid : null }}
|
||||||
|
|||||||
@@ -429,7 +429,7 @@ export function BillFormComponent({
|
|||||||
}}
|
}}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<Divider orientation="left">{t("bills.labels.bill_lines")}</Divider>
|
<Divider titlePlacement="left">{t("bills.labels.bill_lines")}</Divider>
|
||||||
|
|
||||||
{Extended_Bill_Posting.treatment === "on" ? (
|
{Extended_Bill_Posting.treatment === "on" ? (
|
||||||
<BillFormLinesExtended
|
<BillFormLinesExtended
|
||||||
@@ -449,7 +449,7 @@ export function BillFormComponent({
|
|||||||
billEdit={billEdit}
|
billEdit={billEdit}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Divider orientation="left" style={{ display: billEdit ? "none" : null }}>
|
<Divider titlePlacement="left" style={{ display: billEdit ? "none" : null }}>
|
||||||
{t("documents.labels.upload")}
|
{t("documents.labels.upload")}
|
||||||
</Divider>
|
</Divider>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export default function BillsVendorsList() {
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
dataSource={dataSource}
|
dataSource={dataSource}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ export default function ContractsCarsComponent({ loading, data, selectedCarId, h
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={filteredData}
|
dataSource={filteredData}
|
||||||
|
|||||||
@@ -128,11 +128,7 @@ export default function ContractsJobsComponent({ loading, data, selectedJob, han
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{ placement: "top", defaultPageSize: pageLimit, defaultCurrent: defaultCurrent }}
|
||||||
position: "top",
|
|
||||||
defaultPageSize: pageLimit,
|
|
||||||
defaultCurrent: defaultCurrent
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={filteredData}
|
dataSource={filteredData}
|
||||||
|
|||||||
@@ -172,12 +172,7 @@ export function ContractsList({ bodyshop, loading, contracts, refetch, total, se
|
|||||||
scroll={{
|
scroll={{
|
||||||
x: "50%" //y: "40rem"
|
x: "50%" //y: "40rem"
|
||||||
}}
|
}}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: pageLimit, current: parseInt(page || 1, 10), total: total }}
|
||||||
position: "top",
|
|
||||||
pageSize: pageLimit,
|
|
||||||
current: parseInt(page || 1, 10),
|
|
||||||
total: total
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={contracts}
|
dataSource={contracts}
|
||||||
|
|||||||
@@ -75,12 +75,7 @@ export default function CourtesyCarContractListComponent({ contracts, totalContr
|
|||||||
<Card title={t("menus.header.courtesycars-contracts")}>
|
<Card title={t("menus.header.courtesycars-contracts")}>
|
||||||
<Table
|
<Table
|
||||||
scroll={{ x: true }}
|
scroll={{ x: true }}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: pageLimit, current: parseInt(page || 1), total: totalContracts }}
|
||||||
position: "top",
|
|
||||||
pageSize: pageLimit,
|
|
||||||
current: parseInt(page || 1),
|
|
||||||
total: totalContracts
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={contracts}
|
dataSource={contracts}
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={tableData}
|
dataSource={tableData}
|
||||||
|
|||||||
@@ -94,12 +94,7 @@ export default function CsiResponseListPaginated({ refetch, loading, responses,
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: pageLimit, current: parseInt(state.page || 1), total: total }}
|
||||||
position: "top",
|
|
||||||
pageSize: pageLimit,
|
|
||||||
current: parseInt(state.page || 1),
|
|
||||||
total: total
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={responses}
|
dataSource={responses}
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ export default function DashboardMonthlyJobCosting({ data, ...cardProps }) {
|
|||||||
<div style={{ height: "100%" }}>
|
<div style={{ height: "100%" }}>
|
||||||
<Table
|
<Table
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
pagination={{ position: "top", defaultPageSize: pageLimit }}
|
pagination={{ placement: "top", defaultPageSize: pageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
scroll={{ x: true, y: "calc(100% - 4em)" }}
|
scroll={{ x: true, y: "calc(100% - 4em)" }}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
|
|||||||
@@ -2,14 +2,14 @@ import Icon, { SyncOutlined } from "@ant-design/icons";
|
|||||||
import { useMutation, useQuery } from "@apollo/client";
|
import { useMutation, useQuery } from "@apollo/client";
|
||||||
import { Button, Dropdown, Space } from "antd";
|
import { Button, Dropdown, Space } from "antd";
|
||||||
import { PageHeader } from "@ant-design/pro-layout";
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import { useMemo, useState, useEffect } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import { Responsive, WidthProvider } from "react-grid-layout";
|
import { Responsive, WidthProvider } from "react-grid-layout";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { MdClose } from "react-icons/md";
|
import { MdClose } from "react-icons/md";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import { UPDATE_DASHBOARD_LAYOUT, QUERY_USER_DASHBOARD_LAYOUT } from "../../graphql/user.queries";
|
import { QUERY_USER_DASHBOARD_LAYOUT, UPDATE_DASHBOARD_LAYOUT } from "../../graphql/user.queries";
|
||||||
import { QUERY_DASHBOARD_BODYSHOP } from "../../graphql/bodyshop.queries";
|
import { QUERY_DASHBOARD_BODYSHOP } from "../../graphql/bodyshop.queries";
|
||||||
import { selectCurrentUser } from "../../redux/user/user.selectors";
|
import { selectCurrentUser } from "../../redux/user/user.selectors";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ export function DmsAllocationsSummaryAp({ socket, bodyshop, billids, title }) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
pagination={{ position: "top", defaultPageSize: pageLimit }}
|
pagination={{ placement: "top", defaultPageSize: pageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey={(record) => `${record.InvoiceNumber}${record.Account}`}
|
rowKey={(record) => `${record.InvoiceNumber}${record.Account}`}
|
||||||
dataSource={allocationsSummary}
|
dataSource={allocationsSummary}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ export function DmsAllocationsSummary({ mode, socket, bodyshop, jobId, title, on
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<Table
|
<Table
|
||||||
pagination={{ position: "top", defaultPageSize: pageLimit }}
|
pagination={{ placement: "top", defaultPageSize: pageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="center"
|
rowKey="center"
|
||||||
dataSource={allocationsSummary}
|
dataSource={allocationsSummary}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ export default function CDKCustomerSelector({ bodyshop, socket }) {
|
|||||||
<Button onClick={onCreateNew}>{t("jobs.actions.dms.createnewcustomer")}</Button>
|
<Button onClick={onCreateNew}>{t("jobs.actions.dms.createnewcustomer")}</Button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey={rowKey}
|
rowKey={rowKey}
|
||||||
dataSource={customerList}
|
dataSource={customerList}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ export default function FortellisCustomerSelector({ bodyshop, jobid, socket }) {
|
|||||||
<Button onClick={onCreateNew}>{t("jobs.actions.dms.createnewcustomer")}</Button>
|
<Button onClick={onCreateNew}>{t("jobs.actions.dms.createnewcustomer")}</Button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey={(r) => r.customerId}
|
rowKey={(r) => r.customerId}
|
||||||
dataSource={customerList}
|
dataSource={customerList}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export default function PBSCustomerSelector({ bodyshop, socket }) {
|
|||||||
<Button onClick={onCreateNew}>{t("jobs.actions.dms.createnewcustomer")}</Button>
|
<Button onClick={onCreateNew}>{t("jobs.actions.dms.createnewcustomer")}</Button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey={(r) => r.ContactId}
|
rowKey={(r) => r.ContactId}
|
||||||
dataSource={customerList}
|
dataSource={customerList}
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ export default function RRCustomerSelector({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey={(r) => r.custNo}
|
rowKey={(r) => r.custNo}
|
||||||
dataSource={customerList}
|
dataSource={customerList}
|
||||||
|
|||||||
@@ -74,13 +74,13 @@ export function DmsLogEvents({
|
|||||||
{/* Row 1: summary + inline "Details" toggle */}
|
{/* Row 1: summary + inline "Details" toggle */}
|
||||||
<Space wrap align="start">
|
<Space wrap align="start">
|
||||||
<Tag color={logLevelColor(level)}>{level}</Tag>
|
<Tag color={logLevelColor(level)}>{level}</Tag>
|
||||||
<Divider type="vertical" />
|
<Divider orientation="vertical" />
|
||||||
<span>{dayjs(timestamp).format("MM/DD/YYYY HH:mm:ss")}</span>
|
<span>{dayjs(timestamp).format("MM/DD/YYYY HH:mm:ss")}</span>
|
||||||
<Divider type="vertical" />
|
<Divider orientation="vertical" />
|
||||||
<span>{message}</span>
|
<span>{message}</span>
|
||||||
{hasMeta && (
|
{hasMeta && (
|
||||||
<>
|
<>
|
||||||
<Divider type="vertical" />
|
<Divider orientation="vertical" />
|
||||||
<a
|
<a
|
||||||
role="button"
|
role="button"
|
||||||
aria-expanded={isOpen}
|
aria-expanded={isOpen}
|
||||||
|
|||||||
@@ -131,10 +131,7 @@ const DateTimePicker = ({
|
|||||||
if (timeValue) {
|
if (timeValue) {
|
||||||
// When time changes, combine it with the existing date
|
// When time changes, combine it with the existing date
|
||||||
const existingDate = dayjs(value);
|
const existingDate = dayjs(value);
|
||||||
const newDateTime = existingDate
|
const newDateTime = existingDate.hour(timeValue.hour()).minute(timeValue.minute()).second(0);
|
||||||
.hour(timeValue.hour())
|
|
||||||
.minute(timeValue.minute())
|
|
||||||
.second(0);
|
|
||||||
handleChange(newDateTime);
|
handleChange(newDateTime);
|
||||||
} else {
|
} else {
|
||||||
// If time is cleared, just update with null time but keep date
|
// If time is cleared, just update with null time but keep date
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export default function GlobalSearch() {
|
|||||||
value: job.ro_number || "N/A",
|
value: job.ro_number || "N/A",
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/jobs/${job.id}`}>
|
<Link to={`/manage/jobs/${job.id}`}>
|
||||||
<Space size="small" split={<Divider type="vertical" />}>
|
<Space size="small" split={<Divider orientation="vertical" />}>
|
||||||
<strong>{job.ro_number || t("general.labels.na")}</strong>
|
<strong>{job.ro_number || t("general.labels.na")}</strong>
|
||||||
<span>{`${job.status || ""}`}</span>
|
<span>{`${job.status || ""}`}</span>
|
||||||
<span>
|
<span>
|
||||||
@@ -59,7 +59,7 @@ export default function GlobalSearch() {
|
|||||||
value: OwnerNameDisplayFunction(owner),
|
value: OwnerNameDisplayFunction(owner),
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/owners/${owner.id}`}>
|
<Link to={`/manage/owners/${owner.id}`}>
|
||||||
<Space size="small" split={<Divider type="vertical" />} wrap>
|
<Space size="small" split={<Divider orientation="vertical" />} wrap>
|
||||||
<span>
|
<span>
|
||||||
<OwnerNameDisplay ownerObject={owner} />
|
<OwnerNameDisplay ownerObject={owner} />
|
||||||
</span>
|
</span>
|
||||||
@@ -79,7 +79,7 @@ export default function GlobalSearch() {
|
|||||||
value: `${vehicle.v_model_yr || ""} ${vehicle.v_make_desc || ""} ${vehicle.v_model_desc || ""}`,
|
value: `${vehicle.v_model_yr || ""} ${vehicle.v_make_desc || ""} ${vehicle.v_model_desc || ""}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/vehicles/${vehicle.id}`}>
|
<Link to={`/manage/vehicles/${vehicle.id}`}>
|
||||||
<Space size="small" split={<Divider type="vertical" />}>
|
<Space size="small" split={<Divider orientation="vertical" />}>
|
||||||
<span>
|
<span>
|
||||||
{`${vehicle.v_model_yr || ""} ${vehicle.v_make_desc || ""} ${vehicle.v_model_desc || ""}`}
|
{`${vehicle.v_model_yr || ""} ${vehicle.v_make_desc || ""} ${vehicle.v_model_desc || ""}`}
|
||||||
</span>
|
</span>
|
||||||
@@ -101,7 +101,7 @@ export default function GlobalSearch() {
|
|||||||
value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`,
|
value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/jobs/${payment.job.id}`}>
|
<Link to={`/manage/jobs/${payment.job.id}`}>
|
||||||
<Space size="small" split={<Divider type="vertical" />}>
|
<Space size="small" split={<Divider orientation="vertical" />}>
|
||||||
<span>{payment.paymentnum}</span>
|
<span>{payment.paymentnum}</span>
|
||||||
<span>{payment.job.ro_number}</span>
|
<span>{payment.job.ro_number}</span>
|
||||||
<span>{payment.memo || ""}</span>
|
<span>{payment.memo || ""}</span>
|
||||||
@@ -121,7 +121,7 @@ export default function GlobalSearch() {
|
|||||||
value: `${bill.invoice_number} - ${bill.vendor.name}`,
|
value: `${bill.invoice_number} - ${bill.vendor.name}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/bills?billid=${bill.id}`}>
|
<Link to={`/manage/bills?billid=${bill.id}`}>
|
||||||
<Space size="small" split={<Divider type="vertical" />}>
|
<Space size="small" split={<Divider orientation="vertical" />}>
|
||||||
<span>{bill.invoice_number}</span>
|
<span>{bill.invoice_number}</span>
|
||||||
<span>{bill.vendor.name}</span>
|
<span>{bill.vendor.name}</span>
|
||||||
<span>{bill.date}</span>
|
<span>{bill.date}</span>
|
||||||
@@ -139,7 +139,7 @@ export default function GlobalSearch() {
|
|||||||
value: `${pb.firstname || ""} ${pb.lastname || ""} ${pb.company || ""}`,
|
value: `${pb.firstname || ""} ${pb.lastname || ""} ${pb.company || ""}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/phonebook?phonebookentry=${pb.id}`}>
|
<Link to={`/manage/phonebook?phonebookentry=${pb.id}`}>
|
||||||
<Space size="small" split={<Divider type="vertical" />}>
|
<Space size="small" split={<Divider orientation="vertical" />}>
|
||||||
<span>{`${pb.firstname || ""} ${pb.lastname || ""} ${pb.company || ""}`}</span>
|
<span>{`${pb.firstname || ""} ${pb.lastname || ""} ${pb.company || ""}`}</span>
|
||||||
<PhoneNumberFormatter>{pb.phone1}</PhoneNumberFormatter>
|
<PhoneNumberFormatter>{pb.phone1}</PhoneNumberFormatter>
|
||||||
<span>{pb.email}</span>
|
<span>{pb.email}</span>
|
||||||
|
|||||||
@@ -183,12 +183,7 @@ export function JobsList({ refetch, loading, jobs, total, setInventoryUpsertCont
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: pageLimit, current: parseInt(page || 1), total: total }}
|
||||||
position: "top",
|
|
||||||
pageSize: pageLimit,
|
|
||||||
current: parseInt(page || 1),
|
|
||||||
total: total
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={jobs}
|
dataSource={jobs}
|
||||||
|
|||||||
@@ -55,8 +55,9 @@ export function JobBillsTotalComponent({
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (pol.cm_received === null) {
|
if (pol.cm_received === null) {
|
||||||
return; //TODO:AIO This was previously removed. Check if functionality impacted.
|
//TODO:AIO This was previously removed. Check if functionality impacted.
|
||||||
// Skip this calculation for bills posted prior to the CNR change.
|
// Skip this calculation for bills posted prior to the CNR change.
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (pol.cm_received === false) {
|
if (pol.cm_received === false) {
|
||||||
totalReturnsMarkedNotReceived = totalReturnsMarkedNotReceived.add(
|
totalReturnsMarkedNotReceived = totalReturnsMarkedNotReceived.add(
|
||||||
@@ -174,8 +175,10 @@ export function JobBillsTotalComponent({
|
|||||||
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("bills.labels.discrepancy")}
|
title={t("bills.labels.discrepancy")}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color: discrepancy.getAmount() === 0 ? "green" : "red"
|
content: {
|
||||||
|
color: discrepancy.getAmount() === 0 ? "green" : "red"
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
value={discrepancy.toFormat()}
|
value={discrepancy.toFormat()}
|
||||||
/>
|
/>
|
||||||
@@ -208,8 +211,10 @@ export function JobBillsTotalComponent({
|
|||||||
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("bills.labels.discrepancy")}
|
title={t("bills.labels.discrepancy")}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color: discrepWithLbrAdj.getAmount() === 0 ? "green" : "red"
|
content: {
|
||||||
|
color: discrepWithLbrAdj.getAmount() === 0 ? "green" : "red"
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
value={discrepWithLbrAdj.toFormat()}
|
value={discrepWithLbrAdj.toFormat()}
|
||||||
/>
|
/>
|
||||||
@@ -242,8 +247,10 @@ export function JobBillsTotalComponent({
|
|||||||
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("bills.labels.discrepancy")}
|
title={t("bills.labels.discrepancy")}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color: discrepWithCms.getAmount() === 0 ? "green" : "red"
|
content: {
|
||||||
|
color: discrepWithCms.getAmount() === 0 ? "green" : "red"
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
value={discrepWithCms.toFormat()}
|
value={discrepWithCms.toFormat()}
|
||||||
/>
|
/>
|
||||||
@@ -290,8 +297,10 @@ export function JobBillsTotalComponent({
|
|||||||
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("bills.labels.calculatedcreditsnotreceived")}
|
title={t("bills.labels.calculatedcreditsnotreceived")}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color: calculatedCreditsNotReceived.getAmount() <= 0 ? "green" : "red"
|
content: {
|
||||||
|
color: calculatedCreditsNotReceived.getAmount() <= 0 ? "green" : "red"
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
value={
|
value={
|
||||||
calculatedCreditsNotReceived.getAmount() >= 0
|
calculatedCreditsNotReceived.getAmount() >= 0
|
||||||
@@ -313,8 +322,10 @@ export function JobBillsTotalComponent({
|
|||||||
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
<BlurWrapperComponent featureName="bills" overrideValueFunction="RandomDinero">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("bills.labels.creditsnotreceived")}
|
title={t("bills.labels.creditsnotreceived")}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color: totalReturnsMarkedNotReceived.getAmount() <= 0 ? "green" : "red"
|
content: {
|
||||||
|
color: totalReturnsMarkedNotReceived.getAmount() <= 0 ? "green" : "red"
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
value={
|
value={
|
||||||
totalReturnsMarkedNotReceived.getAmount() >= 0
|
totalReturnsMarkedNotReceived.getAmount() >= 0
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ export default function JobCostingPartsTable({ data, summaryData }) {
|
|||||||
x: "50%" //y: "40rem"
|
x: "50%" //y: "40rem"
|
||||||
}}
|
}}
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
pagination={{ position: "top", defaultPageSize: pageLimit }}
|
pagination={{ placement: "top", defaultPageSize: pageLimit }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={filteredData}
|
dataSource={filteredData}
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ export function JobDetailCards({ bodyshop, setPrintCenterContext, insertAuditTra
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<JobsDetailHeader job={data ? data.jobs_by_pk : null} />
|
<JobsDetailHeader job={data ? data.jobs_by_pk : null} />
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<Row gutter={[16, 16]}>
|
<Row gutter={[16, 16]}>
|
||||||
<Col {...span}>
|
<Col {...span}>
|
||||||
<JobDetailCardsInsuranceComponent loading={loading} data={data ? data.jobs_by_pk : null} />
|
<JobDetailCardsInsuranceComponent loading={loading} data={data ? data.jobs_by_pk : null} />
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ export function JobsAvailableScan({ partnerVersion, refetch }) {
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ loading, owners })
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
scroll={{ x: true }}
|
scroll={{ x: true }}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={owners}
|
dataSource={owners}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export default function JobsCreateVehicleInfoSearchComponent({ loading, vehicles
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
scroll={{ x: true }}
|
scroll={{ x: true }}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={vehicles}
|
dataSource={vehicles}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ export function JobsDetailRates({ jobRO, form, job, bodyshop }) {
|
|||||||
</FormRow>
|
</FormRow>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
<Divider orientation="left" type="horizontal" style={{ marginTop: ".8rem", float: "right" }}>
|
<Divider titlePlacement="left" orientation="horizontal" style={{ marginTop: ".8rem", float: "right" }}>
|
||||||
{t("jobs.forms.laborrates")}
|
{t("jobs.forms.laborrates")}
|
||||||
</Divider>
|
</Divider>
|
||||||
<Space>
|
<Space>
|
||||||
@@ -217,7 +217,7 @@ export function JobsDetailRates({ jobRO, form, job, bodyshop }) {
|
|||||||
imex: <JobsDetailRatesParts form={form} />,
|
imex: <JobsDetailRatesParts form={form} />,
|
||||||
rome: (
|
rome: (
|
||||||
<>
|
<>
|
||||||
<Divider orientation="left">Tax Profile</Divider>
|
<Divider titlePlacement="left">Tax Profile</Divider>
|
||||||
<JobsDetailRatesProfileOVerride form={form} />
|
<JobsDetailRatesProfileOVerride form={form} />
|
||||||
<JobsDetailRatesParts form={form} />
|
<JobsDetailRatesParts form={form} />
|
||||||
<JobsDetailRatesLabor form={form} />
|
<JobsDetailRatesLabor form={form} />
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useState, useCallback } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import LocalMediaGrid from "../jobs-documents-local-gallery/local-media-grid.component";
|
import LocalMediaGrid from "../jobs-documents-local-gallery/local-media-grid.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useMemo, useState, useCallback } from "react";
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
||||||
import LocalMediaGrid from "./local-media-grid.component";
|
import LocalMediaGrid from "./local-media-grid.component";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export function JobsDocumentsLocalGalleryReassign({ bodyshop, jobid, allMedia, g
|
|||||||
]}
|
]}
|
||||||
name={"jobid"}
|
name={"jobid"}
|
||||||
>
|
>
|
||||||
<JobSearchSelect notExported={false} notInvoiced={false}/>
|
<JobSearchSelect notExported={false} notInvoiced={false} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Form>
|
</Form>
|
||||||
<Space>
|
<Space>
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ export default function JobsFindModalComponent({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
pagination={{ position: "bottom" }}
|
pagination={{ placement: "bottom" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={jobsListLoading}
|
loading={jobsListLoading}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import "./layout-form-row.styles.scss";
|
|||||||
export default function LayoutFormRow({ header, children, grow = false, noDivider = false, ...restProps }) {
|
export default function LayoutFormRow({ header, children, grow = false, noDivider = false, ...restProps }) {
|
||||||
const DividerHeader = () =>
|
const DividerHeader = () =>
|
||||||
!noDivider && (
|
!noDivider && (
|
||||||
<Divider orientation="left" type="horizontal" style={{ marginTop: ".8rem" }}>
|
<Divider titlePlacement="left" orientation="horizontal" style={{ marginTop: ".8rem" }}>
|
||||||
{header}
|
{header}
|
||||||
</Divider>
|
</Divider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ function OwnerDetailJobsComponent({ bodyshop, owner, isPartsEntry }) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
pagination={{ position: "bottom" }}
|
pagination={{ placement: "bottom" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
scroll={{ x: true }}
|
scroll={{ x: true }}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export default function OwnerFindModalComponent({
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Table
|
<Table
|
||||||
pagination={{ position: "bottom" }}
|
pagination={{ placement: "bottom" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={ownersListLoading}
|
loading={ownersListLoading}
|
||||||
|
|||||||
@@ -116,12 +116,7 @@ export default function OwnersListComponent({ loading, owners, total, refetch })
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: pageLimit, current: parseInt(page || 1, 10), total: total }}
|
||||||
position: "top",
|
|
||||||
pageSize: pageLimit,
|
|
||||||
current: parseInt(page || 1, 10),
|
|
||||||
total: total
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
scroll={{ x: true }}
|
scroll={{ x: true }}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ export function PartsOrderModalComponent({
|
|||||||
</Radio.Group>
|
</Radio.Group>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<Divider orientation="left">{t("parts_orders.labels.inthisorder")}</Divider>
|
<Divider titlePlacement="left">{t("parts_orders.labels.inthisorder")}</Divider>
|
||||||
<Form.List name={["parts_order_lines", "data"]}>
|
<Form.List name={["parts_order_lines", "data"]}>
|
||||||
{(fields, { remove, move }) => {
|
{(fields, { remove, move }) => {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export default function PartsQueueDetailCard() {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<JobsDetailHeader job={data ? data.jobs_by_pk : null} />
|
<JobsDetailHeader job={data ? data.jobs_by_pk : null} />
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<PartsQueueJobLinesComponent jobLines={data.jobs_by_pk ? data.jobs_by_pk.joblines : null} />
|
<PartsQueueJobLinesComponent jobLines={data.jobs_by_pk ? data.jobs_by_pk.joblines : null} />
|
||||||
</Card>
|
</Card>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{
|
||||||
position: "top",
|
placement: "top",
|
||||||
pageSize: pageLimit
|
pageSize: pageLimit
|
||||||
// current: parseInt(page || 1),
|
// current: parseInt(page || 1),
|
||||||
// total: data && data.jobs_aggregate.aggregate.count,
|
// total: data && data.jobs_aggregate.aggregate.count,
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bod
|
|||||||
};
|
};
|
||||||
|
|
||||||
const overlay = (
|
const overlay = (
|
||||||
<Card style={{ maxWidth: "80vw", width: "100%"}}>
|
<Card style={{ maxWidth: "80vw", width: "100%" }}>
|
||||||
<Form form={form} onFinish={handleFinish} layout="vertical" onValuesChange={handleValuesChange}>
|
<Form form={form} onFinish={handleFinish} layout="vertical" onValuesChange={handleValuesChange}>
|
||||||
<Tabs
|
<Tabs
|
||||||
defaultActiveKey="1"
|
defaultActiveKey="1"
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ export function ProductionListDetail({ bodyshop, jobs, setPrintCenterContext, te
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
placement="right"
|
placement="right"
|
||||||
width={"50%"}
|
width="50%"
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
open={selected}
|
open={selected}
|
||||||
>
|
>
|
||||||
@@ -199,7 +199,11 @@ export function ProductionListDetail({ bodyshop, jobs, setPrintCenterContext, te
|
|||||||
{!bodyshop.uselocalmediaserver && (
|
{!bodyshop.uselocalmediaserver && (
|
||||||
<>
|
<>
|
||||||
<div style={{ height: "8px" }} />
|
<div style={{ height: "8px" }} />
|
||||||
<JobDetailCardsDocumentsComponent loading={loading} data={data ? data.jobs_by_pk : null} bodyshop={bodyshop} />
|
<JobDetailCardsDocumentsComponent
|
||||||
|
loading={loading}
|
||||||
|
data={data ? data.jobs_by_pk : null}
|
||||||
|
bodyshop={bodyshop}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -178,7 +178,14 @@ export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) {
|
|||||||
<BlurWrapperComponent
|
<BlurWrapperComponent
|
||||||
featureName={groupExcludeKeyFilter.find((g) => g.key === key).featureName}
|
featureName={groupExcludeKeyFilter.find((g) => g.key === key).featureName}
|
||||||
>
|
>
|
||||||
<ul style={{ listStyleType: "none", columns: grouped[key].length > 4 ? "2 auto" : "1", padding: 0, margin: 0 }}>
|
<ul
|
||||||
|
style={{
|
||||||
|
listStyleType: "none",
|
||||||
|
columns: grouped[key].length > 4 ? "2 auto" : "1",
|
||||||
|
padding: 0,
|
||||||
|
margin: 0
|
||||||
|
}}
|
||||||
|
>
|
||||||
{grouped[key].map((item) => (
|
{grouped[key].map((item) => (
|
||||||
<li key={item.key}>
|
<li key={item.key}>
|
||||||
<Radio key={item.key} value={item.key}>
|
<Radio key={item.key} value={item.key}>
|
||||||
@@ -189,7 +196,14 @@ export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) {
|
|||||||
</ul>
|
</ul>
|
||||||
</BlurWrapperComponent>
|
</BlurWrapperComponent>
|
||||||
) : (
|
) : (
|
||||||
<ul style={{ listStyleType: "none", columns: grouped[key].length > 4 ? "2 auto" : "1", padding: 0, margin: 0 }}>
|
<ul
|
||||||
|
style={{
|
||||||
|
listStyleType: "none",
|
||||||
|
columns: grouped[key].length > 4 ? "2 auto" : "1",
|
||||||
|
padding: 0,
|
||||||
|
margin: 0
|
||||||
|
}}
|
||||||
|
>
|
||||||
{grouped[key].map((item) =>
|
{grouped[key].map((item) =>
|
||||||
item.featureNameRestricted ? (
|
item.featureNameRestricted ? (
|
||||||
<li key={item.key}>
|
<li key={item.key}>
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ export function ScheduleJobModalContainer({
|
|||||||
email: (job && job.ownr_ea) || "",
|
email: (job && job.ownr_ea) || "",
|
||||||
// smartDates: [],
|
// smartDates: [],
|
||||||
start: context.scheduled_in,
|
start: context.scheduled_in,
|
||||||
scheduled_completion: context.scheduled_completion ,
|
scheduled_completion: context.scheduled_completion,
|
||||||
color: context.color,
|
color: context.color,
|
||||||
alt_transport: context.alt_transport,
|
alt_transport: context.alt_transport,
|
||||||
note: context.note
|
note: context.note
|
||||||
|
|||||||
@@ -30,12 +30,12 @@ export function ScoreboardDayStats({ bodyshop, date, entries }) {
|
|||||||
return (
|
return (
|
||||||
<Card title={dayjs(date).format("D - ddd")} className="ant-card-grid-hoverable" style={{ height: "100%" }}>
|
<Card title={dayjs(date).format("D - ddd")} className="ant-card-grid-hoverable" style={{ height: "100%" }}>
|
||||||
<Statistic
|
<Statistic
|
||||||
valueStyle={{ color: dailyBodyTarget > bodyHrs ? "red" : "green" }}
|
styles={{ content: { color: dailyBodyTarget > bodyHrs ? "red" : "green" } }}
|
||||||
label="Body"
|
label="Body"
|
||||||
value={bodyHrs.toFixed(1)}
|
value={bodyHrs.toFixed(1)}
|
||||||
/>
|
/>
|
||||||
<Statistic
|
<Statistic
|
||||||
valueStyle={{ color: dailyPaintTarget > paintHrs ? "red" : "green" }}
|
styles={{ content: { color: dailyPaintTarget > paintHrs ? "red" : "green" } }}
|
||||||
label="Refinish"
|
label="Refinish"
|
||||||
value={paintHrs.toFixed(1)}
|
value={paintHrs.toFixed(1)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ export default function ScoreboardJobsList() {
|
|||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
onChange={(tableArgs) => setState((state) => ({ ...state, ...tableArgs }))}
|
onChange={(tableArgs) => setState((state) => ({ ...state, ...tableArgs }))}
|
||||||
pagination={{
|
pagination={{
|
||||||
position: "top",
|
placement: "top",
|
||||||
pageSize: state.pageSize || pageLimit,
|
pageSize: state.pageSize || pageLimit,
|
||||||
current: state.current || 1,
|
current: state.current || 1,
|
||||||
total: data ? data.scoreboard_aggregate.aggregate.count : 0
|
total: data ? data.scoreboard_aggregate.aggregate.count : 0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Card, Col, Form, Row, Space, Statistic, Switch, Typography } from "antd";
|
import { Card, Col, Row, Space, Statistic, Switch, Typography } from "antd";
|
||||||
import dayjs from "../../utils/day";
|
import dayjs from "../../utils/day";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -41,9 +41,10 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Card
|
<Card
|
||||||
title={t("scoreboard.labels.productivestatistics")}
|
title={t("scoreboard.labels.productivestatistics")}
|
||||||
extra={
|
extra={
|
||||||
<Form.Item label={t("general.labels.tvmode")} valuePropName="checked" name={["tvmode"]}>
|
<Space>
|
||||||
|
<Typography.Text>{t("general.labels.tvmode")}</Typography.Text>
|
||||||
<Switch onClick={() => setIsLarge(!isLarge)} defaultChecked={isLarge} />
|
<Switch onClick={() => setIsLarge(!isLarge)} defaultChecked={isLarge} />
|
||||||
</Form.Item>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Row gutter={[16, 16]}>
|
<Row gutter={[16, 16]}>
|
||||||
@@ -60,15 +61,17 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={data.seperatedThisWeek[day].total}
|
value={data.seperatedThisWeek[day].total}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.seperatedThisWeek[day].total) >=
|
color:
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget +
|
parseFloat(data.seperatedThisWeek[day].total) >=
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget
|
bodyshop.scoreboard_target.dailyBodyTarget +
|
||||||
? "green"
|
bodyshop.scoreboard_target.dailyPaintTarget
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -78,14 +81,16 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={data.seperatedThisWeek[day].lab}
|
value={data.seperatedThisWeek[day].lab}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.seperatedThisWeek[day].lab) >=
|
color:
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget
|
parseFloat(data.seperatedThisWeek[day].lab) >=
|
||||||
? "green"
|
bodyshop.scoreboard_target.dailyBodyTarget
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -93,14 +98,16 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={data.seperatedThisWeek[day].lar}
|
value={data.seperatedThisWeek[day].lar}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.seperatedThisWeek[day].lar) >=
|
color:
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget
|
parseFloat(data.seperatedThisWeek[day].lar) >=
|
||||||
? "green"
|
bodyshop.scoreboard_target.dailyPaintTarget
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -122,25 +129,27 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={data.totalThisWeek}
|
value={data.totalThisWeek}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalThisWeek) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalThisWeek) >=
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget,
|
|
||||||
dayjs().startOf("week"),
|
|
||||||
dayjs().endOf("week"),
|
|
||||||
bodyshop
|
|
||||||
) +
|
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget,
|
bodyshop.scoreboard_target.dailyBodyTarget,
|
||||||
dayjs().startOf("week"),
|
dayjs().startOf("week"),
|
||||||
dayjs().endOf("week"),
|
dayjs().endOf("week"),
|
||||||
bodyshop
|
bodyshop
|
||||||
)
|
) +
|
||||||
? "green"
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
: "red",
|
bodyshop.scoreboard_target.dailyPaintTarget,
|
||||||
fontSize: statisticSize,
|
dayjs().startOf("week"),
|
||||||
fontWeight: statisticWeight
|
dayjs().endOf("week"),
|
||||||
|
bodyshop
|
||||||
|
)
|
||||||
|
? "green"
|
||||||
|
: "red",
|
||||||
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -150,19 +159,21 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={data.totalThisWeekLAB}
|
value={data.totalThisWeekLAB}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalThisWeekLAB) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalThisWeekLAB) >=
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget,
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
dayjs().startOf("week"),
|
bodyshop.scoreboard_target.dailyBodyTarget,
|
||||||
dayjs().endOf("week"),
|
dayjs().startOf("week"),
|
||||||
bodyshop
|
dayjs().endOf("week"),
|
||||||
)
|
bodyshop
|
||||||
? "green"
|
)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -170,19 +181,21 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={data.totalThisWeekLAR}
|
value={data.totalThisWeekLAR}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalThisWeekLAR) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalThisWeekLAR) >=
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget,
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
dayjs().startOf("week"),
|
bodyshop.scoreboard_target.dailyPaintTarget,
|
||||||
dayjs().endOf("week"),
|
dayjs().startOf("week"),
|
||||||
bodyshop
|
dayjs().endOf("week"),
|
||||||
)
|
bodyshop
|
||||||
? "green"
|
)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -196,25 +209,27 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={data.totalLastWeek}
|
value={data.totalLastWeek}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalLastWeek) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalLastWeek) >=
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget,
|
|
||||||
dayjs().subtract(1, "week").startOf("week"),
|
|
||||||
dayjs().subtract(1, "week").endOf("week"),
|
|
||||||
bodyshop
|
|
||||||
) +
|
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget,
|
bodyshop.scoreboard_target.dailyBodyTarget,
|
||||||
dayjs().subtract(1, "week").startOf("week"),
|
dayjs().subtract(1, "week").startOf("week"),
|
||||||
dayjs().subtract(1, "week").endOf("week"),
|
dayjs().subtract(1, "week").endOf("week"),
|
||||||
bodyshop
|
bodyshop
|
||||||
)
|
) +
|
||||||
? "green"
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
: "red",
|
bodyshop.scoreboard_target.dailyPaintTarget,
|
||||||
fontSize: statisticSize,
|
dayjs().subtract(1, "week").startOf("week"),
|
||||||
fontWeight: statisticWeight
|
dayjs().subtract(1, "week").endOf("week"),
|
||||||
|
bodyshop
|
||||||
|
)
|
||||||
|
? "green"
|
||||||
|
: "red",
|
||||||
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -224,19 +239,21 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={data.totalLastWeekLAB}
|
value={data.totalLastWeekLAB}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalLastWeekLAB) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalLastWeekLAB) >=
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget,
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
dayjs().subtract(1, "week").startOf("week"),
|
bodyshop.scoreboard_target.dailyBodyTarget,
|
||||||
dayjs().subtract(1, "week").endOf("week"),
|
dayjs().subtract(1, "week").startOf("week"),
|
||||||
bodyshop
|
dayjs().subtract(1, "week").endOf("week"),
|
||||||
)
|
bodyshop
|
||||||
? "green"
|
)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -244,19 +261,21 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={data.totalLastWeekLAR}
|
value={data.totalLastWeekLAR}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalLastWeekLAR) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalLastWeekLAR) >=
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget,
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
dayjs().subtract(1, "week").startOf("week"),
|
bodyshop.scoreboard_target.dailyPaintTarget,
|
||||||
dayjs().subtract(1, "week").endOf("week"),
|
dayjs().subtract(1, "week").startOf("week"),
|
||||||
bodyshop
|
dayjs().subtract(1, "week").endOf("week"),
|
||||||
)
|
bodyshop
|
||||||
? "green"
|
)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -270,25 +289,27 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={data.totalPriorWeek}
|
value={data.totalPriorWeek}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalPriorWeek) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalPriorWeek) >=
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget,
|
|
||||||
dayjs().subtract(2, "week").startOf("week"),
|
|
||||||
dayjs().subtract(2, "week").endOf("week"),
|
|
||||||
bodyshop
|
|
||||||
) +
|
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget,
|
bodyshop.scoreboard_target.dailyBodyTarget,
|
||||||
dayjs().subtract(2, "week").startOf("week"),
|
dayjs().subtract(2, "week").startOf("week"),
|
||||||
dayjs().subtract(2, "week").endOf("week"),
|
dayjs().subtract(2, "week").endOf("week"),
|
||||||
bodyshop
|
bodyshop
|
||||||
)
|
) +
|
||||||
? "green"
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
: "red",
|
bodyshop.scoreboard_target.dailyPaintTarget,
|
||||||
fontSize: statisticSize,
|
dayjs().subtract(2, "week").startOf("week"),
|
||||||
fontWeight: statisticWeight
|
dayjs().subtract(2, "week").endOf("week"),
|
||||||
|
bodyshop
|
||||||
|
)
|
||||||
|
? "green"
|
||||||
|
: "red",
|
||||||
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -298,19 +319,21 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={data.totalPriorWeekLAB}
|
value={data.totalPriorWeekLAB}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalPriorWeekLAB) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalPriorWeekLAB) >=
|
||||||
bodyshop.scoreboard_target.dailyBodyTarget,
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
dayjs().subtract(2, "week").startOf("week"),
|
bodyshop.scoreboard_target.dailyBodyTarget,
|
||||||
dayjs().subtract(2, "week").endOf("week"),
|
dayjs().subtract(2, "week").startOf("week"),
|
||||||
bodyshop
|
dayjs().subtract(2, "week").endOf("week"),
|
||||||
)
|
bodyshop
|
||||||
? "green"
|
)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -318,19 +341,21 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={data.totalPriorWeekLAR}
|
value={data.totalPriorWeekLAR}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalPriorWeekLAR) >=
|
color:
|
||||||
Util.WeeklyTargetHrsInPeriod(
|
parseFloat(data.totalPriorWeekLAR) >=
|
||||||
bodyshop.scoreboard_target.dailyPaintTarget,
|
Util.WeeklyTargetHrsInPeriod(
|
||||||
dayjs().subtract(2, "week").startOf("week"),
|
bodyshop.scoreboard_target.dailyPaintTarget,
|
||||||
dayjs().subtract(2, "week").endOf("week"),
|
dayjs().subtract(2, "week").startOf("week"),
|
||||||
bodyshop
|
dayjs().subtract(2, "week").endOf("week"),
|
||||||
)
|
bodyshop
|
||||||
? "green"
|
)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -347,15 +372,17 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={data.totalThisMonth}
|
value={data.totalThisMonth}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalThisMonth) >=
|
color:
|
||||||
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop) +
|
parseFloat(data.totalThisMonth) >=
|
||||||
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop) +
|
||||||
? "green"
|
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -365,14 +392,16 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={data.totalThisMonthLAB}
|
value={data.totalThisMonthLAB}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalThisMonthLAB) >=
|
color:
|
||||||
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop)
|
parseFloat(data.totalThisMonthLAB) >=
|
||||||
? "green"
|
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -380,14 +409,16 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={data.totalThisMonthLAR}
|
value={data.totalThisMonthLAR}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalThisMonthLAR) >=
|
color:
|
||||||
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
parseFloat(data.totalThisMonthLAR) >=
|
||||||
? "green"
|
Util.MonthlyTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -401,15 +432,17 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={data.totalLastMonth}
|
value={data.totalLastMonth}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalLastMonth) >=
|
color:
|
||||||
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop) +
|
parseFloat(data.totalLastMonth) >=
|
||||||
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop) +
|
||||||
? "green"
|
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -419,14 +452,16 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={data.totalLastMonthLAB}
|
value={data.totalLastMonthLAB}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalLastMonthLAB) >=
|
color:
|
||||||
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop)
|
parseFloat(data.totalLastMonthLAB) >=
|
||||||
? "green"
|
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyBodyTarget, bodyshop)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -434,14 +469,16 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={data.totalLastMonthLAR}
|
value={data.totalLastMonthLAR}
|
||||||
valueStyle={{
|
styles={{
|
||||||
color:
|
content: {
|
||||||
parseFloat(data.totalLastMonthLAR) >=
|
color:
|
||||||
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
parseFloat(data.totalLastMonthLAR) >=
|
||||||
? "green"
|
Util.LastMonthTargetHrs(bodyshop.scoreboard_target.dailyPaintTarget, bodyshop)
|
||||||
: "red",
|
? "green"
|
||||||
fontSize: statisticSize,
|
: "red",
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -455,9 +492,11 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={`${data.totalEffieciencyOverPeriod || 0}%`}
|
value={`${data.totalEffieciencyOverPeriod || 0}%`}
|
||||||
valueStyle={{
|
styles={{
|
||||||
fontSize: statisticSize,
|
content: {
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -467,9 +506,11 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.body")}</Typography.Text>}
|
||||||
value={`${data.totalEffieciencyOverPeriodLAB || 0}%`}
|
value={`${data.totalEffieciencyOverPeriodLAB || 0}%`}
|
||||||
valueStyle={{
|
styles={{
|
||||||
fontSize: statisticSize,
|
content: {
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -477,9 +518,11 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.refinish")}</Typography.Text>}
|
||||||
value={`${data.totalEffieciencyOverPeriodLAR || 0}%`}
|
value={`${data.totalEffieciencyOverPeriodLAR || 0}%`}
|
||||||
valueStyle={{
|
styles={{
|
||||||
fontSize: statisticSize,
|
content: {
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -492,9 +535,11 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Statistic
|
<Statistic
|
||||||
value={jobData.count}
|
value={jobData.count}
|
||||||
valueStyle={{
|
styles={{
|
||||||
fontSize: statisticSize,
|
content: {
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -504,9 +549,11 @@ export function ScoreboardTicketsStats({ data, jobData, bodyshop }) {
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={<Typography.Text strong>{t("scoreboard.labels.totalhrs")}</Typography.Text>}
|
title={<Typography.Text strong>{t("scoreboard.labels.totalhrs")}</Typography.Text>}
|
||||||
value={jobData.tthrs}
|
value={jobData.tthrs}
|
||||||
valueStyle={{
|
styles={{
|
||||||
fontSize: statisticSize,
|
content: {
|
||||||
fontWeight: statisticWeight
|
fontSize: statisticSize,
|
||||||
|
fontWeight: statisticWeight
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ export default function ShopEmployeesListComponent({ loading, employees }) {
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={employees}
|
dataSource={employees}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
<Select mode="tags" />
|
<Select mode="tags" />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<Divider orientation="left">{t("bodyshop.labels.workingdays")}</Divider>
|
<Divider titlePlacement="left">{t("bodyshop.labels.workingdays")}</Divider>
|
||||||
<Space wrap size="large" id="workingdays">
|
<Space wrap size="large" id="workingdays">
|
||||||
<Form.Item label={t("general.labels.sunday")} name={["workingdays", "sunday"]} valuePropName="checked">
|
<Form.Item label={t("general.labels.sunday")} name={["workingdays", "sunday"]} valuePropName="checked">
|
||||||
<Switch />
|
<Switch />
|
||||||
|
|||||||
@@ -10,9 +10,7 @@ export default function ShopInfoSpeedPrint() {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const allTemplates = TemplateList("job");
|
const allTemplates = TemplateList("job");
|
||||||
const TemplateListGenerated = InstanceRenderManager({
|
const TemplateListGenerated = InstanceRenderManager({
|
||||||
imex: Object.fromEntries(
|
imex: Object.fromEntries(Object.entries(allTemplates).filter(([, { enhanced_payroll }]) => !enhanced_payroll)),
|
||||||
Object.entries(allTemplates).filter(([, { enhanced_payroll }]) => !enhanced_payroll)
|
|
||||||
),
|
|
||||||
rome: allTemplates
|
rome: allTemplates
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export default function ShopEmployeeTeamsListComponent({ loading, employee_teams
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={employee_teams}
|
dataSource={employee_teams}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export function ShopInfoUsersComponent({ bodyshop }) {
|
|||||||
<div>
|
<div>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={data && data.associations}
|
dataSource={data && data.associations}
|
||||||
|
|||||||
@@ -95,9 +95,9 @@ export function TechLookupJobsDrawer({ bodyshop, setPrintCenterContext }) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<JobsDetailHeader job={data.jobs_by_pk} disabled />
|
<JobsDetailHeader job={data.jobs_by_pk} disabled />
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<Tabs
|
<Tabs
|
||||||
size="large"
|
width="large"
|
||||||
defaultActiveKey="lines"
|
defaultActiveKey="lines"
|
||||||
items={[
|
items={[
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -189,12 +189,7 @@ export function TtApprovalsListComponent({
|
|||||||
scroll={{
|
scroll={{
|
||||||
x: true
|
x: true
|
||||||
}}
|
}}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: 25, current: parseInt(page || 1), total: total }}
|
||||||
position: "top",
|
|
||||||
pageSize: 25,
|
|
||||||
current: parseInt(page || 1),
|
|
||||||
total: total
|
|
||||||
}}
|
|
||||||
dataSource={tt_approval_queue}
|
dataSource={tt_approval_queue}
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
|
|||||||
@@ -104,12 +104,7 @@ export default function VehiclesListComponent({ loading, vehicles, total, refetc
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{ placement: "top", pageSize: pageLimit, current: parseInt(page || 1), total: total }}
|
||||||
position: "top",
|
|
||||||
pageSize: pageLimit,
|
|
||||||
current: parseInt(page || 1),
|
|
||||||
total: total
|
|
||||||
}}
|
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
scroll={{ x: true }}
|
scroll={{ x: true }}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export default function VendorsListComponent({ handleNewVendor, loading, handleO
|
|||||||
>
|
>
|
||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ placement: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -537,17 +537,7 @@ const SocketProvider = ({ children, bodyshop, navigate, currentUser }) => {
|
|||||||
setIsConnected(false);
|
setIsConnected(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}, [
|
}, [bodyshop?.id, userAssociationId, Realtime_Notifications_UI?.treatment]);
|
||||||
bodyshop,
|
|
||||||
notification,
|
|
||||||
userAssociationId,
|
|
||||||
markNotificationRead,
|
|
||||||
markAllNotificationsRead,
|
|
||||||
navigate,
|
|
||||||
currentUser,
|
|
||||||
Realtime_Notifications_UI,
|
|
||||||
t
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SocketContext.Provider
|
<SocketContext.Provider
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export default function CourtesyCarDetailPageComponent({ contracts, form, saveLo
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<CourtesyCarCreateFormComponent form={form} saveLoading={saveLoading} />
|
<CourtesyCarCreateFormComponent form={form} saveLoading={saveLoading} />
|
||||||
</Col>
|
</Col>
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<CourtesyCarContractListComponent contracts={contracts} totalContracts={totalContracts} />
|
<CourtesyCarContractListComponent contracts={contracts} totalContracts={totalContracts} />
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ export function ExportLogsPageComponent() {
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{
|
||||||
position: "top",
|
placement: "top",
|
||||||
pageSize: pageLimit,
|
pageSize: pageLimit,
|
||||||
current: parseInt(page || 1, 10),
|
current: parseInt(page || 1, 10),
|
||||||
total: data && data.search_exportlog_aggregate.aggregate.count
|
total: data && data.search_exportlog_aggregate.aggregate.count
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ export function JobsDetailPage({
|
|||||||
extra={menuExtra}
|
extra={menuExtra}
|
||||||
/>
|
/>
|
||||||
<JobsDetailHeader job={job} />
|
<JobsDetailHeader job={job} />
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<JobProfileDataWarning job={job} />
|
<JobProfileDataWarning job={job} />
|
||||||
<FormFieldsChanged form={form} />
|
<FormFieldsChanged form={form} />
|
||||||
<Tabs
|
<Tabs
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export default function OwnersDetailComponent({ owner, refetch }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<OwnerDetailForm owner={owner} refetch={refetch} />
|
<OwnerDetailForm owner={owner} refetch={refetch} />
|
||||||
</Col>
|
</Col>
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<OwnerDetailJobsComponent owner={owner} />
|
<OwnerDetailJobsComponent owner={owner} />
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ export function PhonebookPageComponent({ bodyshop, authLevel }) {
|
|||||||
<Table
|
<Table
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{
|
pagination={{
|
||||||
position: "top",
|
placement: "top",
|
||||||
pageSize: pageLimit,
|
pageSize: pageLimit,
|
||||||
current: parseInt(page || 1, 10),
|
current: parseInt(page || 1, 10),
|
||||||
total: data && data.search_phonebook_aggregate.aggregate.count
|
total: data && data.search_phonebook_aggregate.aggregate.count
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ export function SimplifiedPartsJobDetailComponent({ setPrintCenterContext, jobRO
|
|||||||
|
|
||||||
<PageHeader title={<Space>{job.ro_number || t("general.labels.na")}</Space>} extra={menuExtra} />
|
<PageHeader title={<Space>{job.ro_number || t("general.labels.na")}</Space>} extra={menuExtra} />
|
||||||
<JobsDetailHeader job={job} />
|
<JobsDetailHeader job={job} />
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<FormFieldsChanged form={form} />
|
<FormFieldsChanged form={form} />
|
||||||
<Tabs
|
<Tabs
|
||||||
defaultActiveKey={search.tab}
|
defaultActiveKey={search.tab}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export default function VehicleDetailComponent({ vehicle, refetch }) {
|
|||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<VehicleDetailFormContainer vehicle={vehicle} refetch={refetch} />
|
<VehicleDetailFormContainer vehicle={vehicle} refetch={refetch} />
|
||||||
</Col>
|
</Col>
|
||||||
<Divider type="horizontal" />
|
<Divider orientation="horizontal" />
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<VehicleDetailJobsComponent vehicle={vehicle} />
|
<VehicleDetailJobsComponent vehicle={vehicle} />
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
Reference in New Issue
Block a user