Added closed date to jobs and reformatted some items

This commit is contained in:
Patrick Fic
2020-10-19 11:44:34 -07:00
parent 65165906d4
commit 2c696425b6
27 changed files with 603 additions and 211 deletions

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" DROP COLUMN "close_date";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" ADD COLUMN "close_date" date NULL;
type: run_sql

View File

@@ -0,0 +1,41 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
backend_only: false
check:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
columns:
- loss_date
- bodyshopid
- clm_no
- clm_total
- created_at
- group
- id
- ins_co_nm
- ownr_fn
- ownr_ln
- ro_number
- updated_at
- v_age
- v_makedesc
- v_mileage
- v_model
- v_model_yr
- v_type
- v_vin
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,42 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
backend_only: false
check:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
columns:
- bodyshopid
- clm_no
- clm_total
- close_date
- created_at
- group
- id
- ins_co_nm
- loss_date
- ownr_fn
- ownr_ln
- ro_number
- updated_at
- v_age
- v_makedesc
- v_mileage
- v_model
- v_model_yr
- v_type
- v_vin
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,41 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- loss_date
- bodyshopid
- clm_no
- clm_total
- created_at
- group
- id
- ins_co_nm
- ownr_fn
- ownr_ln
- ro_number
- updated_at
- v_age
- v_makedesc
- v_mileage
- v_model
- v_model_yr
- v_type
- v_vin
computed_fields: []
filter:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,42 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- bodyshopid
- clm_no
- clm_total
- close_date
- created_at
- group
- id
- ins_co_nm
- loss_date
- ownr_fn
- ownr_ln
- ro_number
- updated_at
- v_age
- v_makedesc
- v_mileage
- v_model
- v_model_yr
- v_type
- v_vin
computed_fields: []
filter:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,40 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- loss_date
- bodyshopid
- clm_no
- clm_total
- created_at
- group
- id
- ins_co_nm
- ownr_fn
- ownr_ln
- ro_number
- updated_at
- v_age
- v_makedesc
- v_mileage
- v_model
- v_model_yr
- v_type
- v_vin
filter:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -0,0 +1,41 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- bodyshopid
- clm_no
- clm_total
- close_date
- created_at
- group
- id
- ins_co_nm
- loss_date
- ownr_fn
- ownr_ln
- ro_number
- updated_at
- v_age
- v_makedesc
- v_mileage
- v_model
- v_model_yr
- v_type
- v_vin
filter:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -191,14 +191,15 @@ tables:
authid:
_eq: X-Hasura-User-Id
columns:
- loss_date
- bodyshopid
- clm_no
- clm_total
- close_date
- created_at
- group
- id
- ins_co_nm
- loss_date
- ownr_fn
- ownr_ln
- ro_number
@@ -215,14 +216,15 @@ tables:
- role: user
permission:
columns:
- loss_date
- bodyshopid
- clm_no
- clm_total
- close_date
- created_at
- group
- id
- ins_co_nm
- loss_date
- ownr_fn
- ownr_ln
- ro_number
@@ -245,14 +247,15 @@ tables:
- role: user
permission:
columns:
- loss_date
- bodyshopid
- clm_no
- clm_total
- close_date
- created_at
- group
- id
- ins_co_nm
- loss_date
- ownr_fn
- ownr_ln
- ro_number

206
package-lock.json generated
View File

@@ -1472,9 +1472,9 @@
"integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg=="
},
"@firebase/auth": {
"version": "0.14.9",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.9.tgz",
"integrity": "sha512-PxYa2r5qUEdheXTvqROFrMstK8W4uPiP7NVfp+2Bec+AjY5PxZapCx/YFDLkU0D7YBI82H74PtZrzdJZw7TJ4w==",
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.15.0.tgz",
"integrity": "sha512-IFuzhxS+HtOQl7+SZ/Mhaghy/zTU7CENsJFWbC16tv2wfLZbayKF5jYGdAU3VFLehgC8KjlcIWd10akc3XivfQ==",
"requires": {
"@firebase/auth-types": "0.10.1"
}
@@ -1531,15 +1531,15 @@
}
},
"@firebase/firestore": {
"version": "1.17.3",
"resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.17.3.tgz",
"integrity": "sha512-wRdrgeSBJ50eo63x8GnO8NgVNe3vBw2xhKhyMXl0JTWQIbxnlMjAHcz7b85VvsqPLI7U70PgWQnfQtJOXRCNUA==",
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.18.0.tgz",
"integrity": "sha512-maMq4ltkrwjDRusR2nt0qS4wldHQMp+0IDSfXIjC+SNmjnWY/t/+Skn9U3Po+dB38xpz3i7nsKbs+8utpDnPSw==",
"requires": {
"@firebase/component": "0.1.19",
"@firebase/firestore-types": "1.13.0",
"@firebase/firestore-types": "1.14.0",
"@firebase/logger": "0.2.6",
"@firebase/util": "0.3.2",
"@firebase/webchannel-wrapper": "0.3.0",
"@firebase/webchannel-wrapper": "0.4.0",
"@grpc/grpc-js": "^1.0.0",
"@grpc/proto-loader": "^0.5.0",
"node-fetch": "2.6.1",
@@ -1547,9 +1547,9 @@
}
},
"@firebase/firestore-types": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.13.0.tgz",
"integrity": "sha512-QF5CAuYOHE6Zbsn1uEg6wkl836iP+i6C0C/Zs3kF60eebxZvTWp8JSZk19Ar+jj4w+ye8/7H5olu5CqDNjWpEA=="
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.14.0.tgz",
"integrity": "sha512-WF8IBwHzZDhwyOgQnmB0pheVrLNP78A8PGxk1nxb/Nrgh1amo4/zYvFMGgSsTeaQK37xMYS/g7eS948te/dJxw=="
},
"@firebase/functions": {
"version": "0.5.1",
@@ -1686,9 +1686,9 @@
}
},
"@firebase/webchannel-wrapper": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.3.0.tgz",
"integrity": "sha512-VniCGPIgSGNEgOkh5phb3iKmSGIzcwrccy3IomMFRWPCMiCk2y98UQNJEoDs1yIHtZMstVjYWKYxnunIGzC5UQ=="
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.4.0.tgz",
"integrity": "sha512-8cUA/mg0S+BxIZ72TdZRsXKBP5n5uRcE3k29TZhZw6oIiHBt9JA7CTb/4pE1uKtE/q5NeTY2tBDcagoZ+1zjXQ=="
},
"@graphql-typed-document-node/core": {
"version": "3.1.0",
@@ -1719,9 +1719,9 @@
}
},
"@types/node": {
"version": "12.12.67",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.67.tgz",
"integrity": "sha512-R48tgL2izApf+9rYNH+3RBMbRpPeW3N8f0I9HMhggeq4UXwBDqumJ14SDs4ctTMhG11pIOduZ4z3QWGOiMc9Vg=="
"version": "12.12.68",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.68.tgz",
"integrity": "sha512-3RW2s24ewB7F9dAHvgb9FRvNHn6nO9IK6Eaknbz7HTOe2a5GVne5XbUh5+YA+kcCn67glyHhClUUdFP73LWrgQ=="
},
"camelcase": {
"version": "5.3.1",
@@ -1738,54 +1738,11 @@
"wrap-ansi": "^6.2.0"
}
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"requires": {
"p-limit": "^2.2.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -3269,9 +3226,9 @@
}
},
"antd": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/antd/-/antd-4.7.0.tgz",
"integrity": "sha512-qXXgclUmx6InkNce5BsIie9GR/39FGsVikwTMObofnVVALv+uOLH4D14reX7K50QldDXHZ7jIPU1JTkcNgtBoA==",
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/antd/-/antd-4.7.2.tgz",
"integrity": "sha512-baMyvvNRB0rqhUxi4cSaH4AG9Cd2W7TjAJnOrVTow8y5E45g3JU31+dAVUHWvtht6LTiWh4BLiKfCdZrSYBeEA==",
"requires": {
"@ant-design/colors": "^4.0.5",
"@ant-design/css-animation": "^1.7.2",
@@ -3296,7 +3253,7 @@
"rc-image": "~3.2.1",
"rc-input-number": "~6.1.0",
"rc-mentions": "~1.5.0",
"rc-menu": "~8.7.1",
"rc-menu": "~8.8.2",
"rc-motion": "^2.2.0",
"rc-notification": "~4.5.2",
"rc-pagination": "~3.1.0",
@@ -3309,7 +3266,7 @@
"rc-steps": "~4.1.0",
"rc-switch": "~3.2.0",
"rc-table": "~7.10.0",
"rc-tabs": "~11.6.0",
"rc-tabs": "~11.7.0",
"rc-textarea": "~0.3.0",
"rc-tooltip": "~5.0.0",
"rc-tree": "~3.10.0",
@@ -8485,17 +8442,62 @@
}
}
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"dependencies": {
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"requires": {
"p-limit": "^2.2.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
}
}
},
"firebase": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/firebase/-/firebase-7.23.0.tgz",
"integrity": "sha512-0b1zi0H8jT4KqyPabldzPhyKTeptw5E5a7KkjWW3MBMVV/LjbC6/NKhRR8sGQNbsbS2LnTvyEENWbqkZP2ZXtw==",
"version": "7.24.0",
"resolved": "https://registry.npmjs.org/firebase/-/firebase-7.24.0.tgz",
"integrity": "sha512-j6jIyGFFBlwWAmrlUg9HyQ/x+YpsPkc/TTkbTyeLwwAJrpAmmEHNPT6O9xtAnMV4g7d3RqLL/u9//aZlbY4rQA==",
"requires": {
"@firebase/analytics": "0.6.0",
"@firebase/app": "0.6.11",
"@firebase/app-types": "0.6.1",
"@firebase/auth": "0.14.9",
"@firebase/auth": "0.15.0",
"@firebase/database": "0.6.13",
"@firebase/firestore": "1.17.3",
"@firebase/firestore": "1.18.0",
"@firebase/functions": "0.5.1",
"@firebase/installations": "0.4.17",
"@firebase/messaging": "0.7.1",
@@ -8994,16 +8996,16 @@
}
},
"google-auth-library": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.1.tgz",
"integrity": "sha512-0WfExOx3FrLYnY88RICQxvpaNzdwjz44OsHqHkIoAJfjY6Jck6CZRl1ASWadk+wbJ0LhkQ8rNY4zZebKml4Ghg==",
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.2.tgz",
"integrity": "sha512-X9EUX8R+kIpsf55KdSPhFWF0RNyBGuBc1zeYc/5Sjuk65eIYqq91rINJVBD22pp+w/PuM2fasHiA6H2xYjxTIQ==",
"requires": {
"arrify": "^2.0.0",
"base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11",
"fast-text-encoding": "^1.0.0",
"gaxios": "^3.0.0",
"gcp-metadata": "^4.1.0",
"gcp-metadata": "^4.2.0",
"gtoken": "^5.0.4",
"jws": "^4.0.0",
"lru-cache": "^6.0.0"
@@ -15271,9 +15273,9 @@
},
"dependencies": {
"@types/node": {
"version": "13.13.25",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz",
"integrity": "sha512-6ZMK4xRcF2XrPdKmPYQxZkdHKV18xKgUFVvhIgw2iwaaO6weleLPHLBGPZmLhjo+m1N+MZXRAoBEBCCVqgO2zQ=="
"version": "13.13.26",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.26.tgz",
"integrity": "sha512-+48LLqolaKj/WnIY1crfLseaGQMIDISBy3PTXVOZ7w/PBaRUv+H8t94++atzfoBAvorbUYz6Xq9vh1fHrg33ig=="
}
}
},
@@ -15376,9 +15378,9 @@
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"query-string": {
"version": "6.13.5",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz",
"integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==",
"version": "6.13.6",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.6.tgz",
"integrity": "sha512-/WWZ7d9na6s2wMEGdVCVgKWE9Rt7nYyNIf7k8xmHXcesPMlEzicWo3lbYwHyA4wBktI2KrXxxZeACLbE84hvSQ==",
"requires": {
"decode-uri-component": "^0.2.0",
"split-on-first": "^1.0.0",
@@ -15546,9 +15548,9 @@
}
},
"rc-dialog": {
"version": "8.4.1",
"resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.4.1.tgz",
"integrity": "sha512-ezdI0RLqPZyOirWg5zQK0/hUeKNIi+kfxWFAMMpawsz7Ycbwr7fq/zEU3uQRbp6bFV+9BbGLr2b9HsK2Jg0xKg==",
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.4.2.tgz",
"integrity": "sha512-8JZcJn2uJyC1pXCOsVQZH2z6norAF7NFVQ+2K0Ej83+YAZ0ZsxDDQuJGyBfnAi5M1pGJ4o+ETgSpj7VLXNwHDQ==",
"requires": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.6",
@@ -15622,9 +15624,9 @@
}
},
"rc-menu": {
"version": "8.7.1",
"resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.7.1.tgz",
"integrity": "sha512-CuuJ9oS1oPAfenqAMa3CZZE7RrPcPTHV3310cf6RO2uJgE9ztqasRFMEBwtruH16OexTr0igTCXySm+e2/TBQg==",
"version": "8.8.3",
"resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.8.3.tgz",
"integrity": "sha512-C9sT0SBXmUbVWRUseXASousacRVPnOm5aXdyJR569WIvZwbs2IncpGNmAcft1R5ZuFE3Y+SZZ5FYvtGtbCzkIQ==",
"requires": {
"@babel/runtime": "^7.10.1",
"classnames": "2.x",
@@ -15668,9 +15670,9 @@
}
},
"rc-picker": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.3.0.tgz",
"integrity": "sha512-UArXxifQqkwEvICWDe456Fx2LnCSbh3wYuEdPXSKJR3mIEjlF5qabNSEaoCykFZB3GtvDSmlsIMjXB8FMfRJ/A==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.3.3.tgz",
"integrity": "sha512-ah4ucCnAs8ss7GgV7sF7MGgRlyfP4753z+OjnF4X7cIrntygklQqiFDBZYS02RX773vhJ+jc6AbyoR7hI4aGng==",
"requires": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.1",
@@ -15678,7 +15680,7 @@
"dayjs": "^1.8.30",
"moment": "^2.24.0",
"rc-trigger": "^5.0.4",
"rc-util": "^5.0.1",
"rc-util": "^5.4.0",
"shallowequal": "^1.1.0"
}
},
@@ -15771,9 +15773,9 @@
}
},
"rc-tabs": {
"version": "11.6.2",
"resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.6.2.tgz",
"integrity": "sha512-7Z5Lg+nP/H4V7dIlewrOC0+aogRVH3ASjTy4VIletYOeStGPWYSfwBnUTBdcCXcUuWuyyKnNkYrUD0yaRqUCIA==",
"version": "11.7.0",
"resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.0.tgz",
"integrity": "sha512-nYwQcgML2drM0iau4aa6HI4qyyZSW0WpspCAtO5KGjXwHzUJcvv3qgLVuoQOWQaDDHXkI9Jj8U7Y/Hcrdyj1Kw==",
"requires": {
"@babel/runtime": "^7.11.2",
"classnames": "2.x",
@@ -15860,9 +15862,9 @@
}
},
"rc-virtual-list": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.1.1.tgz",
"integrity": "sha512-hkDj4+xEdeYKe8sX7rft/rvh6uutiGHnqdn17//YhHdWoeDfP+TmGbzG2HEHrNdJIMEb/yNxu+KVEWd7JTJ9MA==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.0.tgz",
"integrity": "sha512-NZb+Z4tGkfrCNXprVUlLJxoRVIELwLmlY5nHwiV3pj4eA9Of8thpQwtT+AomwcZjKhC7R/EDtpk2ATMJXX5s3Q==",
"requires": {
"classnames": "^2.2.6",
"rc-resize-observer": "^0.2.3",
@@ -15870,9 +15872,9 @@
}
},
"react": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
"integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
"version": "16.14.0",
"resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
"integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
@@ -16165,9 +16167,9 @@
}
},
"react-dom": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
"integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
"version": "16.14.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
"integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",

View File

@@ -9,7 +9,7 @@
"dependencies": {
"@apollo/client": "^3.2.4",
"@fingerprintjs/fingerprintjs": "^2.1.4",
"antd": "^4.7.0",
"antd": "^4.7.2",
"apollo-link-logger": "^2.0.0",
"chokidar": "^3.4.3",
"dbffile": "^1.4.3",
@@ -20,15 +20,15 @@
"electron-reload": "^1.5.0",
"electron-store": "^6.0.1",
"electron-updater": "^4.3.5",
"firebase": "^7.23.0",
"firebase": "^7.24.0",
"graphql": "^15.3.0",
"lodash": "^4.17.20",
"moment": "^2.29.1",
"node-notifier": "^8.0.0",
"node-sass": "^4.14.1",
"query-string": "^6.13.5",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"query-string": "^6.13.6",
"react": "^16.14.0",
"react-dom": "^16.14.0",
"react-infinite-scroller": "^1.2.4",
"react-redux": "^7.2.1",
"react-router-dom": "^5.2.0",

View File

@@ -50,3 +50,8 @@ body {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: #188fff;
}
//Required for the tab with infinite loading
.ant-tabs-content {
height: 100%;
}

View File

@@ -3,6 +3,7 @@ import React, { useMemo } from "react";
import { Cell, Pie, PieChart, ResponsiveContainer } from "recharts";
import ErrorResultAtom from "../error-result/error-result.atom";
import Dinero from "dinero.js";
import partTypeConverterAtom from "../part-type-converter/part-type-converter.atom";
export default function JobPartsGraphAtom({
job,
loading,
@@ -35,24 +36,31 @@ export default function JobPartsGraphAtom({
if (loading) return <Skeleton active />;
if (!job) return <ErrorResultAtom title="Error displaying job data." />;
console.log("data", data);
return (
<div
style={{ display: "flex", flexDirection: "column", alignItems: "center" }}
style={{
display: "flex",
flex: 1,
flexDirection: "column",
alignItems: "center",
}}
>
<Typography.Title level={4}>
{price === "act_price" ? "Actual Price" : "Database Price"}
</Typography.Title>
<ResponsiveContainer width="100%" height={250}>
<ResponsiveContainer>
<PieChart>
<Pie
data={data}
innerRadius={40}
outerRadius={50}
outerRadius={80}
fill="#8884d8"
paddingAngle={5}
// paddingAngle={5}
dataKey="value"
label={(entry) => `${entry.name} - ${entry.label}`}
label={(entry) =>
`${partTypeConverterAtom(entry.name)} (${entry.label})`
}
labelLine
>
{data.map((entry, index) => (
@@ -68,7 +76,7 @@ export default function JobPartsGraphAtom({
const getColor = (key) => {
switch (key) {
case "PAA":
return "tomato";
return "slategray";
case "PAL":
return "dodgeblue";
case "PAN":

View File

@@ -0,0 +1,14 @@
export default (part_type) => {
switch (part_type) {
case "PAA":
return "Aftermarket";
case "PAE":
return "Existing";
case "PAN":
return "OEM";
case "PAL":
return "LKQ";
default:
return "?";
}
};

View File

@@ -0,0 +1,44 @@
import { useMutation } from "@apollo/client";
import { DatePicker, message, Spin } from "antd";
import moment from "moment";
import React, { useState } from "react";
import { UPDATE_JOB } from "../../../graphql/jobs.queries";
export default function CloseDateDisplayMolecule({ jobId, close_date }) {
const [editMode, setEditMode] = useState(false);
const [value, setValue] = useState(moment(close_date));
const [loading, setLoading] = useState(false);
const [updateJob] = useMutation(UPDATE_JOB);
const handleChange = async (newDate) => {
setLoading(true);
setValue(newDate);
const result = await updateJob({
variables: { jobId: jobId, job: { close_date: newDate } },
});
if (!result.errors) {
message.success("Close date updated.");
} else {
message.error("Error updating job.");
}
setLoading(false);
};
if (editMode)
return (
<div onBlur={() => setEditMode(false)}>
<DatePicker
value={value.isValid() ? value : null}
onChange={handleChange}
/>
{loading && <Spin size="small" />}
</div>
);
return (
<div style={{ cursor: "pointer" }} onClick={() => setEditMode(true)}>
{value.isValid() ? value.format("MM/DD/yyyy") : "No date set"}
</div>
);
}

View File

@@ -2,6 +2,7 @@ import { Descriptions, PageHeader, Skeleton } from "antd";
import React from "react";
import CurrencyFormatterAtom from "../../atoms/currency-formatter/currency-formatter.atom";
import ErrorResultAtom from "../../atoms/error-result/error-result.atom";
import CloseDateDisplayMolecule from "../close-date-display/close-date-display.molecule";
export default function JobsDetailDescriptionMolecule({ loading, job }) {
if (loading) return <Skeleton active />;
@@ -19,6 +20,12 @@ export default function JobsDetailDescriptionMolecule({ loading, job }) {
</Descriptions.Item>
<Descriptions.Item label="Group">{job.group}</Descriptions.Item>
<Descriptions.Item label="Age">{job.v_age}</Descriptions.Item>
<Descriptions.Item label="Close Date">
<CloseDateDisplayMolecule
jobId={job.id}
close_date={job.close_date}
/>
</Descriptions.Item>
</Descriptions>
</PageHeader>
</div>

View File

@@ -1,6 +1,7 @@
import { Table } from "antd";
import React from "react";
import CurrencyFormatterAtom from "../../atoms/currency-formatter/currency-formatter.atom";
import partTypeConverterAtom from "../../atoms/part-type-converter/part-type-converter.atom";
import PriceDiffPcFormatterAtom from "../../atoms/price-diff-pc-formatter/price-diff-pc-formatter.atom";
export default function JobLinesTableMolecule({ loading, job }) {
@@ -25,6 +26,7 @@ export default function JobLinesTableMolecule({ loading, job }) {
title: "Part Type",
dataIndex: "part_type",
key: "part_type",
render: (text, record) => partTypeConverterAtom(text),
},
{
title: "Part Number",

View File

@@ -0,0 +1,62 @@
import { List } from "antd";
import React from "react";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { setSelectedJobId } from "../../../redux/application/application.actions";
import { selectSelectedJobId } from "../../../redux/application/application.selectors";
import TimeAgoFormatter from "../../atoms/time-ago-formatter/time-ago-formatter.atom";
import "./jobs-list-item.styles.scss";
const mapStateToProps = createStructuredSelector({
selectedJobId: selectSelectedJobId,
});
const mapDispatchToProps = (dispatch) => ({
setSelectedJobId: (jobId) => dispatch(setSelectedJobId(jobId)),
});
export function JobsListItemMolecule({
selectedJobId,
setSelectedJobId,
item,
}) {
const handleSelect = (jobId) => {
setSelectedJobId(jobId);
};
return (
<List.Item
className="jobs-list-item"
key={item.id}
onClick={() => handleSelect(item.id)}
>
<div
className={`jobs-list-item-content ${
item.id === selectedJobId ? "jobs-list-item-content-selected" : ""
}`}
>
<div
style={{
display: "flex",
justifyContent: "space-between",
}}
>
<strong>{item.clm_no || "No Claim Number"}</strong>
<span style={{ fontStyle: "italic" }}>
<TimeAgoFormatter>{item.updated_at}</TimeAgoFormatter>
</span>
</div>
<div>{item.ins_co_nm || "No Insurance Co."}</div>
<div>{`${item.ownr_fn} ${item.ownr_ln}`}</div>
<div>
{`${item.v_model_yr} ${item.v_makedesc} ${item.v_model} ${item.v_vin}`}
</div>
</div>
</List.Item>
);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(JobsListItemMolecule);

View File

@@ -0,0 +1,22 @@
.jobs-list-item {
padding: 0;
margin: 0;
.jobs-list-item-content {
&-selected {
border-left: 3px solid #1890ff;
}
display: inline;
margin: 0.5rem;
padding: 0.5rem;
width: 100%;
}
cursor: pointer;
&:hover {
background-color: #e6f7ff;
}
}

View File

@@ -40,6 +40,8 @@ export default function JobsTargetsStatsMolecule({ loading, job }) {
display: "flex",
alignItems: "center",
justifyContent: "space-around",
marginTop: "1rem",
marginBottom: "1rem",
}}
>
<TargetPriceDiffPcAtom v_age={job.v_age} group={job.group} />

View File

@@ -49,16 +49,23 @@ export function JobsDetailOrganism({ selectedJobId }) {
loading={loading}
job={data ? data.jobs_by_pk : null}
/>
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<JobsPartsGraphAtom
job={data ? data.jobs_by_pk : null}
loading={loading}
/>
<div
style={{
display: "flex",
justifyContent: "space-evenly",
minHeight: "20rem",
width: "100%",
}}
>
<JobsPartsGraphAtom
job={data ? data.jobs_by_pk : null}
loading={loading}
price="db_price"
/>
<JobsPartsGraphAtom
job={data ? data.jobs_by_pk : null}
loading={loading}
/>
</div>
</div>
);

View File

@@ -1,5 +1,4 @@
.jobs-detail-container {
height: 100%;
overflow-y: auto;
}

View File

@@ -1,6 +1,6 @@
import { SyncOutlined } from "@ant-design/icons";
import { useQuery } from "@apollo/client";
import { Button, List, Spin } from "antd";
import { Dropdown, List, Menu, Spin } from "antd";
import React, { useState } from "react";
import InfiniteScroll from "react-infinite-scroller";
import { connect } from "react-redux";
@@ -9,8 +9,9 @@ import { QUERY_ALL_JOBS_PAGINATED } from "../../../graphql/jobs.queries";
import { setSelectedJobId } from "../../../redux/application/application.actions";
import { selectSelectedJobId } from "../../../redux/application/application.selectors";
import ErrorResultAtom from "../../atoms/error-result/error-result.atom";
import TimeAgoFormatter from "../../atoms/time-ago-formatter/time-ago-formatter.atom";
import "./jobs-list.organism.styles.scss";
import JobsListItemMolecule from "../../molecules/jobs-list-item/jobs-list-item.molecule";
import "./jobs-list-latest.organism.styles.scss";
const mapStateToProps = createStructuredSelector({
selectedJobId: selectSelectedJobId,
});
@@ -33,6 +34,15 @@ export function JobsTableOrganism({ selectedJobId, setSelectedJobId }) {
}
);
const menu = (
<Menu>
<Menu.Item onClick={() => refetch()}>
<SyncOutlined />
Reload
</Menu.Item>
</Menu>
);
const handleInfiniteOnLoad = (page) => {
fetchMore({
variables: {
@@ -62,10 +72,6 @@ export function JobsTableOrganism({ selectedJobId, setSelectedJobId }) {
});
};
const handleSelect = (jobId) => {
setSelectedJobId(jobId);
};
if (error)
return (
<ErrorResultAtom
@@ -76,9 +82,6 @@ export function JobsTableOrganism({ selectedJobId, setSelectedJobId }) {
return (
<div className="jobs-list-container">
<Button onClick={() => refetch()}>
<SyncOutlined />
</Button>
<div className="jobs-list-infinite-container">
<InfiniteScroll
pageStart={0}
@@ -86,50 +89,19 @@ export function JobsTableOrganism({ selectedJobId, setSelectedJobId }) {
hasMore={!loading && state.hasMore}
useWindow={false}
>
<List
bordered
dataSource={data ? data.jobs : []}
renderItem={(item) => (
<List.Item
className="jobs-list-item"
key={item.id}
onClick={() => handleSelect(item.id)}
>
<div
className={`jobs-list-item-content ${
item.id === selectedJobId
? "jobs-list-item-content-selected"
: ""
}`}
>
<div
style={{
display: "flex",
justifyContent: "space-between",
}}
>
<strong>{item.clm_no || "No Claim Number"}</strong>
<span style={{ fontStyle: "italic" }}>
<TimeAgoFormatter>{item.updated_at}</TimeAgoFormatter>
</span>
</div>
<div>{item.ins_co_nm || "No Insurance Co."}</div>
<div>{`${item.ownr_fn} ${item.ownr_ln}`}</div>
<div>
{`${item.v_model_yr} ${item.v_makedesc} ${item.v_model} ${item.v_vin}`}
</div>
<Dropdown overlay={menu} trigger={["contextMenu"]}>
<List
bordered
dataSource={data ? data.jobs : []}
renderItem={(item) => <JobsListItemMolecule item={item} />}
>
{loading && state.hasMore && (
<div>
<Spin />
</div>
</List.Item>
)}
>
{loading && state.hasMore && (
<div>
<Spin />
</div>
)}
</List>
)}
</List>
</Dropdown>
</InfiniteScroll>
</div>
{`${data ? data.jobs.length : 0} jobs loaded. ${

View File

@@ -0,0 +1,9 @@
.jobs-list-container {
height: 100%;
}
.jobs-list-infinite-container {
overflow-y: auto;
overflow-x: hidden;
height: 100%;
}

View File

@@ -1,30 +0,0 @@
.jobs-list-container {
height: 100%;
}
.jobs-list-infinite-container {
overflow-y: auto;
overflow-x: hidden;
height: 100%;
}
.jobs-list-item {
padding: 0;
margin: 0;
.jobs-list-item-content {
&-selected {
border-left: 3px solid #1890ff;
}
display: inline;
margin: 0.5rem;
padding: 0.5rem;
width: 100%;
}
cursor: pointer;
&:hover {
background-color: #e6f7ff;
}
}

View File

@@ -1,9 +1,9 @@
import { Col, Row } from "antd";
import { Col, Row, Tabs } from "antd";
import React from "react";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import JobsDetailOrganism from "../../organisms/jobs-detail/jobs-detail.organism";
import JobsListOrganism from "../../organisms/jobs-list/jobs-list.organism";
import JobsListOrganism from "../../organisms/jobs-list-latest/jobs-list-latest.organism";
const mapStateToProps = createStructuredSelector({});
const mapDispatchToProps = (dispatch) => ({});
@@ -13,7 +13,14 @@ export function JobsPage() {
<div style={{ height: "100%" }}>
<Row gutter={[16, 16]} style={{ height: "100%" }}>
<Col span={6} style={{ height: "100%" }}>
<JobsListOrganism />
<Tabs defaultActiveKey="search" style={{ height: "100%" }}>
<Tabs.TabPane key="latest" tab="Latest" style={{ height: "100%" }}>
<JobsListOrganism />
</Tabs.TabPane>
<Tabs.TabPane key="search" tab="Search" style={{ height: "100%" }}>
Search
</Tabs.TabPane>
</Tabs>
</Col>
<Col span={18} style={{ height: "100%" }}>
<JobsDetailOrganism />

View File

@@ -41,8 +41,6 @@ export const QUERY_ALL_JOBS_PAGINATED = gql`
id
ins_co_nm
clm_no
clm_total
ro_number
updated_at
}
jobs_aggregate {
@@ -71,6 +69,7 @@ export const QUERY_JOB_BY_PK = gql`
group
v_age
loss_date
close_date
joblines(order_by: { line_no: asc }) {
id
act_price
@@ -123,6 +122,7 @@ export const UPDATE_JOB = gql`
clm_total
ro_number
updated_at
close_date
joblines(order_by: { unq_seq: asc }) {
id
act_price